Python은 모든 데이터를 Object로 기술한다. (이건 요즘 고급OOP언어들의 트렌드다.)
1, 2, 3.14, 0.3010, 'a', 'asdf' 등등등 전통적인 Built-In Datatypes를 지원하는것 처럼 보이나 실제로 내부는 모두 Object로 저장된다.(지원 안한다는 말이 아니다 :))
이 Object는 Chunk of memory일 뿐이고, 프로그래머가 흔히 variable이라고 알고 있는 것은 이 Object를 가리키는 "Name"이다.
[CODE type=python]
a = 1
b = 2
c = b
[/HTML][/CODE]
라고 하면 C/C++에서와 같이 메모리가 할당 되고 a, b, c는 그 주소를 대변하는 상자(변수)가 되는 것이 아니라, 1이라는 값을 가지는 메모리 공간이 할당되고 이 메모리 공간을 'a'라는 이름으로 접근할 수 있게 되는 것이다.
1은 Object그 자체의 "Value"(실제로 메모리에 기록된 값)이며 'a'는 Object의 "Name"(1이라는 Object에 접근할 수 있도록 해 주는 Python interpreter또는 Code상의 심볼)이라는 Object 기술 방법을 이해해야 한다.
C/C++에서의 Variable의 reference와 비슷하게 Object의 Name이 존재한다고 생각하면 쉽다.
(그러나 이 말은 단순한 데이터타입에서만 들어 맞는다. 그냥 개념상 비슷하다는거다)
이런 기술 방법에서는 'b' 역시 'a'와 마찬가지이지만, 'c'에서 재밌는 일이 일어난다.
'c'라는 것은 단지 이름일 뿐이다. 따라서 'c'는 'b'와 메모리 상에서 같은 Object를 가리키고 있게 된다.
이것은 매우 중요하다.
Python을 비롯한 많은 최근의 고급 OOP언어들은 object의 reference count에 기반한 Garbage collector를 가지고 있다. Garbage collector는 reference count가 0이 되는 object가 점유한 메모리를 다시 할당 가능한 공간으로 바꾸어 놓는다.
위의 예에서, 2의 값을 가지는 Object는 reference count가 2가 되었다.
단순한 데이터 타입을 벗어나면 좀더 데이터 모델은 복잡해 보인다.
List 데이터를 예로 들어 보자.
[CODE type=python]
mylist = [1, 2, 3, 4, 5]
yourlist = ['a', 'b', 'cdef', 10, 20, 30.5]
[/HTML][/CODE]
위 두 라인은 모두 가능하다.
Python의 list타입은 C/C++의 array와 비슷한 사용법으로 다룰수 있도록 개발되었다.
mylist[0]의 값은 1, yourlist[3]의 값은 10이 된다. 그러나 yourlist의 element들에서 C/C++와 다른 큰 차이점이 보이는데, 바로 mixed-type array라는 점이다. 이는 list의 각 element가 모두 object이기 때문에 가능하다.
STL이나 .Net 같은 덩치크고 복잡한 라이브러리에 의존하지 않고 가능하다!
또한, list의 element는 프로그래머에게 노출되지 않은 element의 "Name"을 내장하고 있다.
위의 리스트가 존재하는 상황에서,
[CODE type=python]
yourelem = yourlist[2]
[/HTML][/CODE]
를 실행하면 yourelem는 'cdef'의 string값을 가진다.(yourelem에 'cdef'가 저장되는게 아니다.)
이 때까지는 yourelem과 yourlist[2]는 같은 Object를 가리키고 있다. 즉, yourlist를 정의하면서 할당된 'cdef'라는 값의 object는 reference count가 2가 된 것이다.
이제부터가 C/C++의 reference와 다른 부분이다.
이 상태로
[CODE type=python]
yourelem = 'asdf'
[/HTML][/CODE]
를 실행하면 어떻게 될까?
C/C++이라면 yourelem은 &(yourlist[2])이므로 yourlist는 ['a', 'b', 'asdf', 10, 20, 30.5]로 그 값이 바뀌었을 테지만, Python에서는 yourelem이라는 "Name"은 'asdf'라는 새로운 string object를 지시하게 된다.
이미 할당되어 있던 'cdef'라는 string object의 reference count가 1로 바뀌었을 뿐, yourlist는 변하지 않는다.
가만 생각해 보면 Python의 Object-Name-Value 관계에 의해 매우 자명한 일이다.
Python은 Object-Name-Value의 간단 명료한 관계를 가장 간단한 정수형 데이터에서 부터 Tuple, 리스트, 사전(dict object) 과 같은 크고 복잡한 데이터 타입까지도, 심지어는 이런 Container type이 마구 nesting된 경우에도 일관되게 적용하고 있다.
How smart!!
Python의 모든 데이터는 Object이며 모든 Object는 object class로부터 파생된 데이터 타입이다.
이런 Data model을 사용하여 callable object, 생성 또는 소멸시에 특별한 행동을 하도록, 또는 참조되는 상황에 따라 다른 행동을 하도록 customizing 할 수 있다.
소위 "언더바함수"를 재정의 하면 된다.
Python은 Object의 member뿐만 아니라 Method도 모두 function object로서 함수조차 object라는건 이 글에 미리 언급해 두자.
손꾸락이 아프니까 이건 다음에 정리하자.


