객체 지향 프로그래밍/Python

파이썬 변수는 언제 소멸될까?

ghtis1798 2021. 3. 10. 12:25

파이썬 소멸 시기

파이썬과 자바의 공통점은 메모리를 프로그래머가 관리 하지 않는다는 것이다.

메모리 관리를 대신 해주는 무언가가 존재한다는 말이다.

그 역할을 가비지 컬렉션과 레퍼런스 카운터가 맡는다.

레퍼런스 카운트는 해당 변수(객체)가 사용되고 있는 지를 나타낸다.

가비지 컬렉션는 레퍼런스 카운트가 0이 되는 순간 메모리를 수거해간다.

📌가비지 컬렉션

가비지 컬렉션

가비지 컬렉션는 레퍼런스 카운터가 0이 되는 순간 객체의 메모리를 수거해 간다.

📌레퍼런스 카운트

레퍼런스 카운트

레퍼런스의 뜻은 '참조'라는 뜻이다.

즉 레퍼런스는 해당 변수 or 객체가 참조 되고 있는지를 확인한다.

따라서 레퍼런스 카운트가 0이 되는 변수를 가비지 컬렉터가 수거해가는 것이다.

 

📌객체의 생성과 소멸

# Python
list_1= [1,2,3]
list_2 = list_1

# list_1과 list_2가 참조하는 대상(객체)이 같습니까?
if list_1 is list_2:  
print('list_1과 list_2는 같은 객체를 참조합니다.')
# list_1과 list_2가 참조하는 대상에 담긴 값이 같습니까?
if list_1 == list_2:  
print('list_1과 list_2가 참조하는 객체에 담긴 값이 같습니다.')

현재 리스트는 [1,2,3] 딱 1개만 존재한다.

[1,2,3] 리스트 하나를 list_1 변수와 list_2 변수가 참조하고 있는 형태이다.

따라서 이 list [1,2,3]의 레퍼런스 카운터는 2이다.

하나 더 알 수 있는 것이 있다.

'=='는 참조하는 대상에 담긴 값이 같느냐를 확인한다.

'is'는 참조하는 대상이 같냐를 확인한다는 것을 알 수 있다.

list_1 = 'Skinny Brown'

list_1 변수가 'Skinny Brown'을 참조하도록 변경했다.

[1,2,3] 리스트의 레퍼런스 카운트는 1이다.

동시에 'Skinny Brown'이라는 문자열의 레퍼런스 카운트는 1이 된다.

여기서 list_2 변수가 다른 객체를 참조하도록 변경하면 어떻게 될까?

리스트 [1,2,3]은 가비지 컬렉터가 메모리 공간을 수거해간다.