1. 임의정밀도

임의정밀도 정수형이란 무제한 자릿수를 제공하는 정수열을 말한다. 엄청나게 긴 정수를 입력받으면 그것을 잘라서 2^30 진법으로 만든다. 이 값을 별도로 계산하여 처리하는 방식인데 임의정밀도로 숫자를 처리하게 되면 계산 속도가 저하된다.

2. 자료형의 종류

int: 수의 크기에 제한이 없다. 원래는 long과 int가 구분되어 있었지만 2.4 버전부터는 int로 크기가 충분하지 않으면 자동으로 long으로 바꿔주는 기능을 제공하게 되었다. 따라서 임의정밀도를 제공한다.

bool : 다른 언어에서는 논리연산자라고 쓰이는데, Python에서는 int의 서브 클래스로 쓰인다. True는 1, false는 0이다.

mapping(맵, 매핑) : Key, Value로 구성된 복합 자료형이며 맵 자료형이라고도 불린다. 그 종류로 파이썬에서는 ‘딕셔너리’가 있다.

set(집합) : 중복된 값을 가지지 않게 하는 자료형이다. 입력 순서가 그대로 유지도지 않으며 중복된 값이 있을 경우 하나의 값만 유지한다.

sequence(수열) : list와 str이 포함되며 흔히 ‘배열’을 파이썬에서 수열이 처리한다. str은 불변인데, a = ‘abc’로 선언을 한 후 다음 줄에 a = ‘def’로 바꿔도 a의 값이 def로 바뀌었을 뿐 메모리 어딘가의 abc는 남아있다. 따라서 a[0] = ‘ghi’처럼 값을 바꾸려고 하면 오류가 생긴다. 반대로 list는 가변 형태이다.

3. 원시 타입과 메모리

C언어나 자바같은 경우에는 원시타입을 제공한다. short부터 long long까지 매우 다양하다. 물리 메모리에는 int 기준으로 하나당 공간을 4개 자치한다. 자바는 객체를 동시에 지원하는데, 원시타입으로는 할 수 없는 것들을 객체에서는 할 수 있다. 비트를 조작한다던지, 16진수로 변환한다던지 하는 것들을 말이다. 하지만 그에 따라 단점이 있는데, 메모리 용량이 말도 안되게 커진다.

극단적인 예로 boolean 자료형의 경우 원시 타입으로는 고작 1비트를 차지하는 반면 객체같은 경우는 128비트를 차지한다. 그러니까 128배 더 많은 저장공간을 필요로 한다는 뜻이다. 속도에서도 그 차이가 두드러지는데, Numpy라는 계산 모듈로 파이썬의 객체를 모조리 원시타입으로 바꿔서 계산한 속도는, 객체를 이용한 계산보다 40배 이상 빠르다는 실험 결과도 있다. 따라서 원시 타입만 제공하는 C언어 같은 경우 빠른 연산이 가능한데, 객체까지 함께 지원하는 자바같은 경우는 메모리 공간도 늘어나고 실행 속도도 느리다. 그런데 파이썬은 많은 저장공간을 차지하고 속도도 느린 객체만 지원한다.

따라서 속도가 C언어와 자바에 비해 확연히 느리고, 메모리 차지 공간도 훨씬 더 많다.

  • type(a) : a의 타입
  • if a is None : a의 메모리 주소가 없다면
  • id(a) : a의 id값 출력

4. 파이썬의 객체

파이썬은 따라서 모든것이 객체이다. 불변형과 가변형으로 객체를 나눌 수 있는데 대부분의 클래스가 불변형이고, list, set, dict 이렇게 3개만 가변형이다.

불변객체 : a = 10, b = a로 선언을 해서 각각의 id값을 불러오면 놀랍게도 동일하다. 메모리 위치가 같다는 것이다. 객체이기 때문에 가능한 일이다. 하지만 ‘불변’ 객체이기 때문에 a의 값을 바꾼다고 b의 값도 동시에 따라서 바뀌는 것이 아니다.

가변객체 : a = [1, 2, 3], b = a로 선언을 하면 각각의 리스트는 1, 2, 3이라는 값을 가지게 된다. 여기서, a[0] = 0이라고 값을 변경한다면 두 리스트 모두 [0, 2, 3]이라는 리스트로 바뀌게 된다. 가변 객체이기 때문에 가능한 일이다.