자료형

파이썬은 어떤 자료형들을 가지고 있는지, 파이썬의 자료형들은 어떤 특징을 가지고 있는지 알아보았다.

파이썬 자료형


파이썬의 자료형 중 주요 자료형 중심으로 살펴보았다.

숫자

int (정수)

파이썬에서는 숫자 정수형으로 int만을 제공한다. 'int보다 큰 값은 어떤 자료형에 보관해야 하는가?'라는 생각이 들었을 것이다. 파이썬 2까지는 int와 long을 제공했다. int는 C 스타일의 고정 정밀도 정수형이었고, long은 임의 정밀도 정수형이었다. PEP 237을 통해 버전 2.4부터는 int가 충분하지 않으면 long 타입으로 자동 변경되는 구조가 되었고 덕분에 C와 달리 overflow문제가 발생하지 않게 되었다. 버전 3부터는 아예 int 단일 형으로 통합되었고 int는 임의 정밀도를 지원하며 더 이상의 파이썬에서 고정 정밀도 정수형은 지원하지 않게 되었다.

bool (불리언)

bool은 엄밀히 따지면 논리 자료형인데 파이썬에서는 내부적으로 1과 0으로 처리되는 int의 서브 클래스다. int는 object의 하위 클래스이기도 하기 때문에 결국은 다음과 같은 구조를 띈다.
object > int > bool
논리 자료형의 값인 True와 정수형의 값인 1을 비교해보면 다음과 같다.

True == 1 # True 반환
False == 0 # True 반환

위와 같이 비교연산자 ==를 통해 논리 자료형이 내부적으로 정수값을 갖고 있다는 것을 확인할 수 있다.

임의 정밀도

임의 정밀도 정수형이란 쉽게 말해 무제한 자릿수를 제공하는 정수형이다. 정수를 숫자의 배열로 간주하여 자릿수 단위로 쪼개 배열 형태로 표현한다. 이러한 방식을 이용하면 아무리 큰 수여도 처리할 수 있게 된다.

당연히 숫자를 임의 정밀도로 처리하면 계산 속도가 저하된다. 그러나 숫자를 단일형으로 처리할 수 있어 언어를 매우 단순한 구조로 만들 수 있게 되고 언어를 사용하는 입장에서도 overflow 고려를 하지 않아도 되기 때문에 잘못된 계산 오류를 방지할 수 있게 된다. 기능과 안전을 위해 속도를 포기한 형태이다.

매핑 (Mapping)

매핑 타입은 키와 자료형으로 구성된 복합 자료형으로 파이썬에는 유일하게 딕셔너리만 매핑 자료형으로 존재한다. 딕셔너리에 대해서는 추후에 리스트와 함께 다시 한번 정리할 예정이다.

집합형

집합 자료형인 set은 중복된 값을 갖지 않는 자료형이다. 파이썬에서 빈 집합 자료형은 다음과 같이 선언한다.

a = set()

값이 포함된 경우에는 다음과 같이 선언한다.

a = {1, 2, 3}

집합은 딕셔너리와 동일하게 중괄호를 사용하므로 유의해야 한다. 딕셔너리는 키/값을 같는 형태이지만 집합은 값만 가지므로 선언 형태를 통해 쉽게 구분할 수 있다.

set은 입력 순서가 유지되지 않고, 중복된 값이 들어갈 경우 하나의 값만 유지한다. 필자는 중복이 제거된 리스트를 얻기 위해 set을 사용한 경우가 많았다.

시퀀스 (sequence)

시퀀스는 어떤 특정 대상의 순서 있는 나열을 뜻한다. 시퀀스는 불변과 가변으로 구분하는데 말 그대로 불변은 값을 변경할 수 없는 자료형이고, 가변은 값을 변경할 수 있는 자료형이다. 불변 시퀀스에는 문자열(str), 튜플(tuple), 바이트(byte)가 해당되고, 가변 시퀀스에는 리스트(list)가 해당된다.

str의 경우 변경할 수 있다는 생각을 가질 수 있다.

a = 'abc'
id('abc') # 4317530408
id(a) # 4317530408
a = 'def'
id('def') # 4318831648
id(a) # 4318831648

위의 코드를 보면 문자열 a가 abc로 할당했다가 def로 할당된 것을 볼 수 있다. 이 부분은 문자열 abc가 def로 변경된 것이 아니라 a가 문자열 def를 다시 참조한 것이다. 결과적으로 abc와 def는 변경되지 않았다. 이를 증명하기 위해 주소를 보여주도록 코드를 작성하였고 위와 같이 abc의 주소가 a에 할당되었다가 def의 주소가 a에 할당되는 것을 볼 수 있다.

a[1]='a'

이와 같은 코드는 에러를 발생시킨다. 이는 a에 할당된 문자열의 값을 변경하려는 것이기 때문이다.

