Everything is object in Python 이라는 말이있다. 근데 정확히 무슨말인지 이해하기가 좀 까다롭다.

C언어는 메모리를 바로 까볼수 있어서 느낌이 팍팍 오는데 Python은 뭔가 애매하고 한글로된 자료가 많이 없어서 정리하고자 한다.

 

 

1.  Everything is object의 핵심 개념

 

변수와 object의 관계

1번(빨간색)

C언어에서 x = 10 이렇게 변수를 할당하면 메모리에 해당 값이 바로 박히지만 파이썬에서는 10이라는 int object를 만들어 놓고 변수 x가 그것을 가르키는 형태이다.(보통 레퍼런스라고 하며 Pointer의 개념, 진짜 중요한 말이다 이게 바로 Everything is object in Python의 핵심 개념!

 

 

그리고 y = x 라고 하면 x에 의해서 이미 만들어진 10 이라는 int object를 y는 그냥 가르키기만 한다. 그래서 x와 y는 같은 object를 가르킨다 라고 말한다. 결국 10 int object를 가르키는건 x, y 2개

 

2번(하늘색)

x = x +1은 11(10 + 1)이라는 새로운 int object를 생성한다. 그리고 x는 새롭게 만들어진 int object를 가르킨다.

그리고 z = 10은 10이라는 int object를 가르키는데 10 int object는 이미 생성되어 있으니 만들 필요 없고 그냥 가르키기만 한다.

 

3번(보라색)

z = Car()는 Car라는 object를 생성하고 z는 car object를 가르킨다.(아주 단순)

 

 

2-1.  메모리 할당(Stack, Heap)

메모리 할당

 

main 함수

main 함수에서 y=5( 5 int object 생성 and 가르키기)과 f1(y)함수를 Call 한다. f1(y)를 호출하면 Stack 영역에 f1()영역이 생성 된다.

 

f1 함수

f1 함수에서 x = x * 2(5 * 2)로 10 int object 생성 및 가르키기를 하고 f2(x)를 호출하면 Stack 영역에 f2()영역이 생성 된다.

 

f2 함수

f2 함수에서 x = x +1 (10 + 1)로 11 int object 생성 및 가르키기를 한다.

 

 

2-2.  메모리 할당 해제

 

메모리 할당 해제

 

할당 해제

우선 Stack의 가장 위에 있는 f2함수가 해제 된다.(특이사항 없다)
그다음 f1함수가 해제 되는데 f1함수의 변수 x가 없어짐에 따라 10 int object도 없어진다.(10 int object를 아무도 가르키지 않기 때문) 이것이 바로 reference counting이 0이 됨에 따라 object가 없어지는 가비지 컬랙터이다. 파이썬은 레퍼런스 카운팅을 이용해서 메모리를 관리한다. 원리는 f1함수가 해제될때 10 int object가 사라지는 것이 대표적이 예이다.

 

마지막으로 main 함수의 변수 z는 11을 가르킨다.

 

3. Class instance 메모리 관리(self는 정확히 무엇인가)

 

Class instance memory

 

할당 해제

main에서 c = Car(4)은 class instance를 생성하는데 처음에 생성자 함수 __init__이 호출된다.

여기서 self, w 2개를 매개변수로 받는데 이는 매개변수 즉 지역변수 이기 때문에 Stack 영역에 생성된다.

 

w는 당연히 4인데, self는 정확히 무엇일까? 그림에서 보듯 Car instance(object)의 주소(reference) 값이다. 그러니깐 모든 class 메소드는 self를 매개변수로 가지는데 self는 자신의 Class instance의 주소 값이다. 너무나 중요한 말이고 너무나 당연한 말이다. self를 매개변수로 받지 않으면 어떻게 instance값을 참조 할 것인가? 찾지를 못한다.

 

그리고 self.wheels은 instance의 변수 즉 속성(attribute)이다. attribute는 Heap 영역에 할당된다. 왜냐하면 __init__ 함수가 없어지고 Stack 영역이 사라져도 self.wheels은 존재해야 하니깐! 어려운 말인데 잘 생각해 보길 바란다. 

마지막으로 self.wheels은 w가 가르키는 4를 가르킨다.

 

 

 

메소드 실행

 

메소드 실행

c.getWheels()를 실행하면 Stack 영역이 만들어지고 매개변수로 self가 생성된다. self는 instance의 주소 값을 가지고 있는 변수이니 self를 통해 Heap 영역의 wheels 변수에 접근한다. 접근 값은 4이고 main함수의 n 값은 Heap영역의 4를 가르킨다.

 

4. 결론 및 정리

본 글은 Everything is object in Python을 이해하기 위한 글이다.

C의 메모리(Stack, Heap), 포인터의 개념이 있어야 확실히 정리가 될 것이다.

정말 기본중에 기본이니 알고 있는 것이 좋을듯하다!

 

참조 영상 : https://www.youtube.com/watch?v=arxWaw-E8QQ

인도 아저씬데 기가맥히다.....

'python' 카테고리의 다른 글

파이썬 데코레이터 활용(로깅)  (1) 2021.09.02
python oracle 데이터 json serialize(django)  (0) 2020.02.25
python super  (0) 2019.12.26
클래스 관계 IS-A 상속  (0) 2019.11.07
python openpyxl을 이용한 Django DB insert  (0) 2019.06.21

+ Recent posts