[Python] 중급 #1-레퍼런스 카운트, 가비지 컬렉션

정보구니·2021년 12월 7일
0

Python

목록 보기
11/18
post-thumbnail

프로그램을 실행하면 메모리를 사용한다.

사용 후에 메모리를 차지하는 것들이 불필요해지면, 해당 메모리를 소멸시켜 줘야 다시 사용할 수 있는 메모리 공간을 확보할 수 있다.

이때 메모리가 소멸되는 방법은 2가지가 있다.

  • 규칙에 의해 자동 소멸
  • 프로그래머가 직접 명령

파이썬 같은 경우에는 대부분이 자동으로 소멸되도록 구성되어 있어, 별도로 메모리를 지워주는 명령을 하지 않아도 된다.


그럼 언제 메모리가 자동으로 소멸되는 것일까?라는 생각을 해볼 수 있다.

레퍼런스 카운트를 통해 메모리가 언제 소멸되는지를 설명할 수 있다.

자세한 설명은 아래에서..!


파이썬에서는 변수가 메모리 공간을 의미하지 않는다.

예를 들어 다음과 같이 s라는 변수를 만들어 주었을 때

>>> s = 'Garbage Collection'

소프트웨어적 관점에서 본다면 변수를 빈상자라고 보고, 문자열 객체가 s라는 빈상자에 담기는 것이다.

하지만 실제로 파이썬에서는 Garbage Collection라는 문자열 객체를 메모리 공간에 할당 해준 뒤, 해당 문자열 객체에 s라는 이름을 붙여준 것이 된다.

즉, 파이썬의 변수는 빈 상자가 아닌 떼었다 붙였다 할 수 있는 포스트잇의 개념이라고 생각하면 된다.


이때 위에서 설명한 변수를 이해하는 두가지 관점을 모두 이해하고 있는 것을 추천한다고 한다



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

이때 두가지 문장은 같음을 알고 있어야 한다.
( 참조의 영어표현이 레퍼런스이다 )

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


우리는 다음 코드를 보고 어떻게 표현할 수 있을까?

>>> 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

0개의 댓글