파이썬의 모든 자료형은 객체이다.
C언어를 예로 들어보자.
C언어에서 int num = 10; 과 같이 정수 변수를 하나 생성한다면, 4byte (아주 옛날 프로세서가 아니라면) 만큼의 메모리에 10을 저장하는 방식으로 동작한다. 따라서 C언어에서 정수의 크기는 4byte이다. 또한 정수들로 이루어진 배열을 생성하게 되면, '4 x 배열의 길이' 만큼의 메모리를 차지한다.
그렇다면 파이썬에서 정수의 크기는 4byte일까? 직접 확인해 보자.
>>> num = 10
>>> num.__sizeof__()
28
무려 28바이트이다. 이는 파이썬의 특성 때문인데, 파이썬은 모든 자료형이 객체이다.
아래는 위의 num 변수가 가지고 있는 '내장 변수' 들을 출력하는 코드이다.
>>> import pprint # 단지 결과를 깔끔하게 출력하기 위해 import하였음
>>> num = 10
>>> pprint.pprint(dir(num))
['__abs__',
'__add__',
'__and__',
'__bool__',
'__ceil__',
'__class__',
'__delattr__',
'__dir__',
'__divmod__',
'__doc__',
'__eq__',
'__float__',
'__floor__',
'__floordiv__',
'__format__',
'__ge__',
'__getattribute__',
'__getnewargs__',
'__gt__',
'__hash__',
'__index__',
'__init__',
'__init_subclass__',
'__int__',
'__invert__',
'__le__',
'__lshift__',
'__lt__',
'__mod__',
'__mul__',
'__ne__',
'__neg__',
'__new__',
'__or__',
'__pos__',
'__pow__',
'__radd__',
'__rand__',
'__rdivmod__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__rfloordiv__',
'__rlshift__',
'__rmod__',
'__rmul__',
'__ror__',
'__round__',
'__rpow__',
'__rrshift__',
'__rshift__',
'__rsub__',
'__rtruediv__',
'__rxor__',
'__setattr__',
'__sizeof__',
'__str__',
'__sub__',
'__subclasshook__',
'__truediv__',
'__trunc__',
'__xor__',
'as_integer_ratio',
'bit_length',
'conjugate',
'denominator',
'from_bytes',
'imag',
'numerator',
'real',
'to_bytes'] # ㅎㅎ....;;
어.... 이정도이다.
파이썬에서 정수를 생성하면, C언어처럼 단순히 메모리 공간에 해당 정수를 저장하는 것이 아니라, int 클래스의 객체가 생성된다. 즉 C언어의 int는 해당 수 자체만을 저장하는 것과 달리, 파이썬은 해당 정수와 관련된 많은 함수들 (매직 메소드라고 불리는), 관련된 변수들을 포함한다. 맨 위에서 정수의 크기를 알아보기 위해 __sizeof__() 함수를 사용하였는데, 이 역시 int 클래스의 멤버함수들 중 하나이다. 참고로 __ (더블 언더스코어, 던더) 2개로 이루어진 이러한 함수들을 매직 메소드라고 하는데, 이들에 대해서는 추후 다룰 기회가 있을 것이다.
이처럼 파이썬의 모든 자료형이 객체라는 개념이 박혀 있으면 다른 내용들을 이해할 때 도움이 많이 될 것이라고 생각한다.
'파이썬(Python) > 문법 내용정리' 카테고리의 다른 글
빗물 트래핑 (0) | 2021.02.11 |
---|---|
함수 인자 전달 (0) | 2021.02.07 |
Collections 모듈 - Counter (0) | 2021.01.31 |
Type Hint (타입 힌트) (0) | 2021.01.29 |
Generator (제너레이터) (0) | 2021.01.28 |
댓글