본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
Ch 6. 문자열과 문자열 조작 명령어에 대해 알아볼까요?
1. 문자열 변수의 정의
문자열은 하나 이상의 문자가 연속적으로 나열된 데이터입니다. 파이썬에서는 작은따옴표(')나 큰따옴표(")로 감싸서 문자열을 정의할 수 있습니다.
# 기본적인 문자열 정의
name = "홍길동"
message = '안녕하세요'
# 여러 줄 문자열 정의 (삼중 따옴표 사용)
long_text = """이것은
여러 줄에 걸친
긴 문자열입니다."""
# 빈 문자열 정의
empty_string = ""
파이썬의 문자열은 불변(immutable) 객체입니다. 이는 한 번 만들어진 문자열 객체의 내용을 직접 바꿀 수 없다는 뜻입니다. 하지만 이 개념을 정확히 이해하려면 변수와 객체의 차이를 명확히 구분해야 합니다.
변수는 이름표와 같고, 객체는 실제 데이터가 저장된 메모리 공간입니다. 변수에 새로운 값을 할당하는 것(a = "새로운값")과 기존 객체의 내용을 직접 수정하는 것(a[0] = "새")은 완전히 다른 개념입니다.
# 변수 재할당 - 이것은 가능합니다
name = "홍길동"
print(f"변수 name이 가리키는 객체의 메모리 주소: {id(name)}")
name = "김철수" # 새로운 문자열 객체가 생성되고, name이 이를 가리킴
print(f"재할당 후 메모리 주소: {id(name)}") # 주소가 바뀝니다!
# 객체 직접 수정 - 이것은 불가능합니다
word = "Python"
try:
word[0] = "J" # 에러! 기존 객체를 직접 수정하려는 시도
except TypeError as e:
print(f"에러 발생: {e}")
이것이 리스트와 다른 점입니다. 리스트는 가변 객체이므로 같은 객체 내에서 내용을 수정할 수 있습니다.
# 리스트는 가변 객체 - 내용 수정이 가능
my_list = ["P", "y", "t", "h", "o", "n"]
original_id = id(my_list)
my_list[0] = "J" # 같은 객체 내에서 내용 수정
print(f"수정 후에도 같은 객체인가? {id(my_list) == original_id}") # True
문자열의 불변성 때문에 문자열 연산은 항상 새로운 객체를 만들어냅니다.
2. 문자열 변수를 따로 다루는 이유
문자열을 다른 데이터 타입과 구분해서 특별히 다루는 이유는 무엇일까요?
2.1 복잡한 데이터 구조
문자열은 단순한 값이 아니라 여러 문자가 순서대로 배열된 시퀀스(sequence) 입니다. 각 문자에는 인덱스가 있고, 이를 통해 개별 문자에 접근할 수 있습니다.
word = "프로그래밍"
print(word[0]) # 출력: 프
print(word[1]) # 출력: 로
print(word[-1]) # 출력: 밍 (음수 인덱스는 뒤에서부터)
2.2 텍스트 처리의 중요성
현대 프로그래밍에서 텍스트 처리는 매우 중요합니다. 사용자 입력 처리, 파일 읽기/쓰기, 웹 크롤링, 데이터 분석 등 거의 모든 영역에서 문자열 조작이 필요합니다.
2.3 다양한 조작 방법
숫자는 주로 산술 연산을 하지만, 문자열은 검색, 치환, 분할, 결합 등 다양한 조작이 가능합니다. 이런 복잡한 연산들을 효율적으로 처리하기 위해 파이썬은 많은 내장 메서드를 제공합니다.
2.4 불변성으로 인한 안전성
문자열의 불변성은 프로그래밍에서 중요한 안전성을 제공합니다. 여러 변수가 같은 문자열을 참조하고 있어도, 한 변수를 통해 "수정"했을 때 다른 변수들에게 영향을 주지 않습니다.
# 문자열의 안전한 공유
original = "Hello"
backup = original # 같은 문자열 객체를 참조
# original을 "수정"해도 backup에는 영향 없음
original = original + " World" # 새로운 객체 생성 후 재할당
print(f"original: {original}") # Hello World
print(f"backup: {backup}") # Hello (변경되지 않음)
print(f"서로 다른 객체인가? {original is not backup}") # True
3. 문자열 변수를 확인하는 법
문자열인지 확인하는 방법과 문자열의 속성을 알아보는 방법들을 살펴보겠습니다.
3.1 타입 확인
type(변수명)
text = "안녕하세요"
# type() 함수로 타입 확인
print(type(text)) # 출력: <class 'str'>
# isinstance() 함수로 문자열 여부 확인
print(isinstance(text, str)) # 출력: True
# 더 간단한 방법
print(text.__class__.__name__) # 출력: str
3.2 문자열 속성 확인
text = "Hello Python"
# 문자열 길이
print(len(text)) # 출력: 12
# 문자열이 비어있는지 확인
empty = ""
print(bool(empty)) # 출력: False (빈 문자열은 False)
print(bool(text)) # 출력: True (내용이 있으면 True)
# 문자열 내용 확인 메서드들
print(text.isalpha()) # 출력: False (공백 때문에)
print(text.isdigit()) # 출력: False
print(text.islower()) # 출력: False
print(text.isupper()) # 출력: False
print("123".isdigit()) # 출력: True
4. 문자열 변수에 연산자 사용 예제
문자열에도 여러 연산자를 사용할 수 있습니다. 숫자와는 다른 의미를 가지므로 주의깊게 살펴보겠습니다.
4.1 연결 연산자 (+)
문자열 연결은 새로운 문자열 객체를 생성하는 대표적인 예입니다. 이 과정에서 원본 문자열들은 전혀 변경되지 않습니다.
first_name = "홍"
last_name = "길동"
# 문자열 연결 - 새로운 객체가 생성됨
full_name = first_name + last_name
print(f"연결 결과: {full_name}") # 홍길동
print(f"원본 first_name: {first_name}") # 여전히 "홍"
# 메모리 주소 확인으로 새 객체 생성 확인
print(f"first_name 주소: {id(first_name)}")
print(f"full_name 주소: {id(full_name)}") # 완전히 다른 주소
# 여러 문자열 연결
greeting = "안녕하세요, " + "제 이름은 " + full_name + "입니다."
print(greeting) # 안녕하세요, 제 이름은 홍길동입니다.
# 주의: 많은 문자열을 연결할 때는 join()이 더 효율적
parts = ["안녕하세요", "제 이름은", full_name, "입니다"]
efficient_greeting = " ".join(parts) # 더 효율적인 방법
4.2 반복 연산자 (*)
# 문자열 반복
line = "-" * 20
print(line) # 출력: --------------------
# 패턴 만들기
pattern = "♥♡" * 5
print(pattern) # 출력: ♥♡♥♡♥♡♥♡♥♡
# 실용적인 예: 구분선 만들기
separator = "=" * 50
print(separator)
print("중요한 내용")
print(separator)
4.3 비교 연산자 > < ==
# 문자열 비교 (사전순 비교)
print("apple" < "banana") # 출력: True
print("cat" > "dog") # 출력: False
# 같은지 확인
password = "secret123"
user_input = "secret123"
print(password == user_input) # 출력: True
# 한글도 비교 가능 (유니코드 순서)
print("가" < "나") # 출력: True
4.4 멤버십 연산자 (in, not in)
text = "파이썬 프로그래밍"
# 부분 문자열 포함 확인
print("파이썬" in text) # 출력: True
print("자바" in text) # 출력: False
print("자바" not in text) # 출력: True
# 실용적인 예: 이메일 형식 간단 확인
email = "user@example.com"
if "@" in email and "." in email:
print("이메일 형식이 올바른 것 같습니다.")
5. 문자열 배열과 슬라이싱
문자열은 문자들의 시퀀스이므로, 배열처럼 인덱스를 사용해서 접근할 수 있습니다.
5.1 인덱싱
text = "Python"
# 양수 인덱스 (0부터 시작)
print(text[0]) # 출력: P
print(text[1]) # 출력: y
print(text[2]) # 출력: t
# 음수 인덱스 (뒤에서부터 -1부터 시작)
print(text[-1]) # 출력: n
print(text[-2]) # 출력: o
print(text[-3]) # 출력: h
5.2 슬라이싱
슬라이싱은 문자열의 일부분을 추출하는 강력한 기능입니다.
text = "Hello Python Programming"
# 기본 슬라이싱 [시작:끝]
print(text[0:5]) # 출력: Hello
print(text[6:12]) # 출력: Python
# 시작이나 끝 생략
print(text[:5]) # 출력: Hello (처음부터 5번째 전까지)
print(text[6:]) # 출력: Python Programming (6번째부터 끝까지)
print(text[:]) # 출력: Hello Python Programming (전체)
# 음수 인덱스 사용
print(text[-11:]) # 출력: Programming (뒤에서 11번째부터 끝까지)
# 스텝 지정 [시작:끝:스텝]
print(text[::2]) # 출력: HloPto rgamn (2칸씩 건너뛰기)
print(text[::-1]) # 출력: gnimmargorP nohtyP olleH (역순)
5.3 문자열 순회
text = "Python"
# for 루프로 각 문자 접근
for char in text:
print(char)
# 인덱스와 함께 접근
for i, char in enumerate(text):
print(f"인덱스 {i}: {char}")
# 실용적인 예: 문자 개수 세기
vowels = "aeiou"
count = 0
for char in text.lower():
if char in vowels:
count += 1
print(f"모음의 개수: {count}")
6. 문자열 메서드 및 예제
파이썬은 문자열 처리를 위한 다양한 내장 메서드를 제공합니다. 실무에서 자주 사용되는 메서드들을 카테고리별로 알아보겠습니다.
6.1 대소문자 변환
text = "Hello Python Programming"
# 대문자로 변환
print(text.upper()) # 출력: HELLO PYTHON PROGRAMMING
# 소문자로 변환
print(text.lower()) # 출력: hello python programming
# 첫 글자만 대문자
print(text.capitalize()) # 출력: Hello python programming
# 각 단어의 첫 글자를 대문자로
print(text.title()) # 출력: Hello Python Programming
# 대소문자 바꾸기
print(text.swapcase()) # 출력: hELLO pYTHON pROGRAMMING
# 실용적인 예: 사용자 이름 정리
user_name = " jOhN dOe "
clean_name = user_name.strip().title()
print(clean_name) # 출력: John Doe
6.2 공백 제거
text = " Hello Python "
# 양쪽 공백 제거
print(f"'{text.strip()}'") # 출력: 'Hello Python'
# 왼쪽 공백만 제거
print(f"'{text.lstrip()}'") # 출력: 'Hello Python '
# 오른쪽 공백만 제거
print(f"'{text.rstrip()}'") # 출력: ' Hello Python'
# 특정 문자 제거
messy_text = "...Hello Python!!!"
print(messy_text.strip(".!")) # 출력: Hello Python
# 실용적인 예: 파일 경로 정리
file_path = "/home/user/documents/file.txt///"
clean_path = file_path.rstrip("/")
print(clean_path) # 출력: /home/user/documents/file.txt
6.3 문자열 검색
text = "Python is awesome. Python is powerful."
# 문자열 찾기
print(text.find("Python")) # 출력: 0 (첫 번째 위치)
print(text.find("Java")) # 출력: -1 (없음)
print(text.rfind("Python")) # 출력: 19 (마지막 위치)
# 문자열 개수 세기
print(text.count("Python")) # 출력: 2
print(text.count("is")) # 출력: 2
# 시작/끝 확인
print(text.startswith("Python")) # 출력: True
print(text.endswith("powerful."))# 출력: True
# 실용적인 예: 파일 확장자 확인
filename = "document.pdf"
if filename.endswith(('.pdf', '.doc', '.docx')):
print("문서 파일입니다.")
6.4 문자열 분할과 결합
# 문자열 분할
text = "apple,banana,cherry,date"
fruits = text.split(",")
print(fruits) # 출력: ['apple', 'banana', 'cherry', 'date']
# 최대 분할 횟수 지정
text2 = "one-two-three-four"
parts = text2.split("-", 2)
print(parts) # 출력: ['one', 'two', 'three-four']
# 줄 단위로 분할
multiline = "첫 번째 줄\n두 번째 줄\n세 번째 줄"
lines = multiline.splitlines()
print(lines) # 출력: ['첫 번째 줄', '두 번째 줄', '세 번째 줄']
# 문자열 결합
words = ['Hello', 'Python', 'World']
sentence = " ".join(words)
print(sentence) # 출력: Hello Python World
# 실용적인 예: CSV 데이터 처리
csv_line = "홍길동,25,서울,개발자"
person_data = csv_line.split(",")
print(f"이름: {person_data[0]}, 나이: {person_data[1]}")
6.5 문자열 치환
text = "I love Java programming. Java is great!"
# 문자열 치환
new_text = text.replace("Java", "Python")
print(new_text) # 출력: I love Python programming. Python is great!
# 치환 횟수 제한
limited_replace = text.replace("Java", "Python", 1)
print(limited_replace) # 출력: I love Python programming. Java is great!
# 실용적인 예: 민감한 정보 가리기
personal_info = "제 전화번호는 010-1234-5678입니다."
hidden_info = personal_info.replace("010-1234-5678", "***-****-****")
print(hidden_info) # 출력: 제 전화번호는 ***-****-****입니다.
# 여러 문자 치환
messy_text = "Hello...World!!!"
clean_text = messy_text.replace("...", " ").replace("!!!", "!")
print(clean_text) # 출력: Hello World!
7. 문자열 포맷팅
문자열 포맷팅은 동적으로 문자열을 만들 때 사용하는 중요한 기능입니다. 파이썬에서는 여러 가지 방법을 제공합니다.
7.1 f-문자열 (f-string) - 권장 방법
Python 3.6부터 도입된 f-문자열은 가장 직관적이고 효율적인 방법입니다.
name = "홍길동"
age = 25
height = 175.5
# 기본 사용법
greeting = f"안녕하세요, 제 이름은 {name}이고 {age}살입니다."
print(greeting)
# 표현식 사용
info = f"{name}님의 내년 나이는 {age + 1}살입니다."
print(info)
# 포맷 지정자 사용
price = 1234.567
print(f"가격: {price:.2f}원") # 출력: 가격: 1234.57원
print(f"가격: {price:,.0f}원") # 출력: 가격: 1,235원
# 날짜 포맷팅
from datetime import datetime
now = datetime.now()
print(f"현재 시간: {now:%Y-%m-%d %H:%M:%S}")
# 정렬
print(f"{'왼쪽':<10}|") # 출력: 왼쪽 |
print(f"{'가운데':^10}|") # 출력: 가운데 |
print(f"{'오른쪽':>10}|") # 출력: 오른쪽|
7.2 format() 메서드
name = "김철수"
age = 30
score = 95.7
# 기본 사용법
text1 = "이름: {}, 나이: {}".format(name, age)
print(text1)
# 인덱스 지정
text2 = "이름: {0}, 나이: {1}, 다시 이름: {0}".format(name, age)
print(text2)
# 키워드 인수
text3 = "이름: {name}, 나이: {age}".format(name=name, age=age)
print(text3)
# 포맷 지정
text4 = "점수: {:.1f}점".format(score)
print(text4) # 출력: 점수: 95.7점
# 딕셔너리 사용
person = {"name": "박영희", "age": 28}
text5 = "이름: {name}, 나이: {age}".format(**person)
print(text5)
7.3 % 포맷팅 (레거시 방법)
name = "이순신"
age = 45
# 기본 사용법
text = "이름: %s, 나이: %d" % (name, age)
print(text)
# 딕셔너리 사용
text2 = "이름: %(name)s, 나이: %(age)d" % {"name": name, "age": age}
print(text2)
# 포맷 지정
pi = 3.14159
print("원주율: %.2f" % pi) # 출력: 원주율: 3.14
오늘의 실습
https://fastcampus.info/4n8ztzq
(~6/20) 50일의 기적 AI 환급반💫 | 패스트캠퍼스
초간단 미션! 하루 20분 공부하고 수강료 전액 환급에 AI 스킬 장착까지!
fastcampus.co.kr