초보 개발자

1강 레퍼런스 카운터, 가비지 컬렉션 본문

Python/윤성우 열혈 파이썬

1강 레퍼런스 카운터, 가비지 컬렉션

taehyeki 2021. 12. 15. 11:58

보통은 변수에 문자열을 저장했다. 또는 변수에 객체를 저장했다 라는 식의 표현이 사용되고 그것이 더 자연스럽다.

하지만 지금 설명하는 파이썬의 가비지 컬렉션 메커니즘을 이해하려면 변수를 포스트잇으로 이해해야한다.

s = 'Garbage Collection'

레퍼런스 ( 참조 )

" 변수 s가 문자열 'Garbage Collection'을 '참조'한다 "

" 변수 s가 문자열 'Garbage Collection'을 '레퍼런스'한다 "

즉 여기서 말하는 '참조'는 이름이 쓰인 포스트잇을 가져다 붙인 것을 뜻한다.

 

변수 s에 'Garbage Collection' 문자열을 집어 넣는 것이 아니라 'Garbage Collection'이라는 객체가 메모리에 생성이 되었고 변수 s로 참조를 하고 있다라고 이해를 해야한다.

 

r = [1,2,3] #r 이라는 이름으로 리스트를 참조

여기서도 리스트 객체를 생성하고 이를 r이라는 이름으로 참조하고 있는 상황이다.

우리는 r이라는 이름을 리스트에다가 붙여주었다. 그렇다면 레퍼런스 카운터는 r이라는 변수에 속하는 것이 아니라,

[1,2,3] 이 객체에 속하게 된다. 즉 파이썬의 모든 객체는 자기만의 레퍼런스 카운터가 있다. 현재 [1,2,3]의 레퍼런스 카운터는 1이된다. (r하나만 참조하고 있기에)

 

그럼 이렇게 생성된 리스트 [1,2,3]은 언제 소멸이 될까? 소멸 되지 않고 계속 메모리를 차지하면 문제가 되기에

언젠가는 소멸이 되어야 한다. 그 시기는 "객체를 아무도 참조하지 않는 상황"이다. 즉 레퍼런스 카운터가 0이 되는 순간이다.

r = [1,2,3]
r = 'simple' # 변수 r이 참조 대상을 문자열로 바꿨다.

기존의 [1,2,3]은 이제 접근할 수 없게된다. 남겨두면 메모리만 차지할 뿐이기에 소멸 대상이 된다. 하지만 바로 소멸이 되는 것은 아니고 시스템에 여유가 생길 때 소멸되게 된다. 그리고 이러한 일련의 소멸 규칙 및 과정을 가리켜 '가비지 컬렉션' 이라고 한다. 따라서 파이썬이 알아서 [1,2,3]을 지워준다.

 

r1 = [1,2,3]  #리스트 [1,2,3]의 레퍼런스 카운트는 1
r2 = r1	      #리스트 레퍼런스 카운트는 2로 증가
r1 = 'simple' #리스트 레퍼런스 카운트는 다시 1로 감소
r2 = 'happy'  #리스트 레퍼런스 카운트가 0이 됨, 따라서 가비지 컬렉션 대상

 

파이썬 인터프리터

우리가 파이썬 코드를 작성하고 실행하면 이 코드는 먼저 바이트 코드라는 것으로 변환되어 어딘가에 저장된다. 그리고 이 바이트 코드는 파이썬 가상머신(PVM)위에서 실행이 된다. 즉 실제 파이썬 프로그램의 실행 주체는 파이썬 가상머신이라고 할 수 있고 이 PVM에 의해서 가비지 컬렉션도 진행이 된다. 그리고 지금 설명한 파이썬 코드 변환기, 가상 머신, 그리고 기본적으로 포함되는 각종 라이브러리들을 묶어서 파이썬 인터프리터라고 한다.