프로그래머스 문제를 풀던 중 의문이 들었다.

C언어에서 배우기를, 함수 내에서 선언한 변수는 해당 함수의 stack 메모리에 할당되는 지역변수이기 때문에, 이 지역변수 반환을 시도하는 경우 반환과 동시에 stack 공간이 사라져 반환이 불가능하다고 배웠다.
예시로,
int* create_integer() {
int num = 10;
return #
}
위의 함수는 포인터를 반환하는데, 포인터가 가리키는 변수 num은 함수 내부에서 지역 변수로 선언되었다. 함수가 실행을 마치고 반환을 시도하면 num 변수는 사라지게 되므로, 반환된 포인터는 더 이상 유효하지 않다. 이렇게 반환된 포인터를 사용하려고 하면 에러가 발생할 수 있다.
그렇다면 파이썬에서는 어떨까?하는 궁금증이 생겼다. 지피티에게 물어보니...
Python에서는 변수의 생존 기간과 관련된 개념이 C 언어와 다릅니다. Python에서는 모든 변수는 객체에 대한 참조로 처리됩니다. 이 객체들은 동적으로 관리되며, 메모리 관리는 Python 인터프리터가 자동으로 처리합니다. 따라서 C 언어에서처럼 직접적으로 스택에 변수를 할당하고 해제하는 방식은 아닙니다.
Python에서 함수 내에서 선언된 변수도 함수가 실행될 때 생성되고 함수가 반환될 때 자동으로 메모리에서 해제됩니다. 그러나 Python에서는 함수 내에서 생성된 객체가 함수의 범위를 벗어나더라도 해당 객체에 대한 참조가 있는 한 메모리에서 유지됩니다. 이는 Python의 가비지 컬렉션 기능 덕분입니다. 가비지 컬렉터는 더 이상 사용되지 않는 객체들을 자동으로 해제하여 메모리를 관리합니다.
예를 들어, 다음과 같은 Python 함수를 살펴봅시다:
def create_list():
my_list = [1, 2, 3]
return my_list
위의 함수는 리스트를 반환합니다. `my_list`는 함수 내에서 지역 변수로 선언되었습니다. 함수가 반환될 때 `my_list` 변수는 함수 범위를 벗어나지만, 리스트 객체 `[1, 2, 3]` 자체는 여전히 메모리에 남아 있습니다. 이는 Python의 가비지 컬렉션 기능으로 인해 가능한 일입니다.
따라서 Python에서는 함수 내에서 생성된 객체는 함수의 반환과 상관없이 참조가 있으면 메모리에서 해제되지 않습니다. 이는 C 언어에서의 지역 변수의 스택 해제와는 다른 동작을 보여줍니다.
그렇다고 한다. 생각해보니 A프로그래밍에서 파이썬의 Reference에 대한 개념을 배운 것이 생각났다.
C/C++에서는 동적할당-malloc, new-을 하는 경우에만 heap 메모리에 저장되어 동적으로 관리되는 것과 달리, 파이썬은 항상 힙 메모리에 저장이 되나보당! 확실히 파이썬이 고수준(인간친화적) 언어라서 그런지 메모리구조와 관련하여 이해하기에는 더 어려움이 있는 것 같다.
다음에 가비지 컬렉션에 대해서도 알아봐야겠다 ^0^
'Coding Test > Python' 카테고리의 다른 글
| [Python] Set (집합자료형) (1) | 2024.10.31 |
|---|---|
| [Python] defaultdict란? | 백준 13423번 Three Dots (0) | 2024.07.01 |