프로그램이 실행되기 위해서는 메모리에 적절히 로드되어야 하며,
운영체제는 실행을 위해 RAM 내부를 네 가지 영역으로 나누어 관리합니다.
이 네 가지는 바로 Code, Data, Heap, Stack 영역입니다.
1️⃣ Code 영역
- 기계어로 번역된 코드(함수, 명령어 등)가 저장되는 공간
- 보통 읽기 전용으로 되어 있어 수정이 불가능
- CPU가 직접 이 영역을 읽어 명령을 실행
🧩 예: C, Python 등에서 작성한 함수들의 기계어 코드
2️⃣ Data 영역
- 프로그램 실행 중 사용되는 전역 변수(Global variable) 및 정적 변수(Static variable)가 저장됨
- 프로그램이 시작될 때 할당, 종료 시 해제
- 초기화된 데이터와 초기화되지 않은 데이터를 나누어 관리하기도 함
🧩 예: static int count = 0; 같은 변수
3️⃣ Heap 영역
- 동적으로 메모리를 할당할 때 사용하는 영역
- 런타임에 크기가 결정되는 데이터가 저장됨
- 프로그래머가 직접 할당과 해제를 관리해야 함
언어 메모리 관리 방식
| C/C++ | malloc() / free() 등 수동 관리 |
| JavaScript, Java | Garbage Collector에 의해 자동 해제 |
| Swift | ARC (Automatic Reference Counting) 방식 |
- 메모리의 낮은 주소 → 높은 주소 방향으로 확장됨
- 메모리 누수(memory leak) 위험이 존재함
🧩 예: 사용자 입력 크기만큼 배열을 동적으로 할당할 때
4️⃣ Stack 영역
- 함수 호출 시마다 생성되는 스택 프레임이 저장됨
- 지역 변수, 매개변수, 복귀 주소 등이 포함됨
- 함수 호출이 끝나면 자동으로 해제됨
- 후입선출(LIFO) 구조
- 높은 주소 → 낮은 주소 방향으로 확장됨
❗재귀 호출이 깊어지거나, 스택 공간 초과 시 stack overflow 오류 발생
🧩 예: 함수 내 지역 변수 int a = 10;
🔄 힙과 스택의 메모리 상호작용
메모리는 다음과 같은 구조로 배치됩니다:
+----------------------+ ← 낮은 주소
| Code 영역 |
+----------------------+
| Data 영역 |
+----------------------+
| Heap 영역 |
| ↓ 아래 방향 성장 |
+----------------------+
| |
| (Unused 공간) |
| |
+----------------------+
| ↑ 위로 성장 |
| Stack 영역 |
+----------------------+ ← 높은 주소
- Heap과 Stack은 서로 반대 방향으로 성장
- 시스템에 따라 힙이 커지면 스택 영역이 줄어들고, 스택이 커지면 힙이 줄어듦
- 즉, 이 둘은 동시에 무한정 사용할 수 없으며 상호 영향 존재
🎯 마무리 요약
영역 주요 내용 성장 방향
| Code | 기계어 코드 | 고정 |
| Data | 전역/정적 변수 | 고정 |
| Heap | 동적 메모리 | 아래로 성장 |
| Stack | 함수 호출 데이터 | 위로 성장 |
'Programming > 기술 면접' 카테고리의 다른 글
| [개발자 기술 면접 대비] 🌳 검색 자료구조로서 해시 테이블과 이진 탐색 트리 비교 (1) | 2025.07.25 |
|---|---|
| [개발자 기술 면접 대비] 🧩 Hash 충돌 시 내부 데이터 탐색은 어떻게 이루어질까? (1) | 2025.07.25 |
| [개발자 기술 면접 대비] 🔄 I/O와 Non-blocking I/O의 차이 (2) | 2025.07.25 |
| [개발자 기술 면접 대비]🚦동기/비동기 vs 블로킹/논블로킹 – 헷갈리는 개념 한 번에 정리하기 (2) | 2025.07.25 |
| [개발자 기술 면접 대비]💡 블로킹(Blocking)과 논블로킹(Non-blocking)의 차이 (1) | 2025.07.25 |