본문으로 건너뛰기

수와 글자

파이썬 목차수와 글자레슨 7 / 59

목차

파이썬의 값에는 종류가 있습니다. 3은 정수, 3.5는 실수, 따옴표로 감싼 '3'은 문자열(글자)입니다. 같은 +도 값의 종류에 따라 더하기가 되기도 하고 이어 붙이기가 되기도 합니다.

화면에 찍힌 3만 봐서는 수인지 글자인지 알 수 없습니다. print가 문자열의 따옴표를 찍지 않기 때문입니다. 종류를 놓치면 4000원짜리 두 잔 값이 8000이 아니라 40004000으로 찍히거나, 프로그램이 오류로 멈춥니다. 앞 단원에서 =의 오른쪽이 값 하나로 계산된다고 배웠습니다. 이 레슨은 그 값이 어떤 종류인지, 종류가 계산을 어떻게 바꾸는지 봅니다.

이 단원(수와 글자)을 이미 안다면 단원 연습 문제부터 풀고 틀린 레슨만 보세요.

6단계 중 1단계. 1번 줄: 따옴표 안의 '3'과 '4'는 글자입니다. 글자끼리 +는 이어 붙이기라 '34'가 되고, 이름 a가 그 값에 붙습니다.

1값의 세 종류: 정수·실수·문자열

파이썬은 값마다 종류를 붙여 둡니다. 먼저 쓰는 종류는 셋입니다.

종류파이썬 이름값의 예알아보는 법
정수int3·4000·-7소수점이 없는 수
실수float3.5·0.1·3.0소수점이 있는 수
문자열str'3'·'커피'따옴표로 감싼 글자

따옴표 안에 숫자만 있어도 문자열입니다. '3'은 수 3이 아니라 글자 3 한 개입니다. 작은따옴표 대신 큰따옴표로 감싼 "3"도 같은 문자열입니다. 이 과목은 작은따옴표를 씁니다. 3.0은 크기는 3과 같지만 소수점이 있어 실수입니다.

종류는 이름이 아니라 값이 가진 것입니다. x = '3'은 이름 x를 문자열 값 '3'에 붙입니다. 앞 단원 그림에서 값 칸 위에 적혀 있던 int가 이 종류 이름입니다. 문자열 값이면 그 자리에 str이 적힙니다. 위 그림의 표처럼 값을 적을 때는 문자열에 따옴표를 붙여 수와 가릅니다.

2type()으로 종류 확인하기

화면에 찍힌 글자만으로는 종류를 알 수 없습니다. 종류가 궁금하면 type()에 값을 넣어 찍어 봅니다.

print(3)
print('3')
print(type(3))
print(type('3'))
print(type(3.5))
실행 결과
3
3
<class 'int'>
<class 'str'>
<class 'float'>

1번 줄과 2번 줄은 똑같이 3을 찍지만, 하나는 수이고 하나는 글자입니다. type(3)은 3의 종류를 알아내고, print가 그 종류를 <class 'int'>로 찍습니다. '이 값의 종류는 int(정수)'라는 뜻입니다.

3종류가 계산을 정한다

=는 오른쪽을 먼저 계산해 값 하나를 만들고 이름을 붙입니다(규칙 2). 이때 파이썬은 값의 종류를 보고 할 일을 고릅니다. 그림의 코드를 오류가 나는 마지막 줄만 빼고 다시 보면 이렇습니다.

a = '3' + '4'
b = 3 + 4
c = '3' * 3
print(a, b, c)
실행 결과
34 7 333

같은 기호가 종류에 따라 다른 일을 합니다.

식값종류하는 일
3 + 47int더하기
'3' + '4''34'str이어 붙이기
3 * 39int곱하기
'3' * 3'333'str세 번 이어 붙이기(되풀이)

카페 계산에서 이 차이가 드러납니다. 가격을 따옴표로 감싸 두고 두 잔 값을 찍으면 무엇이 찍힐까요?