리스트는 가변 시퀀스이다. a=[1, 2, 3]인 리스트에서 a[0]=0을 실행하게 되면 a=[0, 2, 3]을 가지게 된다. 리스트에 대한 자세한 내용은 딕셔너리와 함께 추후에 알아볼 예정이다.

원시 타입 (Primitive Type)

C나 자바는 기본적으로 원시 타입을 제공한다. C의 경우 동일한 정수형이어도 크기나 부호에 따라 다양한 원시 타입을 제공한다. 위에서 파이썬은 숫자를 단일형으로 처리하여 언어를 단순한 구조로 만들 수 있다고 하였다. C는 반대로 원시 타입을 제공하여 빠른 속도를 제공한다.

원시 타입은 메모리에 정확하게 타입 크기만큼의 공간을 할당하고 그 공간을 오로지 값으로 채워 넣는다. C뿐만 아니라 자바도 마찬가지이다. 원시 타입을 제공하여 매우 빠른 연산이 가능하다. 자바는 원시 타입을 객체로 변환하여 여러가지 작업을 수행한다.

C나 자바는 성능에 대한 우선순위가 높은 언어이기 때문에 하드웨어에 가까운 원시 타입을 별도로 제공하고 이를 통해 더 빠른 속도를 제공한다. 파이썬은 편리한 기능 제공에 우선순위를 두어 느린 속도와 더 많은 메모리를 차지하더라도 훨씬 더 다양한 기능을 제공할 수 있는 객체에 관심을 둔다. 파이썬은 원시 타입의 속도를 포기하는 대신 객체의 다양한 기능과 편의성을 택했다.

C	원시타입
Java	원시 타입, 객체
Python	객체

객체

파이썬은 모든 것이 객체이다. 이 중 불변 객체와 가변 객체로 구분할 수 있다.

bool	불변 객체
int	불변 객체
float	불변 객체
list	가변 객체
tuple	불변 객체
str	불변 객체
set	가변 객체
dict	가변 객체

불변 객체

파이썬에서 변수를 할당하는 작업은 해당 객체에 대해 참조한다는 의미이다. 예외는 존재하지 않으며 심지어 문자와 숫자도 모두 객체이다.

10
a = 10
b = a
id(10), id(a), id(b) # 4393858752, 4393858752, 4393858752

10이라는 숫자가 있고 10을 a에 할당한다. b는 a를 할당한다. 만약 이 모두가 원시 타입이라면 각각의 값들은 각 메모리의 다른 영역에 위치할 것이다. 그러나 파이썬은 모든 것이 객체이기 때문에 위와 같이 객체의 주소가 모두 같은 것을 볼 수 있다. 숫자는 불변 객체이기 때문에 그럴 일은 없지만 만약 10이 11로 변경되면 a와 b 모두 11을 가지게 되는 것이다. 값을 담고 있는 변수는 참조일 뿐이고 실제로 값을 가지고 있는 int와 str은 모두 불변 객체이다.

가변 객체

int, str과 달리 list는 값이 바뀔 수 있다. 이 말은 다른 변수가 참조하고 있을 때, 그 변수의 값 또한 변경된다는 의미이다.

a = [1, 2, 3, 4, 5]
b = a
b # [1, 2, 3, 4, 5]
a[2] = 7
a # [1, 2, 7, 4, 5]
b # [1, 2, 7, 4, 5]

a는 list이고 b에는 a를 할당하여 참조되기 하였다. a의 요소 하나의 값을 변경하면 b가 a를 참조하고 있기 때문에 b 역시 값이 바뀌게 된다.

is와 ==

파이썬의 조건문에서 is와 ==는 '같다'는 의미를 가진다. 이 둘의 관계는 파이썬의 객체 구조와 관련이 깊다. is는 id()값, 즉 주소를 비교하는 함수이고 ==는 값 자체를 비교하는 비교 연산자이다. None은 null로서 값 자체가 정의되어있지 않기 때문에 is로만 비교가 가능하다.

속도

파이썬의 객체 구조는 잘 설계되어 있고 매우 편리하고 강력한 기능을 제공한다. 그러나 속도가 느리다는 단점을 가진다. 단순히 정수형의 덧셈 연산을 하는 경우에도 메모리에서 값을 꺼내 한번 연산하면 끝인 원시 타입에 비해 값을 꺼내는 데만 해도 타입 코드를 찾는 등 여러 단계의 부가 작업이 필요하다. 같은 이유로 자바 또한 원시 타입이 아닌 객체로 계산하게 되면 훨씬 더 느려진다. 파이썬의 과학 계산 모듈인 Numpy는 빠른 속도로 유명한데 C로 만든 모듈이며 내부적으로 리스트를 C의 원시 타입으로 처리하기 때문에 매우 빠르다.

원시 타입과 객체의 속도 차이는 극명하게 차이난다. 그럼에도 파이썬이 객체를 사용하는 이유 또한 딕셔너리, 리스트와 함께 알아볼 예정이다.

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글

Powered by GraphCDN, the GraphQL CDN