Stack?
Stack(스택)은 메모리의 영역 중 하나로 지역 변수와 매개변수가 저장되는 영역입니다. 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸하게 됩니다.함수가 호출되면 스택에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소값, 함수에서 선언된 지역 변수 등이 저장됩니다. 이렇게 스택 영역에 차례대로 저장되는 함수의 호출 정보를 스택 프레임(Stack Frame)이라고 합니다.
스택은 한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형구조이며 후입 선출(LIFO - Last In First Out) 구조로 되어 있습니다. 자료를 넣는 과정을 '밀어 넣는다' 라고 하여 푸쉬(Push)라고 하며 반대로 넣어둔 자료를 꺼내는 것을 팝(Pop) 이라고 합니다. 이때 나중에(최근에) 넣은(푸쉬한) 값이 먼저 나오게 됩니다.
예를 들자면 a부터 b와 c를 순서대로 넣은 다음 자료를 하나씩 꺼내면 c 부터 b와 a의 순서로 나오게 됩니다.
또한, 스택 영역에는 기본적으로 1MB에 가까운 영역이 할당되며, 만약 해당 영역을 벗어나는 경우에는 스택 오버플로우(Stack Overflow)가 발생하며 런타임 에러가 발생할 수 있습니다.
Stack Frame?
Stack Frame은 함수의 매개변수, 지역 변수, 반환 주소값 등 하나의 함수 호출에 대한 정보가 묶인 단위입니다. 이 데이터들은 물리적으로는 스택영역에 저장되고, 해당 데이터들을 하나의 함수 단위로 묶어서 부르는 단위를 스택 프레임이라고 합니다.
- Stack(스택): 메모리 공간의 일부 영역 (RAM에서 함수 호출 정보가 쌓이는 구역)
- Stack Frame(스택 프레임): 함수 하나가 호출될 때 스택에 쌓이는 묶음의 단위
예시로 들자면 이렇게 비교해서 볼 수 있겠습니다.
- Stack(스택): 택배 창고
- Stack Frame(스택 프레임): 함수 한 번 호출에 대한 하나의 택배상자
- 매개 변수, 지역 변수: 반환 주소 : 상자 안에 들어있는 내용물
즉, 매개변수, 지역 변수, 반환 주소값 등은 스택이라는 메모리 영역에 저장되며, 이들을 함수 호출 단위로 묶은 개념이 스택 프레임이라고 볼 수 있겠습니다.
void Function(int b)
{
Function_Two(b);
}
void Function_Two(int c)
{
//Empty
}
int main()
{
int a = 10;
Function(a);
return 0;
}
해당 내용의 코드 구문이 있다면
- `main()` 함수에서의 int 자료형 a를 매개변수로 전달하는 `Function()` 함수 호출
- `Fuction(int b)`함수에 int 자료형 b를 매개변수로 전달하는 `Function_Two(c)` 함수 호출
- `main()` 함수 종료
순서로 코드가 진행될 것입니다. 여기서 먼저 `main()`함수가 스택 영역에 스택 프레임 (매개변수, 반환될 주소의 값, 지역 변수)이 스택 영역에 할당이 될 것입니다.
그 뒤에 `main()`에서 호출한 `Function(int b)` 함수도 마찬가지로 스택 영역에 스택 프레임이 스택영역에 할당이 되고 마지막으로 `Function_Two(int c)` 마찬가지로 스택 영역에 할당되게 됩니다.
여기서 마지막으로 `Fuction_Two(int c)`의 함수가 종료되면 스택은 LIFO(Last-In-First-Out, 가장 늦게 들어간 데이터가 가장 먼저 나온다.)에 따라서 `Function_Two(c)`의 스택 프레임을 먼저 인출하게 됩니다.
Stack Overflow(스택 오버플로우)
Stack Overflow는 스택 영역에 할당된 1MB에 가까운 영역을 초과해서 할당을 시도하면 생기는 에러 중 하나입니다. 일반적으로 재귀 함수의 호출로 인해 생기게 되며 스택 플로우가 스택의 영역 보다 더 큰 메모리 값을 할당을 시도하게 되면 발생하게 됩니다. 이런 경우에는 스택 오버플로우에 의해서 프로그램이 강제 종료가 되거나, 프로그램의 오동작을 유발하게 됩니다.
'Software Engineering > Software Development Principles' 카테고리의 다른 글
Virtual Memory ( 가상 메모리 ) (0) | 2025.05.16 |
---|---|
객체 지향 설계의 5가지 원칙 - S.O.L.I.D (0) | 2025.05.16 |
Cache Memory(캐시 메모리) (0) | 2025.05.14 |
RAM (Random-Access Memory, 랜덤 액세스 메모리) (0) | 2025.05.13 |
FSM (Finite State Machine, 유한 상태 기계) (0) | 2025.05.12 |