price = '4000'
print(price * 2)
실행 결과 보기
실행 결과
40004000

예상과 다르면 그곳이 배울 곳입니다. price가 붙은 값은 따옴표로 감싼 문자열 '4000'이라, * 2는 곱하기가 아니라 두 번 이어 붙이기입니다. 수로 계산하려면 따옴표 없이 price = 4000으로 씁니다.

4글자와 수를 섞으면: TypeError

글자와 수를 +로 이으려 하면 파이썬은 계산하지 못하고 멈춥니다.

a = '34'
b = 7
print(a + b)
실행 결과
Traceback (most recent call last):  File "main.py", line 3, in <module>    print(a + b)          ~~^~~TypeError: can only concatenate str (not "int") to str

오류 메시지는 맨 아래 줄부터 읽습니다. TypeError는 값의 종류가 맞지 않는다는 오류이고, 설명은 '문자열(str)에는 문자열만 이을 수 있다, int는 안 된다'는 뜻입니다. 그 위의 line 3과 ^ 표시는 3번 줄의 +에서 멈췄다고 알려 줍니다. 3번 줄에 쓰인 이름 a는 글자에, b는 수에 붙어 있습니다.

고치려면 두 값의 종류를 맞춥니다. 글자로 이으려면 둘 다 글자로('34' + '7'은 '347'), 수로 더하려면 둘 다 수로(34 + 7은 41) 씁니다. 값을 다른 종류의 새 값으로 만들어 주는 str()·int()는 이 단원의 '문자열 잇기와 되풀이'와 '입력은 늘 글자' 레슨에서 배웁니다.

수를 앞에 두면 맨 아래 줄의 설명이 달라지지만 뜻은 같습니다. + 양쪽의 종류가 맞지 않는다는 것입니다.

식오류 메시지 맨 아래 줄
'3' + 4TypeError: can only concatenate str (not "int") to str
3 + '4'TypeError: unsupported operand type(s) for +: 'int' and 'str'

예제

카페 주문 한 줄을 찍습니다. 메뉴 이름은 글자, 잔 수와 가격은 수입니다.

item = '커피'
price = 4000
count = 2
total = price * count
print(item, count, total)
print(type(item), type(total))
실행 결과
커피 2 8000
<class 'str'> <class 'int'>

계산은 수끼리만 합니다. 4번 줄의 price * count는 4000 곱하기 2라 8000이고, 이름 total이 그 값에 붙습니다. 5번 줄처럼 print에 쉼표로 값을 넘기면 종류가 섞여도 빈칸을 끼워 차례로 찍습니다. +로 잇지 않았으니 오류가 나지 않습니다.

자주 틀리는 곳

틀린 생각: 따옴표로 감싸도 숫자만 있으면 수로 계산된다.

안에 든 것이 숫자뿐이라 수처럼 보이지만, 따옴표로 감싼 값은 글자(문자열)입니다.

print('3' * 3)
print(3 * 3)
실행 결과
333
9

1번 줄의 '3'은 글자라 * 3이 세 번 이어 붙이기가 되고, 2번 줄의 3은 수라 곱하기가 됩니다.

맞는 규칙: 파이썬은 값의 종류를 보고 할 일을 고르는데, 따옴표로 감싼 값은 숫자만 있어도 문자열입니다. 수로 계산하려면 따옴표 없이 씁니다.

틀린 생각: 화면에 같게 찍힌 두 값은 종류도 같다.

print는 문자열의 따옴표를 찍지 않아 글자 7과 수 7이 똑같아 보입니다. 그래도 두 값의 종류는 다릅니다.

print('7', 7)
print(type('7'), type(7))
실행 결과
7 7
<class 'str'> <class 'int'>

1번 줄은 7을 두 번 찍었지만, 2번 줄의 type()은 앞의 7이 str, 뒤의 7이 int라고 알려 줍니다.

