프로그램을 실행하면 메모리를 사용한다.
사용 후에 메모리를 차지하는 것들이 불필요해지면, 해당 메모리를 소멸시켜 줘야 다시 사용할 수 있는 메모리 공간을 확보할 수 있다.
이때 메모리가 소멸되는 방법은 2가지가 있다.
파이썬 같은 경우에는 대부분이 자동으로 소멸되도록 구성되어 있어, 별도로 메모리를 지워주는 명령을 하지 않아도 된다.
그럼 언제 메모리가 자동으로 소멸되는 것일까?라는 생각을 해볼 수 있다.
레퍼런스 카운트를 통해 메모리가 언제 소멸되는지를 설명할 수 있다.
자세한 설명은 아래에서..!
파이썬에서는 변수가 메모리 공간을 의미하지 않는다.
예를 들어 다음과 같이 s
라는 변수를 만들어 주었을 때
>>> s = 'Garbage Collection'
소프트웨어적 관점에서 본다면 변수를 빈상자라고 보고, 문자열 객체가 s
라는 빈상자에 담기는 것이다.
하지만 실제로 파이썬에서는 Garbage Collection
라는 문자열 객체를 메모리 공간에 할당 해준 뒤, 해당 문자열 객체에 s
라는 이름을 붙여준 것이 된다.
즉, 파이썬의 변수는 빈 상자가 아닌 떼었다 붙였다 할 수 있는 포스트잇의 개념이라고 생각하면 된다.
이때 위에서 설명한 변수를 이해하는 두가지 관점을 모두 이해하고 있는 것을 추천한다고 한다
이때 두가지 문장은 같음을 알고 있어야 한다.
( 참조의 영어표현이 레퍼런스이다 )
여기서 말하는 참조는 이름이 쓰인 포스트잇을 가져다 붙인 것을 뜻한다.
우리는 다음 코드를 보고 어떻게 표현할 수 있을까?
>>> r = [1, 2, 3]
리스트 객체를 r
이라는 변수가 참조한다 라고 표현한다.
r
이라는 변수를 선언하는 순간에 리스트 객체가 메모리 공간을 차지할 것이다.
이때 이 메모리가 언제 소멸될 것인가? 라는 질문이 핵심이다.
소멸시기를 결정하기 위해 파이썬은 레퍼런스 카운트를 유지하고 있다고 말한다.
이때 레퍼런스 카운트(rc)는 누가 얼마만큼 참조하고 있는가를 따지는 것이다.
앞서 [1, 2, 3]
이라는 리스트 객체가 메모리 공간을 차지하고 거기에 r
이라는 이름(포스트잇)을 붙여주었다.
그럼 레퍼런스 카운트는 r
이라는 변수에 속하는 것이 아닌, 객체에 속하는 것이다
즉, 파이썬의 모든 객체는 자기만의 레퍼런스 카운트가 있다.
객체에 붙어있는 이름이 r
하나이기 때문에 레퍼런스 카운트는 1이 되며,
이 레퍼런스 카운트가 0이 될 때 메모리가 소멸된다.
레퍼런스 카운드가 0이 될 때를 생각해본다면,
똑같은 이름의 변수를 새롭게 선언해 줄 때가 있을 것이다.
>> r = 10
위와 같이 새롭게 r
이라는 변수에 10이라는 객체를 참조시킨다면, 리스트 객체는 이름을 잃게 되어 레퍼런스 카운트가 0이 될 것이다.
이때 리스트 객체는 이름을 잃었기 때문에 다시 가져다 쓸 수 없게 된다.
때문에 파이썬은 알아서 레퍼런스 카운트가 0인, 즉 불필요한 것들을 소멸시켜주게 된다.
다시 한번 정리하자면,
메모리를 차지하고 있는 객체가 소멸되는 시기는
객체를 아무도 참조하지 않는 상황 (rc=0)인 것이다 !
이때 레퍼런스 카운트가 0이면 소멸 대상이 되고, 파이썬은 시스템에 시간적인 여유가 생길때 소멸시키게 된다.
이러한 일련의 소멸 규칙 및 과정을 가리켜 가비지 컬렉션이라 한다.
🔎 참고
중급편 열혈 파이썬 story01