메서드(method)는 값 뒤에 점을 찍고 부르는, 그 값의 종류가 가진 기능입니다. upper()·replace()·strip() 같은 문자열 메서드는 원래 문자열을 바꾸지 않고 새 문자열을 만들어 돌려줍니다.
손님이 친 쿠폰 코드에는 앞뒤 빈칸이 끼거나 소문자가 섞여 있곤 합니다. 쓰기 전에 다듬어야 합니다.
그런데 coupon.strip()만 쓰고 coupon이 다듬어졌다고 생각하면, 다듬지 않은 값을 그대로 쓰게 됩니다. 메서드가 만든 새 값은 이름을 다시 붙여야 남습니다.
이름은 값에 붙은 이름표라는 규칙 3을 문자열 메서드에서 다시 봅니다.
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
catlower()는 거꾸로 소문자로 적은 새 문자열을 만듭니다. 메서드 이름 뒤의 괄호는 꼭 씁니다.
문자열은 한 번 만들면 바꿀 수 없는 값입니다. 그래서 문자열 메서드는 원래 문자열을 바꾸지 않고, 바꾼 모양이 필요하면 새 문자열을 만들어 돌려줍니다.
2다시 붙여야 바뀐다: s = s.upper()
같은 이름으로 결과를 쓰고 싶으면, 메서드가 만든 새 값에 그 이름을 다시 붙입니다.
s = 'cat'
s = s.upper()
print(s)
CAT2번 줄은 오른쪽 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
42번 줄에서 '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
CAT2번 줄이 만든 '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)CATs.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를 받습니다.컴퓨터에서 해 보기
파이썬 3.14. Tab을 누르면 다음 단추나 칸으로 갑니다. 들여쓰기는 빈칸 네 개입니다. Enter는 앞줄 들여쓰기를 잇고, 콜론 뒤에서는 한 단계 더 들여 씁니다. Ctrl+Enter로 실행합니다.
'실행'을 누르면 여기에 나옵니다.
여기서 쓴 코드 · 내 예상은 저장하지도 운영자에게 보내지도 않습니다. 페이지를 새로 열면 처음 코드입니다.