맞는 규칙: 종류는 화면의 글자가 아니라 값이 가진 것이라, 찍힌 모양으로는 가릴 수 없습니다. 종류가 궁금하면 type()으로 찍어 봅니다.

틀린 생각: 글자와 수를 +로 이으면 파이썬이 종류를 알아서 맞춰 준다.

사람은 '잔 수: '와 2를 이으면 '잔 수: 2'로 읽지만, 파이썬은 글자와 수를 +로 잇지 못하고 멈춥니다.

label = '잔 수: '
count = 2
print(label + count)
실행 결과
Traceback (most recent call last):  File "main.py", line 3, in <module>    print(label + count)          ~~~~~~^~~~~~~TypeError: can only concatenate str (not "int") to str

맨 아래 줄은 4절에서 본 TypeError입니다. 3번 줄에서 글자에 붙은 label과 수에 붙은 count를 +로 이으려다 멈췄습니다.

맞는 규칙: +는 글자끼리는 잇고 수끼리는 더할 뿐, 글자와 수를 섞으면 TypeError로 멈춥니다. 함께 찍으려면 + 대신 쉼표로 넘기거나, 뒤에서 배울 str()로 수를 적은 새 문자열을 만들어 잇습니다.

확인 문제

1. 예제의 1번 줄을 item = 4000으로 바꿨습니다. 무엇이 찍힐까요? 두 줄을 글자 그대로 쓰세요.

item = 4000
price = 4000
count = 2
total = price * count
print(item, count, total)
print(type(item), type(total))
힌트

item이 붙은 값에 따옴표가 있는지 보세요.

정답
실행 결과
4000 2 8000
<class 'int'> <class 'int'>

이름이 item이어도 붙은 값은 따옴표 없는 4000, 곧 정수라 <class 'int'>입니다.

흔한 오답은 둘째 줄 첫 칸의 <class 'str'>입니다. 이름이 메뉴처럼 보여 글자라고 본 것입니다. 컴퓨터는 이름의 뜻을 모르고 쓴 대로만 합니다(규칙 6).

2. 다음 코드가 33과 34를 두 줄로 찍도록 빈칸에 들어갈 값을 쓰세요.

x = ____
print(x * 2)
print(x + '4')
힌트

3번 줄에서 x에 글자 '4'를 +로 잇습니다. x가 어떤 종류여야 멈추지 않을까요?

정답

'3'입니다. 큰따옴표 "3"이나 뒤에서 배울 str(3)처럼 글자 '3'을 만드는 것도 맞습니다.

x = '3'
print(x * 2)
print(x + '4')
실행 결과
33
34

x가 글자여야 * 2가 두 번 이어 붙이기가 되고, + '4'가 잇기가 됩니다.

흔한 오답은 따옴표 없는 3입니다. 수 3도 글자처럼 이어 붙는다고 본 것입니다(문자열과 수를 가리지 않는 생각). 그러면 2번 줄은 6을 찍고, 3번 줄은 수와 글자를 섞어 TypeError로 멈춥니다.

3. 장보기 계산입니다. 무엇이 찍힐까요? 글자 그대로 쓰세요.

apple = '2'
pear = 3
print(apple * pear)
print(pear * 2)
힌트

곱하는 두 값의 종류를 먼저 가르세요. apple이 붙은 값에는 따옴표가 있습니다.

정답
실행 결과
222
6

3번 줄은 글자 '2'에 정수 3을 곱해 '2'를 세 번 이어 붙입니다. 4번 줄은 수끼리 곱해 6입니다.

흔한 오답은 첫 줄의 6입니다. 따옴표 안의 2도 수라고 본 것입니다(문자열과 수를 가리지 않는 생각).

아래 3절 코드의 4번 줄을 print(a + c)로 바꾸면 찍히는 것을 봅니다.

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

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

파이썬 목차로