문자와 정수는 영원히 더할 수 없나요?
파이썬 뿐만 아니라 모든 언어는 변수로 저장된다.
예를 들어
>>> a = "나는 솔로"
라고 한다면 자동으로 str 즉 문자열로 저장된다.
>>> type(a)
<class 'str'>
이런 장난도 해볼 수 있다.
>>> b= 3
>>> b + 3
6
b에 3이라고 입력하면 b를 int 즉 정수라고 입력하게 되고, 자연스럽게 b + 3 은 6이라고 계산한다.
그런데 이 상황에서 바로 a와 b를 더하면 어떻게 될까?
>>> a+b
아래와 같은 TypeError가 발생한다. 파이썬에서 발생하는 가장 흔한 오류 중 하나이다. a(문자열)과 b(정수형)을 더할 수 없기 때문에 발생하는 문제이다.
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
a+b
TypeError: can only concatenate str (not "int") to str
이 경우 b 가 3이라는 정수이니 문자열로 바꿔주는 방법이 있다. 정수형을 문자열로 바꿔주기 위해서는 str함수를 사용한다.
>>> a+str(b)
'나는 솔로3'
이와 같은 문제는 의외로 print할 때 잘 발생한다.
a와 b에 대한 유형(type)이 무엇인지 모르는 상태에서 다음과 같이 명령한다 가정하자.
>>> print(a + b)
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
print(a + b)
TypeError: can only concatenate str (not "int") to str
당연히 오류가 발생한다. 여기서도 마찬가지로 b를 str(b)로 바꿔주는 방식으로 문제를 해결할 수 있을 것이다. 그런데 1부터 9까지 나는 솔로를 추가하고 싶다면? 파이썬 3.6 이상에서는 다음과 같은 문법을 지원한다.
>>> for i in range(1,10):
print(f'나는 솔로 {i}') # 따옴표 앞에 f를 붙이면 {}중괄호 안에 변수를 그대로 넣어도 된다.
나는 솔로 1
나는 솔로 2
나는 솔로 3
나는 솔로 4
나는 솔로 5
나는 솔로 6
나는 솔로 7
나는 솔로 8
나는 솔로 9
이와 같은 문법은 str(i)를 만드는 방법보다 훨씬 직관적이며 편리하다.
재밌는 점은 문자와 정수가 더하기는 안되지만 곱하기는 된다는 점이다.
>>> a*b
'나는 솔로나는 솔로나는 솔로'
곱하기를 하면 a(나는 솔로)가 곱하기 횟수 만큼 더해진다. 그래서 이러한 경우는 타입오류를 일으키지 않는다.
이렇게 파이썬에서 타입오류를 발생시키는 이유는 간단하다. 오류를 일으켜야 로직의 문제점을 드러낼 수 있기 때문이다. 프로그래머가 실수로 정수와 문자를 더하게 만들었다면, 같은 타입으로 만들어 주거나 다른 조치를 취하도록 해주어야 한다. 그렇지 않으면, 오류를 가진 프로그램이 계속 돌아가면서 더 큰 문제를 만들어낼 것이다. 실제로 오류가 어디서 발생하는지 모르는 프로그램을 다룬다는 것은 끔찍하다. 프로그램의 규모가 커지면 커질수록 오류를 발견해내는 것은 점점 더 쉽지 않은 일이기 때문이다.
파이썬(뿐만 아니라) 오류(Error)는 골칫거리이기도 하지만, 내 프로그램이 어떤 논리적 결함을 가지고 있는지 피드백해주는 소중한 존재이기도 하다.
(오류)-(해결)-(오류)-(해결)-(오류)-(해결)
이와 같은 무한루프를 겪다보면 여러분도 어느 새 프로그래밍을 할 수 있는 사람이 되어 있을 것이다.