메모리에서 스택과 힙의 차이점
한줄 요약
프로그램 메모리는 실행 코드를 위한 코드 영역, 전역/정적 변수를 위한 데이터 영역, 컴파일 시점에 크기가 결정되는 지역 변수 및 매개변수를 위한 스택 영역, 그리고 런타임 시점에 동적으로 크기가 할당되는 객체를 위한 힙 영역으로 구성됩니다.
프로그램이 실행될 때 운영체제로부터 할당받는 메모리 공간은 크게 코드 영역(Code Area), 데이터 영역(Data Area), 스택 영역(Stack Area), 힙 영역(Heap Area)으로 나눌 수 있음
코드 영역 (Code Area)
- 실행할 프로그램의 코드가 저장되는 영역
- 읽기 전용(Read-Only)으로 설정되어 있으며, 프로그램 실행 시작부터 종료까지 메모리에 남아 있음
데이터 영역 (Data Area)
- 전역 변수(Global Variables; C#에서는 static 변수와 유사), 정적 변수(Static Variables), 상수(Constants), 그리고 문자열 리터럴(String Literals)과 같이 프로그램이 시작될 때 할당되어 프로그램이 종료될 때까지 유지되는 데이터가 저장되는 메모리 영역
- 프로그램의 전반적인 생애 주기 동안 접근 가능한 공통 데이터를 저장하는 데 사용
- 초기화된 데이터와 초기화되지 않은 데이터 영역으로 구분
스택 영역 (Stack Area)
- 컴파일 시점에 크기가 대부분 결정되며, 함수 호출 및 지역 변수 관리를 위해 사용되는 메모리 영역
- 주로 값 형식(Value Type) 데이터가 저장
(예: int, float, bool, char, struct 등)
- 함수(메서드)가 호출될 때마다 해당 함수의 매개변수, 지역 변수, 그리고 함수 호출 정보 등이 스택 '프레임(Frame)' 형태로 스택에 누적
- 함수 실행이 끝나면 해당 스택 프레임은 스택에서 자동으로 제거
(LIFO: Last-In, First-Out 구조)
- 메모리 할당 및 해제가 매우 빠르고 효율적입니다. 이는 데이터가 순서대로 쌓이고 제거되기 때문에 메모리 조각화(Fragmentation)가 발생하지 않음
- 크기가 작고 고정적인 데이터를 저장하는 데 적합
힙 영역 (Heap Area)
- 런타임(Runtime)에 프로그램에 의해 동적으로 크기가 결정되고 할당되는 메모리 영역
- 주로 참조 형식(Reference Type)의 객체(Object) 데이터가 저장
(예: class의 인스턴스, interface, delegate, string, array
- 객체의 크기가 가변적이고, 컴파일 시점에 확정할 수 없는 요소를 관리하기 위해 사용하는 영역
- 메모리 할당 및 해제가 스택 영역에 비해 복잡함