books/윤성우-중급-파이썬

레퍼런스 카운트와 가비지 컬렉션

study_recode 2025. 3. 12. 22:31

가비지 컬렉션

변수 s에 문자열이 저장되었다고 표현되었다고 표현하지만 사실은 문자열 객체에 s라는 이름이 붙은 상황이다.

s = "Garbage Collection"
print(s)

 

파이썬의 변수는 빈 상자가 아닌 떼었다 붙였다 할 수 있는 '포스트잇'의 개념이다. 

  • 변수 s가 문자열 "Garbage Collection"을 참조한다.
  • 변수 s가 문자열 "Garbage Collection"을 레퍼런스한다.

참조는 '포스트잇을 가져다 붙인 것을 뜻한다. 

아래 코드는 리스트 객체를 생성하고 이를 r이라는 이름으로 참조한다.

r = [1, 2, 3]

 

이 리스트 객체는 언제 소멸되나? -> 객체를 아무도 참조하지 않는 사항

r = [1, 2, 3]
r = 'simple'

 

위 처럼 r이 리스트를 참조한 상태에서 문자열을 참조하게 되어 리스트를 아무도 참조하지 않는 상태가 되면 소멸한다(메모리에서 사라짐)

 

바로 소멸되는게 아니며 시간적인 여유가 생길 때 소멸시키게 된다. 이러한 일련의 소멸 규칙 및 과정을 가리켜 "가비지 컬렉션"이라 한다. 

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

 

객체를 참조하는 변수의 수를 "레퍼런스 카운트"라 한다. 

파이썬 인터프리터

파이썬 코드를(스크립트) 작성하고 실행하면 이 코드는 먼저 '바이트 코드'라는 것으로 변환되어 어딘가에 저장, 그리고 이 바이트 코드는 "파이썬 가상 머신"위에서 실행이 된다.

 

파이썬 프로그램의 실행 주체는 파이썬 가상 머신(PVM)이고 가비지 컬렉션도 진행한다.  파이썬 코드 변화긴, 가상 머신, 각종 라이브러리들을 묶어서 "파이썬 인터프리터"라 한다. 

PVM의 구현 방식에 따른 종류

  • C언어로 구현되어 있는 가장 일반적이고 널리 사용되는 인터프리터 CPython
  • PVM이 자바로 구현되어 있어서 자바에 대한 접근성이 좋은 인터프리터 Jython
  • 마이크로소프트사의 닷넷 기반으로 만들어지고 또 그 위에서 동작하는 인터프리터 IronPython