스택 & 힙
기술노트
📚 스택 (Stack) & 힙 (Heap)
스택(Stack)과 힙(Heap)은 프로그램이 실행될 때 운영체제로부터 할당받는 메모리 공간의 대표적인 두 영역입니다. 두 공간은 할당 방식, 관리 주체, 저장되는 데이터의 종류 등에서 명확한 차이를 보입니다.
🥞 스택 (Stack)
스택은 함수의 호출과 관련된 지역 변수, 매개변수 등이 저장되는 임시 메모리 공간입니다. 데이터가 순서대로 쌓이는 '후입선출(LIFO, Last-In-First-Out)' 구조를 가집니다.
- 관리 주체 : 컴파일러 (자동 관리)
- 할당/해제 : 함수가 호출될 때 생성되고, 함수 실행이 끝나면 자동으로 해제됩니다.
- 속도 : 미리 정해진 공간에 순차적으로 쌓기만 하면 되므로 속도가 매우 빠릅니다.
- 크기 : 컴파일 시에 크기가 결정되며, 상대적으로 작습니다. (크기를 넘어서면 '스택 오버플로우' 발생)
🧱 힙 (Heap)
힙은 프로그래머가 코드를 통해 동적으로 할당하고 해제하는 메모리 영역입니다. 객체, 인스턴스, 배열 등 크기가 크거나 런타임에 크기가 결정되는 데이터가 저장됩니다.
- 관리 주체 : 프로그래머 (수동 관리, GC가 있는 언어는 자동 수거 지원)
- 할당/해제 : `new`와 같은 키워드로 할당하고, 개발자가 직접 해제하거나 GC가 해제합니다.
- 속도 : 빈 공간을 찾아 할당해야 하므로 스택보다 상대적으로 느립니다.
- 크기 : 런타임에 크기가 결정되며, 스택보다 훨씬 큰 메모리 공간을 할당받을 수 있습니다.
🆚 주요 차이점 요약
구분 | 스택 (Stack) | 힙 (Heap) |
---|---|---|
저장 대상 | 지역 변수, 매개변수 (작고, 정해진 크기) | 객체, 인스턴스 (크고, 동적인 크기) |
관리 주체 | 컴파일러 (자동) | 프로그래머 / GC (수동/자동) |
생명 주기 | 함수와 동일 | 직접 해제 전까지 |
속도 | 빠름 | 느림 |
💡 개발자 핵심 Point
- 원시 타입(Primitive Type) 변수(int, char 등)는 주로 스택에 저장되고, 참조 타입(Reference Type) 변수(객체, 배열 등)는 힙에 실제 데이터가 저장되고 스택에는 그 주소 값만 저장됩니다.
- 스택은 정적이고 예측 가능하게, 힙은 동적이고 유연하게 메모리를 사용하기 위해 분리되어 있습니다.
- 스택 오버플로우는 주로 무한 재귀 호출 시 발생하며, 메모리 누수는 힙에 할당된 객체를 해제하지 않았을 때 발생합니다.