2.14 파이썬의 자료형

자료형

지금까지 우리는 변수에 숫자, 문자열, 리스트 등의 값을 마음대로 넣어서 사용해 왔다. 그러나 프로그램이 실행되려면 컴퓨터는 각 변수에 어떤 종류의 값이 들어가 있는지 알아야 한다. 값이 숫자인가 문자열인가 등에 따라 값을 저장하는 방식이나 계산하는 방법이 다르기 때문이다. 이러한 값의 종류를 자료형(data type) 혹은 타입(type)이라고 한다. 예를 들어 정수인 1과 문자열인 “1”이 컴퓨터에 저장될 때 어느 정도의 메모리를 차지하는지 알아보면 두 값의 저장 방식이 다르다는 것을 알 수 있다.

파이썬에서 변수의 메모리 크기를 알기 위해서는 sys 패키지의 getsizeof 명령을 사용한다.

from sys import getsizeof
a = 1
getsizeof(a)
28
b = "1"
getsizeof(b)
50

파이썬의 자료형

파이썬에서 사용할 수 있는 자료형 중 많이 사용하는 것은 다음과 같다.

  • NoneType

  • bool

  • int

  • float

  • complex

  • str

  • tuple

  • list

  • dict

  • function

변수나 값의 자료형을 알아보려면 type 명령을 사용하면 된다. None 타입은 변수가 비어있음을 표시할 때 사용한다.

type(None)
NoneType
type(True)
bool
type(1)
int
type(3.14)
float

복소수를 사용할 때는 허수부 숫자 뒤에 j문자를 붙인다.

type(2 + 3j)
complex
type("abc")
str
type((1, 2, 3))
tuple
type([1, 2, 3])
list
type({"A": 10, "B": 20, "C": 30})
dict

파이썬에서는 함수도 독자적인 자료형을 가진다. 파이썬에서 함수의 자료형 이름은 function 이다.

def f():
    return 1


type(f)
function

자료형과 클래스

파이썬에서 자료형과 클래스는 같은 의미라고 봐도 무방하다. 클래스를 알고 싶으면 __class__ 속성을 살펴본다.

a = 1
type(a)
int
a.__class__
int
b = [1, 2, 3]
type(b)
list
b.__class__
list
class C(object):
    pass


c = C()

위 코드에서 pass 키워드는 아무런 일도 하지 않는 들여쓰기 블럭을 만들기 위한 것이다.

type(c)
__main__.C
c.__class__
__main__.C

클래스 이름앞의 __main__은 클래스가 정의된 모듈(module) 즉 파일의 이름이다. REPL 환경에서 입력하는 코드는 __main__ 으로 가정한다.

자료형 변환

자료형을 바꾸기 위해서는 자료형 클래스 생성자를 이용한다. 예를 들어 정수를 문자열로 바꿀 때는 str, 문자열을 정수로 바꿀 때는 int를 사용한다.

str(20201012)
'20201012'
int("20201012")
20201012

연습 문제 2.14.1

오늘 날짜를 나타내는 문자열과 생일을 나타내는 문자열이 다음과 같을 때 만 나이를 구하라. (힌트: 숫자로 바꾼 뒤 빼기 연산을 한다.)

today = "2020-10-25"
birthday = "2020-11-21"

불변형 자료형과 변형 자료형

파이썬의 자료형에는 불변형(immutable) 자료형과 변형(mutable) 자료형이 있다.

  • 정수, 실수, 문자열, 튜플은 불변형 자료형이다.

  • 리스트, 딕셔너리는 변형 자료형이다.

불변형 자료형은 데이터 값을 바꿀 때 메모리에 저장된 데이터 전체를 모두 없애고 새로 만들지만 변형 자료형은 할당된 메모리를 그냥 놔두고 메모리에 씌여있는 내용(값)만 바꾼다.

예를 들어 x라는 변수에 1이라는 정수를 입력하는 경우를 생각하자.

x = 1

위와 같은 코드를 실행하면 이름공간(name space)에 x라는 변수 이름이 생기고 메모리의 특정 위치에 1이라는 값이 씌여진다. 씌여진 메모리 위치(주소)를 알기 위해서는 id 명령을 사용한다.

id(x)
140709685770016
../_images/02.14 파이썬의 자료형_51_0.png

이 상태에서 변수 x의 값을 2로 바꾸면 메모리상의 해당 위치의 값이 2로 바뀌는 것이 아니라 메모리의 다른 위치에 2가 씌여지고 x는 새로운 위치를 가리키게 된다.

x = 2
id(x)
140709685770048
../_images/02.14 파이썬의 자료형_55_0.png

이번에는 리스트 즉, 변형 자료형의 경우를 살펴보자. 다음과 같이 실행하면 변수 x는 리스트 변형 자료형을 가리키고 리슽 변형 자료형의 첫번째 원소는 불변형 자료형인 정수 1을 가리킨다.

x = [1]
id(x)
3034340425472
id(x[0])
140709685770016
../_images/02.14 파이썬의 자료형_60_0.png

리스트 변수 x의 내용을 바꾸면 리스트 자체의 메모리가 파괴되지 않고 리스트가 가리키는 불변형 자료형만 바뀐다.

x[0] = 2
id(x)
3034340425472
id(x[0])
140709685770048
../_images/02.14 파이썬의 자료형_65_0.png

리스트와 사용법이 거의 같지만 불변형 자료형인 튜플의 경우에는 이렇게 원소가 가리키는 내용만 바꿀 수 없다.

x = (1,)
id(x)
3034340887328
id(x[0])
140709685770016
../_images/02.14 파이썬의 자료형_70_0.png
x[0] = 2
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-42-ebac946b3580> in <module>
----> 1 x[0] = 2

TypeError: 'tuple' object does not support item assignment

튜플의 내용을 바꾸러면 튜플 전체를 파괴하고 다시 만들어야 한다.

x = (2,)
id(x)
3034338007216
id(x[0])
140709685770048
../_images/02.14 파이썬의 자료형_76_0.png