본문으로 건너뛰기

문자열 메서드

파이썬 목차문자열 다루기레슨 13 / 59

목차

메서드(method)는 값 뒤에 점을 찍고 부르는, 그 값의 종류가 가진 기능입니다. upper()·replace()·strip() 같은 문자열 메서드는 원래 문자열을 바꾸지 않고 새 문자열을 만들어 돌려줍니다.

손님이 친 쿠폰 코드에는 앞뒤 빈칸이 끼거나 소문자가 섞여 있곤 합니다. 쓰기 전에 다듬어야 합니다. 그런데 coupon.strip()만 쓰고 coupon이 다듬어졌다고 생각하면, 다듬지 않은 값을 그대로 쓰게 됩니다. 메서드가 만든 새 값은 이름을 다시 붙여야 남습니다. 이름은 값에 붙은 이름표라는 규칙 3을 문자열 메서드에서 다시 봅니다.

6단계 중 1단계. 1번 줄: 이름 s가 문자열 'cat'에 붙습니다.

1메서드는 새 문자열을 만든다

s.upper()는 s가 가리키는 문자열을 대문자로 적은 새 문자열을 만듭니다. 아래 코드는 무엇을 찍을까요?

s = 'cat'
s.upper()
print(s)
실행 결과 보기
실행 결과
cat

예상과 다르면 그곳이 배울 곳입니다. 2번 줄은 새 문자열 'CAT'을 만들지만 그 값에 아무 이름도 붙이지 않습니다. 이름 s는 그대로 'cat'에 붙어 있습니다(규칙 3).

새 값을 뒤에서 다시 쓰려면 이름을 붙입니다. 이름을 따로 붙이면 원래 값과 새 값이 둘 다 남습니다.

s = 'cat'
big = s.upper()
print(s)
print(big)
print(big.lower())
실행 결과
cat
CAT
cat

lower()는 거꾸로 소문자로 적은 새 문자열을 만듭니다. 메서드 이름 뒤의 괄호는 꼭 씁니다.

문자열은 한 번 만들면 바꿀 수 없는 값입니다. 그래서 문자열 메서드는 원래 문자열을 바꾸지 않고, 바꾼 모양이 필요하면 새 문자열을 만들어 돌려줍니다.

2다시 붙여야 바뀐다: s = s.upper()

같은 이름으로 결과를 쓰고 싶으면, 메서드가 만든 새 값에 그 이름을 다시 붙입니다.

s = 'cat'
s = s.upper()
print(s)
실행 결과
CAT

2번 줄은 오른쪽 s.upper()를 먼저 계산해 새 값 'CAT'을 만들고(규칙 2), 이름 s를 그 값으로 옮겨 붙입니다(규칙 3). 'cat'은 가리키는 이름이 없어집니다. 'cat'이 'CAT'으로 바뀐 것이 아니라, 이름표 s가 새 값으로 옮겨 간 것입니다.

3replace()와 strip()

replace(찾을 글자, 바꿀 글자)⁠는 찾은 곳을 모두 바꾼 새 문자열을, strip()은 맨 앞과 맨 뒤의 빈칸을 뗀 새 문자열을 만듭니다.

phone = '010-1234-5678'
print(phone.replace('-', ''))
text = '  커피 두 잔  '
clean = text.strip()
print('[' + text + ']')
print('[' + clean + ']')
실행 결과
01012345678
[  커피 두 잔  ]
[커피 두 잔]

2번 줄은 '-' 두 개를 모두 빈 문자열로 바꿔 숫자만 남깁니다. 빈칸이 눈에 보이게 앞뒤에 대괄호를 이어 찍었습니다. strip()은 양 끝의 빈칸만 뗍니다. 가운데의 '커피'와 '두' 사이 빈칸은 그대로입니다.

4문자열 한 칸은 바꿀 수 없다

자리 번호로 한 글자를 꺼낼 수는 있지만, 그 자리에 다른 글자를 대입할 수는 없습니다.

s = 'cat'
s[0] = 'b'
실행 결과
Traceback (most recent call last):  File "main.py", line 2, in <module>    s[0] = 'b'    ~^^^TypeError: 'str' object does not support item assignment

맨 아래 줄은 'str(문자열)은 칸에 대입하는 것을 지원하지 않는다'는 뜻입니다. 문자열은 바꿀 수 없는 값이라서입니다. 한 글자를 바꾼 문자열이 필요하면 새 문자열을 만들어 이름을 다시 붙입니다. s = 'b' + s[1:]이면 s는 'bat'에 붙습니다.

예제

손님이 친 쿠폰 코드 ' cf-07 '을 다듬습니다. 빈칸을 떼고, 대문자로 바꾸고, '-'를 지웁니다. 줄마다 메서드가 만든 새 값에 이름 coupon을 다시 붙입니다.

coupon = ' cf-07 '
coupon = coupon.strip()
coupon = coupon.upper()
coupon = coupon.replace('-', '')
print(coupon)
print(len(coupon))
실행 결과
CF07
4

