스택 ( Stack )
스택 영역은 프로그램이 실행될 때 함수의 호출과 지역 변수 관리를 담당하는 정적 ( static ) 메모리 공간이다.
프로그램 실행 중에 함수가 호출될 때 자동으로 할당되고, 함수가 종료되면 자동으로 해제되는 임시 저장소이다.
Stack 은 메모리를 LIFO ( Last - In , First - Out 후입선출 ) 방식으로 관리한다.
가장 나중에 들어온 함수나 변수가 가장 먼저 제거된다는 뜻이다.
함수가 중첩 호출될 때 ( Stack Frame 이 쌓일 때 ) , 각 함수의 지역 변수나 매개변수는 이 Stack 에 차곡차곡 쌓인다.
작동 원리
- 프로그램이 실행되면, 운영체제는 프로세스마다 Stack 영역을 일정 크기로 미리 할당한다.
- 함수가 호출될 때마다 Stack 에 Stack Frame ( 스택 프레임 ) 이 만들어진다
└ 이 프레임은 함수의 지역 변수 , 매개변수 , 반환 주소를 포함한다. - 함수가 종료되면 해당 프레임은 Stack 에서 제거되어 자동으로 메모리가 해제된다.
└ 이 과정은 매우 빠르며 , 명시적인 해제가 필요 없다.
Stack 은 함수의 생명주기 ( Lifetime )와 완전히 동일하게 동작한다.
예시 코드
void Foo()
{
int x = 10; // Stack에 저장
int y = 20; // Stack에 저장
int result = x + y;
}
void Main()
{
Foo(); // 함수 호출 시 Foo()의 Stack Frame 생성
}
- Main( ) 이 호출되면 Main( ) 프레임이 Stack 에 올라간다.
- Foo( ) 가 호출되면 , Foo( ) 프레임의 Main( ) 위에 새로 쌓인다.
- x , y , result 는 모두 Foo( ) 프레임 안의 Stack 영역에 존재한다.
- Foo( )가 끝나면 해당 프레임이 Stack 에서 제거되고, 메모리는 자동 해제된다.
이 구조 덕분에 Stack 은 매우 빠르고 효율적이다.
하지만, 함수가 끝나면 모든 데이터가 사라지므로 장기 저장에는 부적합하다.
Stack 의 주요 특징
| 항목 | 설명 |
| 할당 시점 | 함수가 호출될 때 자동 할당 |
| 해제 시점 | 함수가 종료될 때 자동 해제 |
| 관리 주체 | 컴파일러 / 시스템이 자동 관리 |
| 저장 대상 | 지역 변수 , 매개변수 , 반환 주소 등 |
| 수명 | 함수 실행 중에만 존재 |
| 속도 | 매우 빠름 ( 단순한 포인터 이동으로 관리한다 ) |
| 위치 | 프로세스 메모리의 하단부 , Heap 과 반대 방향으로 성장 |
| 크기 한계 | 정해진 크기를 초과하면 Stack Overflow 발생 |
주의할 점
- Stack Overflow ( 스택 오버플로우 )
└ 함수가 너무 깊게 재귀 호출되거나, 너무 큰 지역 배열을 만들면 Stack 크기를 초과한다.
└ 대표적인 에러 메세지 : System.StackOverflowException - Stack 에 참조형 변수 저장 시 주의
└ Stack 에는 객체의 참조 ( 주소 ) 만 저장된다.
└ 실제 객체 데이터는 Heap 에 존재한다.
└ Stack 은 주소만 잠깐 들고 있다가 함수가 끝나면 사라진다. - Stack 크기는 제한적
└ 보통 수 MB 수준으로, 시스템마다 다르다.
└ 너무 큰 데이터는 Stack 대신 Heap 에 저장해야 한다.
정리
Stack 은 함수 호출 시 자동으로 생성되고 종료 시 해제되는 메모리 영역이다.
지역 변수와 매개변수를 저장하는 매우 빠른 LIFO 구조의 임시 저장소이다.
'⭐C Sharp > 메모리 관리' 카테고리의 다른 글
| 힙 ( Heap ) (0) | 2025.10.10 |
|---|---|
| 가비지 컬렉터 ( GC ) (0) | 2025.10.10 |