이 장에서 데이터가 값과 유형으로 구성된다는 점과 파이썬의 기본 데이터 유형들을 배웠다. 유형이 무엇이냐에 따라 데이터에 적용할 수 있는 연산이 달라진다는 것도 여러 번 강조해 설명했다. 데이터 유형이 갖는 의미가 크기 때문에, 어떤 데이터의 유형이 무엇인지 확인하거나 데이터 유형을 다른 것으로 변환하는 것도 자주 필요한 기능이다. 이 장의 마지막 내용으로 그 방법을 알아본다.

4.5.1 데이터 유형 확인하기

데이터 유형을 확인할 때는 type() 함수를 사용한다. 이 함수는 매개변수로 전달된 데이터의 유형을 반환해 준다. 예를 들어, type(1)을 계산하면 <class 'int'>라는 값이 반환된다. 이 결과에서 ‘class’는 반환된 결과가 데이터 유형이라는 뜻이고, 그 안의 ‘int’라는 이름이 중요하다. int는 정수를 뜻하므로 1이 정수임을 알 수 있다. IDLE 대화식 셸에서 바로 다른 데이터들도 확인해보자.

코드 4-33 type() 함수로 데이터의 유형 확인하기

>>> type(10)      # 10    ->  int (정수)
<class 'int'>

>>> type(1.0)     # 1.0   ->  float (부동소수점 수)
<class 'float'>

>>> type(1+2j)    # 1+2j  ->  complex (복소수)
<class 'complex'>

>>> type('?')     # '?'   ->  str (문자열)
<class 'str'>

>>> type(True)    # True  ->  bool (불리언)
<class 'bool'>

>>> type(None)    # None  ->  NoneType (None 유형)
<class 'NoneType'>

위의 예제 코드에서는 데이터 유형을 이미 알고 있는 상태에서 type() 함수를 사용했기 때문에 별로 감흥이 없다. 하지만 그 데이터가 변수에 대입된 값이라면 더 유용하게 사용될 수 있다. 예를 들어 함수에 전달된 매개변수의 유형을 확인해 유형에 따라 다른 방식으로 연산하게 할 수 있다.

각 데이터 유형의 이름(클래스명)이 int, float, complex, str, bool인 것도 살펴보자. 모두 앞에서 데이터 유형을 설명할 때 영어식 표현의 줄임말로 소개한 것들이다. 이 이름들은 데이터를 해당 유형의 데이터로 변환할 때 사용할 함수의 이름이기도 하다.

4.5.2 데이터 유형 변환하기

데이터의 유형을 바꿔야 하는 상황은 어떤 때일까? 여러분은 사용자에게 텍스트를 입력받는 함수 input()을 이용해 본 적이 있다. 그리고 사용자에게 수를 입력받을 때는 int(input()) 명령을 이용해야 한다고 배웠다. 이제 이게 무슨 의미인지 이해할 때가 됐다.

문자열을 수로

input() 함수를 이용해 사용자로부터 수를 입력받아 계산하는 상황을 생각해 보자. 단, input() 함수를 int() 함수로 감싸지 않은 경우다.

코드 4-34 사용자가 입력한 수의 계산: 오류 발생

>>> number = input()  # 사용자에게 텍스트를 입력받아 number 변수에 대입
100

>>> number            # 입력된 수 확인 (따옴표로 감싸져 있다)
'100'

>>> number + 1        # 입력된 수에 + 1 을 계산하면 오류가 발생한다
TypeError: must be str, not int

이번 장을 열심히 공부했다면 위 예제에서 오류가 발생하는 원인을 설명할 수 있을 것이다. number에 대입된 input() 함수의 실행 결과는 100이 아니라 '100'이며, 문자열이다. 문자열은 정수와 덧셈을 할 수가 없으므로, number + 1은 오류다.

이 상황에서 number + 1을 올바르게 계산하려면 number를 정수 유형으로 변환해야 한다. int(input())에서 사용한 것처럼, int() 함수를 사용하면 데이터 유형을 정수로 바꿀 수 있다.

코드 4-35 int() 함수를 이용해 데이터를 정수로 변환

>>> int(number) + 1  # number를 정수로 변환한 후 계산
101

>>> int(1.01)  # 실수를 정수로 변환: 소수점 아래의 수는 사라진다
1

1.01을 정수로 변환한 예에서 보듯이, int() 함수는 텍스트 뿐 아니라 실수를 정수로 변환하는 데도 사용될 수 있다.

만일 사용자로부터 입력받은 수가 정수가 아니라 실수라면, int() 함수 대신 float() 함수를 사용하면 된다.

코드 4-36 float() 함수를 이용해 데이터를 실수로 변환

>>> number = input()  # 사용자에게 텍스트를 입력받음
12.345

>> number             # 문자열 데이터다
'12.345'

>>> int(number)       # 정수로 변환하면 오류가 발생한다
ValueError: invalid literal for int() with base 10: '12.345'

>>> float(number)     # 실수로 변환하면 올바르게 변환된다
1

>>> float(10)         # 정수를 실수로 바꿀 때도 사용
10.0

수를 문자열로

이번에는 반대의 상황으로 문자열에 수를 연결할 때는 생각해 보자. 문자열을 연결할 때는 덧셈 연산자를 사용한다.

코드 4-37 문자열과 수를 덧셈 연산하면 오류가 발생한다

>>> age = 17
>>> '저는 ' + age + '살 입니다.'   # 오류 발생
TypeError: must be str, not int

예제에서 보듯이 문자열은 문자열끼리만 연결할 수 있기 때문에 수와 연결하려 하면 오류가 발생한다. 따라서 수를 문자열로 변환해야 한다. 데이터를 문자열로 변환하는 함수는 str()이다.

코드 4-38 str() 함수를 이용해 데이터를 문자열로 변환

>>> '저는 ' + str(age) + '살 입니다.'
'저는 17살 입니다.'

데이터 유형의 이름은 그 유형으로 변환하는 함수

이쯤되면 규칙성을 느꼈으리라고 생각한다. 데이터 유형의 이름(클래스명)은 데이터를 그 데이터 유형으로 변환하는 함수의 이름과 같다. 엄밀하게 말하면 이 기능은 함수가 아니라 클래스 인스턴스 생성자이지만 지금은 이해하기 어려운 개념이므로 함수라고 생각해도 무방하다.

4장에서 배운 데이터 유형들의 변환 함수를 정리하면 다음과 같다.

  • 정수(integer): int()
  • 실수(floating point number): float()
  • 복소수(complex number): complex()
  • 문자열(string): str()
  • 불리언(boolean): bool()

데이터 유형의 영어 이름과 비교하며 살펴보자. 금세 익힐 수 있을 것이다.

연습문제

연습문제 4-8 데이터 유형 변환 연습

다음 프로그램의 오류를 찾아 수정하라.

number_1 = input()            # 사용자 입력 수 1
number_2 = input()            # 사용자 입력 수 2
result = number_1 + number_2  # 계산
print('결과: ' + result)      # 결과 출력