이 Step에서 다루는 것
- 프로그램 메모리 영역 4가지(코드/데이터/스택/힙) 복습
- “왜 힙(동적 할당)이 필요한가?”를 스택·데이터의 한계로 증명
new/malloc이 실제로 하는 일: OS에 메모리 요청 → 시작 주소(pointer) 반환
- 힙을 쓰면 생기는 필수 책임: 해제(수명 관리), (감각) 단편화
학습 목표
- “스택/데이터로 해결 못 하는 문제”를 수명/크기 관점에서 설명할 수 있다.
- 동적 할당이 “메모리를 하나 더 만드는 마법”이 아니라 주소를 받아서 관리하는 방식임을 설명할 수 있다.
메모리 영역 복습(코드/데이터/스택/힙)
- 코드 영역(Text): 실행 코드(명령어). 보통 프로그램 동안 1개
- 데이터 영역(Data/BSS): 전역 변수, 정적(static) 변수. 프로그램 시작~종료까지 유지
- 스택(Stack): 함수 호출 단위로 쌓이는 메모리(지역 변수/매개변수 등). 보통 스레드마다 크기 제한
- 힙(Heap): 실행 중 “필요할 때” 할당/해제하는 메모리 영역
메모리 영역 구조(감각)
┌─────────────────────────────────────────────────────────────────────────────┐
│ 코드 영역 │ 데이터 영역 │ 스택 영역 │ 힙 영역 │
├─────────────────────┼─────────────────────────────┼─────────────────┼───────────┤
│ 실행 코드 │ 전역·정적 변수 │ 지역 변수 │ new/malloc│
│ (대체로 고정) │ (시작~종료까지 유지) │ (호출~리턴) │ (필요시) │
└─────────────────────────────────────────────────────────────────────────────┘
스택·데이터의 한계(= “힙이 필요한 이유”)
스택(Stack)의 한계: “크기 제한 + 짧은 수명”
- 스택은 보통 크기가 고정(스레드별 제한)이라 큰 배열/객체를 올리면 위험합니다.
- 지역 변수는 함수가 끝나면 바로 사라지므로(수명 종료) “오래 살아야 하는 데이터”에 부적합합니다.
Monster monsters[1'000'000];
데이터(Data)의 한계: “너무 긴 수명(항상 유지)”
- 데이터 영역은 한 번 잡히면 프로그램 종료까지 유지됩니다.
- “유저가 1명일 때는 0마리, 1만 명일 때는 50만 마리”처럼 규모가 요동치는 게임 객체를
데이터 영역으로 잡으면 항상 메모리를 붙잡고 있어 비효율이 됩니다.
결론
- “실시간 생성/소멸이 필요한 수많은 객체”는
스택(너무 작고 짧음) / 데이터(너무 길고 고정) 만으로는 운영이 어렵습니다.
- 그래서 “필요할 때 늘리고, 필요 없으면 줄이는” 힙(동적 할당)이 필요합니다.
동적 할당(Dynamic Allocation) = 주소를 받아 관리하는 방식
동적 할당의 흐름은 한 줄로 요약됩니다.
그리고 중요한 사실:
- 우리 프로그램은 메모리를 직접 늘릴 수 없어서, 내부적으로 운영체제(또는 런타임/할당자)에 요청합니다.
new/malloc은 “할당된 영역의 시작 주소(pointer)”를 돌려줍니다.
실전에서 기억할 점:
- 힙은 “편한 만큼” 위험도 같이 옵니다. 해제 누락(메모리 누수), 잘못된 해제, (감각) 단편화가 대표적입니다.
(다음 Step에서 malloc/free vs new/delete로 정확히 비교합니다.)