2번 줄에서 'cf-07', 3번 줄에서 'CF-07', 4번 줄에서 'CF07'이 새로 만들어지고, 그때마다 coupon이 새 값으로 옮겨 붙습니다. 처음의 ' cf-07 '은 바뀌지 않았습니다. coupon이 더는 가리키지 않을 뿐입니다.

자주 틀리는 곳

틀린 생각: 메서드를 부르기만 하면 그 문자열이 바뀐다.

s 뒤에 점을 찍어 부르니 s.upper() 한 줄로 s가 대문자가 될 것 같지만, upper()는 새 문자열을 만들 뿐입니다.

s = 'cat'
s.upper()
print(s)
s = s.upper()
print(s)
실행 결과
cat
CAT

2번 줄이 만든 'CAT'에는 아무 이름도 붙지 않아 3번 줄은 그대로 cat을 찍습니다. 4번 줄에서 이름 s를 새 값으로 옮겨 붙인 뒤에야 CAT이 찍힙니다.

맞는 규칙: upper()·replace()·strip() 같은 문자열 메서드는 원래 문자열을 바꾸지 않고 새 문자열을 만들어 돌려줍니다. 그 결과를 뒤에서 쓰려면 s = s.upper()처럼 이름을 새 값에 다시 붙입니다(규칙 3).

틀린 생각: strip()은 가운데 빈칸까지 뗀다.

빈칸을 떼는 메서드라 모든 빈칸이 사라질 것 같지만, strip()은 양 끝만 봅니다.

text = ' 커피 두 잔 '
print('[' + text.strip() + ']')
실행 결과
[커피 두 잔]

앞뒤 빈칸은 떨어지고, '커피'와 '두', '두'와 '잔' 사이 빈칸은 남습니다.

맞는 규칙: strip()은 맨 앞과 맨 뒤의 빈칸만 뗀 새 문자열을 만듭니다. 가운데 빈칸까지 지우려면 replace(' ', '')를 씁니다.

틀린 생각: 자리 번호로 문자열의 한 글자를 바꿀 수 있다.

s[0]으로 첫 글자를 꺼낼 수 있으니 그 자리에 대입도 될 것 같지만, 4절처럼 s[0] = 'b'는 TypeError로 멈춥니다.

맞는 규칙: 문자열은 한 번 만들면 바꿀 수 없는 값이라 한 칸에 대입할 수 없습니다. s = 'b' + s[1:]처럼 바꾼 모양의 새 문자열을 만들어 이름을 다시 붙입니다(규칙 3).

확인 문제

1. 예제의 1번 줄을 coupon = ' ab-12-c '로 바꿨습니다. 무엇이 찍힐까요? 두 줄을 글자 그대로 쓰세요.

coupon = ' ab-12-c '
coupon = coupon.strip()
coupon = coupon.upper()
coupon = coupon.replace('-', '')
print(coupon)
print(len(coupon))
힌트

2~4번 줄을 한 줄씩 따라가며 coupon이 가리키는 값을 적어 보세요.

정답
실행 결과
AB12C
5

'ab-12-c' → 'AB-12-C' → 'AB12C' 차례로 새 값이 만들어지고 coupon이 옮겨 붙습니다. replace()는 '-'를 모두 지웁니다.

흔한 오답은 AB12-C입니다. replace()가 처음 찾은 하나만 바꾼다고 본 것입니다.

2. 다음 코드가 CAT을 찍도록 빈칸을 채우세요.

s = 'cat'
____ s.upper()
print(s)
힌트

3번 줄이 찍을 때 s가 어느 값에 붙어 있는지 1번 줄부터 따라가 보세요.

정답

s =입니다.

s = 'cat'
s = s.upper()
print(s)
실행 결과
CAT

s.upper()가 만든 새 값 'CAT'에 이름 s를 다시 붙입니다.

흔한 오답은 빈칸을 비워 둔 답입니다. s.upper()를 부르기만 해도 s가 바뀐다고 본 것입니다. 그러면 새 값이 버려지고 cat이 찍힙니다.

3. 장보기 목록의 품목을 다듬습니다. 무엇이 찍힐까요? 글자 그대로 쓰세요.

item = ' apple '
item.strip()
item = item.upper()
print('[' + item + ']')
힌트

메서드 줄마다 결과에 이름이 다시 붙는지 보세요. 2번 줄과 3번 줄이 다릅니다.

정답
실행 결과
[ APPLE ]

2번 줄의 strip()이 만든 'apple'에는 아무 이름도 붙지 않아 버려집니다. 3번 줄은 앞뒤 빈칸이 그대로인 ' apple '로 대문자 새 값을 만들고, 그 값에 item을 다시 붙입니다.

흔한 오답은 [APPLE]입니다. 2번 줄만으로 item이 다듬어졌다고 본 것입니다.

아래 예제 코드의 3번 줄에서 앞의 coupon = 를 빼 coupon.upper()만 남기면 찍히는 두 줄을 봅니다.

처음 펼 때 약 6MB를 받습니다.컴퓨터에서 해 보기

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

파이썬 목차로