프로그래밍/python

파이썬(python)의 자료형의 특징(C/C++과 비교) (1)

콘파냐 2015. 6. 15. 19:16
반응형

문법적 설명을 들어가기에 앞서, 다른 언어(C/C++)와 다른 python이 특징이 될만한 내용을 먼저 정리하는 게 효율적이라 생각했습니다. 우선 파이썬의 자료형에 관한 객체의 특징에 대해서 살펴보겠습니다.


변수와 상수

C언어에서 변수는 값을 저장할 수 있는 그릇과 같은 것이고, 상수는 값 그 자체를 의미합니다. 따라서

int a=1; 이라는 문장은 a라는 int형 타입 변수에 1이라는 값을 저장하는 것입니다. 내부적으로는 메모리에 a 변수가 생성되고 값을 저장하는 형태는 int형 그리고 저장된 값은 1이 됩니다.

다음은 같은 python 코드입니다.

a=1

두 작업은 내부적으로 매우 다르게 시행되고, Python 코드가 간결하지만 내부적인 작업은 매우 복잡합니다. 작업순서를 비교해 보겠습니다.

C언어(int a=1;)

int타입 변수 a를 메모리에 생성한다.

a에 1의 값을 넣는다.

Python(a=1)

a라는 파이썬 객체에 1을 할당(아직 1의 타입이 뭔지 모름)

② pyObject_HEAD에서typecode를 을 정수로 설정

③ digit에 1 넣음

 

① ②은 파이썬(python)이 동적타입핑(dynamically-typed) 언어라는 특성을 나타내줍니다.

이런 특징은 파이썬이 왜 C보다 느린지 설명해 줍니다.

또한 이렇게 상수를 객체로 rapping해서 마치 상수 자체를 객체로 착각하게 만듭니다.

id(객체) 는 객체의 주소를 반환합니다.

또한 a(1), b(1) 로 해도 같은 결과가 나옵니다.

네, 파이썬 에서는 1이란 값도 객체로 다뤄집니다. 그런데 우리는 위에서 살펴봤듯이 1이란 값이 입력이 되면 객체내부에 digit에 1이 저장되는 것을 알 수 있습니다. 1은 객체 자체를 의미하지 않지만, 파이썬에서는 1이라는 값을 갖는 객체를 싱글톤으로 생성합니다. 때문에 b=1의 값을 넣어도 1의 값을 갖는 싱글톤 객체를 가리키게 됩니다. 그래서 파이썬에서는 상수도 객체로 다룹니다. 언어적인 측면으로 객체로 다뤄지는 것이지, 내부적으로는 상수 자체가 객체가 되는 것이 아닙니다.


256이 넘어가는 수

위 내용과 달리 c와 d가 가리키는 257이란 객체의 주소가 서로 다릅니다. 1의 경우는 같은데, 모순이 생겼습니다. 제 개인적인 생각으로는 파이썬에서는 256까지 수와 그 이상의 수를 취급하는 방법이 다르다 생각합니다. 256까지의 객체는 싱글톤 객체로 그 객체를 참조하는 변수의 수에 맞게 레퍼런스 카운팅을 하는 방식입니다. 하지만 257이 넘어가면 더 이상 싱글톤 객체로 다루지 않습니다. 이는 파이썬이 모든 수를 객체로 다루기 때문에 어쩔 수 없이 선택한 절충안이라고 생각합니다. 256까지의 자주 사용하는 수에 대해서는, 잦은 객체 생성이 성능 하락을 가져오기 때문에 싱글톤으로 설개하고, 256이 넘어가는 자주 사용하지 않는 수는 더 이상 싱글톤으로 다루지 않는다는 것이죠.

참 흥미롭네요. 사실 내부 구조를 더 파헤치고는 싶지만, 시작은 이 정도로 해두기로 했습니다. 나중에 더 깊게 다루겠습니다.


나머지 자료형들

파이썬이 어떻게 수를 객체로 취급하는지 알아봤습니다. C에서는 수에도 여러 자료형이 있지만, python은 수 하나로 끝입니다. 아주 간편하죠. 수에 관한 자료형을 봤으니 나머지 자료형들을 살펴볼 차례입니다.

차례대로 리스트(list), 셋(set), 터플(tuple), 딕셔너리(dictionary), 문자열(String) 입니다. 이에 대한 설명은 다음에 하겠습니다.

반응형