Python(파이썬)은 쉽고 편리한 언어로, 메모리 관리나 코드 실행 등의 많은 부분을 알아서 처리해줍니다. 그 비밀은 **가비지 컬렉션(Garbage Collection, GC)**과 **인터프리터(Interpreter)**덕분입니다.
가비지 컬렉션: 파이썬의 메모리 청소부
CPython 3.10 버전을 기준으로, 파이썬은 객체를 메모리에서 제거할 때 두 가지 방법을 사용합니다: **참조 카운팅(reference counting)**과 가비지 컬렉션입니다. 파이썬의 모든 객체는 자신을 가리키는 참조가 몇 개인지 숫자로 기록하고 있습니다. 변수를 만들거나 다른 객체에 할당하면 그 객체의 참조 횟수가 늘어나고, 변수가 삭제되거나 사용이 끝나면 참조 횟수가 줄어듭니다. 이렇게 참조 카운트를 관리하다가 어떤 객체의 참조 수가 0이 되는 순간, 더 이상 그 객체를 사용하는 곳이 없으므로 파이썬은 즉시 메모리에서 그 객체를 해제합니다. 예를 들어:
class MyObj:
def __del__(self):
print("메모리에서 제거됩니다!")
obj = MyObj()
del obj # 마지막 참조를 삭제하면 __del__ 메시지가 출력됩니다.
위 코드에서 obj
를 del
로 제거하면 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가 이해할 수 있는 수준까지 내부적으로 변환하여 실행해줍니다. 이 두 기능 덕분에 개발자는 복잡한 세부사항보다 문제 해결에 집중할 수 있습니다.
'프로그래밍언어' 카테고리의 다른 글
정적 타입 시스템 vs 동적 타입 시스템 (0) | 2025.05.08 |
---|---|
Python 언어 깊이있게 탐구하기 (5) | 2025.05.08 |
초보자를 위한 파이썬 비동기 프로그래밍 (0) | 2025.05.07 |