해결된 질문
작성
·
21
0
몇 챕터/몇 강을 수강 중이신가요? 03_06_stack.py
어떤 알고리즘을 학습하고 계신가요? 스택
여기까지 이해하신 내용은 무엇인가요? 스택이 기존 링크드 리스트 자료구조에 기반한 알고리즘.
어느 부분에서 막히셨나요? pop함수에서 self.head = self.head.next로 원래 head를 다음노드로 옮기는 부분.
코드의 어떤 로직이 이해가 안 되시나요? head가 옮겨 졌다 라는 걸로 pop 라는 개념을 표현하신 거 같은데 원래 self.head는 메모리에서 안사라진거 아닌가요? 메모리는 계속 점유하고 있을거고, 그저 head의 위치만 바꿔준 거니 표면적으로 보이기에만 pop인것 같은데 편의상 이렇게 하신건지 정말 pop이라는 개념 자체가 제거가 아닌 head를 옮기는 개념인건지 잘 모르겠습니다.
이렇게 구체적으로 알려주시면, 더 정확하고 도움이 되는 답변을 드릴 수 있습니다! 😊
답변 1
0
안녕하세요 애롱님 좋은 질문 감사합니다!!
원래 head 노드는 메모리에서 완전히 제거됩니다. Python에는 가비지 컬렉터라는 기능이 있어서, 더 이상 사용되지 않는 메모리를 자동으로 찾아서 해제하게 됩니다
이는 참조 카운팅에 의해서 동작합니다. Python은 각 객체가 몇 번 참조되고 있는지 계속 세고 있습니다
python
def pop(self):
delete_head = self.head # 이 순간 원래 head 노드의 참조 카운트: 2개
self.head = self.head.next # self.head가 다른 노드를 가리킴 (참조 카운트 1개로 감소)
return delete_head # 함수가 끝나면 delete_head 변수도 사라짐 (참조 카운트 0이 됨)
참조 카운트가 0이 되는 순간, Python은 "아 이 메모리 더 이상 필요 없구나"라고 판단하고 즉시 메모리에서 제거해버립니다.
C나 C++에서는 개발자가 직접 free()
나 delete
를 호출해야 하지만, Python, Java, JavaScript 같은 언어들은 모두 이런 식으로 자동 메모리 관리를 해줍니다.
정리하면, self.head = self.head.next
는 단순히 포인터만 옮기는 게 아니라, 실제로 원래 노드를 메모리에서 제거하는 완전한 pop 연산이에요. Python이 뒤에서 알아서 처리해주게 됩니다!
혹시 더 궁금한 점 있으면 언제든 물어보세요. 이런 깊이 있는 질문 정말 좋습니다!! 감사합니다
답변 감사합니다!! 저는 swift로 개발을 하고 있는데, swift의 ARC와 기능이 비슷한 것 같네요!