프로그래밍언어

Python 가비지 컬렉션과 인터프리터 동작 원리

지식소 채움이 2025. 5. 9. 13:09

Python(파이썬)은 쉽고 편리한 언어로, 메모리 관리나 코드 실행 등의 많은 부분을 알아서 처리해줍니다. 그 비밀은 **가비지 컬렉션(Garbage Collection, GC)**과 **인터프리터(Interpreter)**덕분입니다.

가비지 컬렉션: 파이썬의 메모리 청소부

CPython 3.10 버전을 기준으로, 파이썬은 객체를 메모리에서 제거할 때 두 가지 방법을 사용합니다: **참조 카운팅(reference counting)**과 가비지 컬렉션입니다. 파이썬의 모든 객체는 자신을 가리키는 참조가 몇 개인지 숫자로 기록하고 있습니다. 변수를 만들거나 다른 객체에 할당하면 그 객체의 참조 횟수가 늘어나고, 변수가 삭제되거나 사용이 끝나면 참조 횟수가 줄어듭니다. 이렇게 참조 카운트를 관리하다가 어떤 객체의 참조 수가 0이 되는 순간, 더 이상 그 객체를 사용하는 곳이 없으므로 파이썬은 즉시 메모리에서 그 객체를 해제합니다. 예를 들어:

class MyObj:
    def __del__(self):
        print("메모리에서 제거됩니다!")

obj = MyObj()
del obj  # 마지막 참조를 삭제하면 __del__ 메시지가 출력됩니다.

위 코드에서 objdel로 제거하면 MyObj__del__ 메서드가 호출되면서 "메모리에서 제거됩니다!"라는 문구를 출력합니다. 이는 obj의 참조 카운트가 0이 되자마자 객체가 정리된 것입니다.

하지만 참조 카운팅만으로 해결되지 않는 경우도 있습니다. 대표적인 예가 순환 참조(cyclic reference) 상황인데요. 예컨대 객체 A가 객체 B를, B가 A를 가리키면 둘 다 참조 카운트가 0이 되지 않아 del로 지워도 메모리가 해제되지 않습니다. 이런 경우 파이썬은 **가비지 컬렉션(GC)**을 통해 순환 참조로 이어진 "고립된 객체들"을 찾아내어 메모리를 회수합니다.

파이썬의 GC는 세대별 수집 알고리즘을 사용합니다. 새로 생성된 객체는 젊은 세대(Generation 0)로 분류되고 오래 살아남는 객체는 더 높은 세대(Generation 1, 2)로 옮겨집니다. 가비지 컬렉터는 젊은 세대 객체를 더 자주 수집하고 오래된 세대는 덜 자주 수집하여 효율을 높입니다. 이 과정에서 순환 참조된 객체들도 찾아 안전하게 메모리를 해제합니다.

인터프리터: 파이썬 코드를 실행하는 마법사

파이썬은 C나 Java처럼 미리 기계어로 컴파일하는 대신, 실행 시간에 소스 코드를 읽어 들여가며 동작하는 인터프리터 언어입니다. 파이썬 인터프리터(CPython의 경우)는 우리의 코드를 바로 처리하지 않고, 먼저 한 단계 중간 형태로 **바이트코드(bytecode)**라는 것으로 변환합니다. 마치 요리사가 복잡한 요리법을 이해하기 쉽게 목록으로 정리하는 것과 비슷합니다. 이 바이트코드는 파이썬 가상 머신(PVM)이 이해할 수 있는 일종의 파이썬 전용 기계어라고 볼 수 있습니다. 파이썬은 .py 파일을 실행할 때 이 바이트코드를 생성한 뒤, 인터프리터(PVM)가 그 바이트코드를 한 줄 한 줄 읽어서 실행하게 됩니다.

 

내부적으로 CPython 인터프리터는 C 언어로 구현된 거대한 while 루프 안에서 바이트코드 명령을 하나씩 가져와 처리합니다. 각 바이트코드에 대해 미리 정해진 C 함수나 연산을 호출하도록 switch-case 문으로 구현되어 있습니다. 파이썬 코드의 실행은 결국 이 루프가 바이트코드 목록을 차례차례 해석하여 처리하는 과정이라고 할 수 있습니다.

 

이처럼 파이썬은 소스 코드를 이런 바이트코드 명령들의 모음으로 바꾸고, 그걸 인터프리터가 순차적으로 실행하면서 우리가 짠 프로그램의 로직을 수행합니다.

 

정리하자면, 파이썬 인터프리터는 "코드를 가져와서, 바이트코드라는 중간 언어로 번역하고, 그걸 차례로 실행하는" 번역가 겸 실행자입니다. 이 덕분에 우리는 파이썬 코드만 작성하면, 인터프리터가 알아서 CPU가 이해할 수 있는 수준까지 내부적으로 변환하여 실행해줍니다. 이 두 기능 덕분에 개발자는 복잡한 세부사항보다 문제 해결에 집중할 수 있습니다.