프로그램이 실행되면 운영체제로부터 할당받은 메인 메모리 내부에서 스택(Stack)과 힙(Heap)이라는 두 가지 핵심 메모리 영역이 활용됩니다. 이번 글에서는 스택과 힙의 개념과 함께, 두 메모리 영역의 구조적 차이와 장단점을 자세히 살펴보겠습니다.
스택(Stack)이란?
스택은 함수 호출과 지역 변수 저장에 주로 사용되는 메모리 영역으로, 다음과 같은 특징을 가집니다.
선형(linear) 자료구조로, 데이터가 순차적으로 쌓이는 LIFO(Last-In-First-Out) 방식으로 동작합니다.
메모리가 연속적인(contiguous) 블록 형태로 할당됩니다.
메모리의 할당과 해제가 컴파일러의 지시에 따라 자동으로 이루어집니다.
구축 및 유지 비용이 적게 들고, 구현이 매우 간단합니다.
크기가 고정되어 있어 유연성이 떨어집니다.
크기가 고정되어 있기 때문에 메모리 부족이 발생할 수 있으며, 블록이 모두 채워지지 않으면 메모리가 낭비되기도 합니다.
요소 접근 속도가 빠르고, 참조 지역성(locality of reference)이 매우 우수하여 캐시 효율이 뛰어납니다.
힙(Heap)이란?
힙은 실행 시점에 동적으로 생성되는 객체나 데이터를 저장하는 메모리 영역으로, 다음과 같은 특징을 가집니다.
계층적(hierarchical) 자료구조입니다.
메모리가 임의의(random) 방식으로 할당됩니다.
메모리의 할당과 해제를 프로그래머가 직접 관리합니다(C 언어의 malloc/free처럼요. Java나 C#처럼 가비지 컬렉터가 자동으로 처리해 주는 언어도 있습니다).
구축 및 유지 비용이 상대적으로 많이 듭니다.
힙 구조는 구현이 복잡하고 어렵습니다.
요소 접근에 스택보다 더 많은 시간이 소요됩니다.
가장 큰 단점은 메모리 단편화(fragmentation)가 발생할 수 있다는 점입니다.
실행 중에 크기 조정(확장·축소)이 가능하므로 메모리 낭비가 적습니다.
참조 지역성은 스택에 비해 다소 떨어지지만, 그래도 충분한 수준을 유지합니다.
스택 vs 힙: 주요 차이점 한눈에 보기
| 구분 | 스택(Stack) | 힙(Heap) |
|---|---|---|
| 자료구조 | 선형 구조 | 계층 구조 |
| 메모리 할당 방식 | 연속된 블록 | 임의의 위치 |
| 할당·해제 주체 | 컴파일러(자동) | 프로그래머 또는 GC(수동/자동) |
| 크기 변경 | 불가능(고정) | 가능(동적) |
| 접근 속도 | 빠름 | 상대적으로 느림 |
| 참조 지역성 | 매우 우수 | 보통 |
| 주요 단점 | 메모리 부족, 공간 낭비 | 메모리 단편화 |
| 구현 난이도 | 쉬움 | 어려움 |
마무리
정리하자면, 스택은 자동으로 관리되며 빠르지만 크기가 고정되어 있는 반면, 힙은 유연하게 크기를 조절할 수 있지만 관리 비용과 단편화 문제가 발생할 수 있습니다. 따라서 짧은 수명의 지역 변수나 함수 호출 정보는 스택에, 실행 중 동적으로 생성되는 대용량 데이터나 객체는 힙에 배치하는 것이 효율적입니다. 두 메모리 영역의 특성을 정확히 이해하면 메모리 누수나 성능 저하 같은 문제를 예방하는 데 큰 도움이 됩니다.
아래 그림은 메인 메모리 내부에서 프로세스가 스택과 힙 영역을 어떻게 사용하는지 보여줍니다.
