본문으로 건너뛰기
모던 C++ 심화LESSON 02

메모리는 어디에 존재할까: 스택·힙·정적 영역과 객체 수명

난이도중급 → 심화
예상 시간70분
선수지식이전 강의

2강. 메모리는 어디에 존재할까: 스택·힙·정적 영역과 객체 수명

이번 강의에서 해결할 문제​

“스택은 빠르고 힙은 느리다”만 외우면 중요한 질문을 놓칩니다. 실제 설계에서는 객체가 언제 생성되고 누가 파괴하는가, 주소를 보관한 관찰자가 그때까지 유효한가를 판단해야 합니다. 저장 영역은 성능 구호가 아니라 수명과 소유권을 이해하기 위한 지도입니다.

학습 목표​

먼저 알아야 할 핵심 개념​

일반적인 지역 객체는 블록 진입 시 생성되어 블록 종료 시 자동으로 파괴됩니다. 동적 객체는 별도의 저장소에 만들어지며 명시적인 소유자가 정리해야 합니다. 정적 저장 기간 객체는 프로그램 전체 실행에 가까운 긴 수명을 가지지만 초기화 순서와 공유 상태 문제가 생길 수 있습니다.

종류예파괴 시점의 기본 기준
자동 저장 기간함수 지역 Tracer local선언된 블록을 벗어날 때
동적 저장 기간std::make_unique<Tracer>()의 대상소유 스마트 포인터가 정리될 때
정적 저장 기간함수 내부 static Tracer프로그램 종료 과정

왜 이 문제가 위험한가​

자동 객체의 주소를 장기 저장하면 스코프 종료 뒤 댕글링이 됩니다. 동적 객체에 소유자가 없으면 누수되고, 여러 소유자가 같은 주소를 직접 정리하면 이중 해제가 됩니다. 정적 객체는 오래 산다는 이유로 편리하지만 테스트 간 상태가 남거나 다른 정적 객체와의 파괴 순서에 의존할 수 있습니다.

가장 작은 예제로 시작하기​

storage_duration.cpp
#include <iostream>
#include <memory>
#include <string>
#include <utility>

class Tracer {
public:
explicit Tracer(std::string name) : name_{std::move(name)} {
std::cout << "create " << name_ << '\n';
}
~Tracer() { std::cout << "destroy " << name_ << '\n'; }
private:
std::string name_;
};

Tracer& sharedTracer() {
static Tracer value{"static"};
return value;
}

int main() {
Tracer automatic{"automatic"};
{
auto dynamic = std::make_unique<Tracer>("dynamic");
sharedTracer();
std::cout << "inside block\n";
}
std::cout << "after block\n";
}

코드 한 줄씩 이해하기​

  1. Tracer 생성자와 소멸자는 객체 수명의 시작과 끝을 출력합니다.
  2. automatic은 main이 끝날 때 자동으로 파괴됩니다.
  3. dynamic 변수는 자동 객체지만, 그 안의 unique_ptr가 동적 Tracer를 단독 소유합니다.
  4. 내부 블록 종료 시 dynamic이 파괴되면서 동적 대상도 정리됩니다.
  5. 함수 지역 static은 첫 호출 때 한 번 초기화되고 프로그램 종료까지 살아 있습니다.

실행 결과와 메모리·동작 흐름​

대표적인 출력 순서는 다음과 같습니다.

create automatic
create dynamic
create static
inside block
destroy dynamic
after block
destroy automatic
destroy static

자동 객체는 대체로 생성 역순으로 파괴됩니다. 정적 객체의 종료 순서에 의존하는 설계는 다른 번역 단위까지 확장되면 복잡해지므로 피합니다.

단계별 실습​

흔한 실수와 해결 방법​

언제 사용하고 언제 피할까​

작고 명확한 지역 상태는 자동 객체로 둡니다. 실행 시점에 개수나 구체 타입이 정해지고 스코프 밖 소유가 필요하면 RAII 기반 동적 소유를 고려합니다. 단순히 “클 수 것 같다”는 이유로 동적 할당하거나 전역 상태로 올리지 않습니다.

게임 개발 연결​

프레임 안의 임시 계산 값, 여러 화면 동안 유지되는 데이터, 프로그램 전체 설정은 수명이 다릅니다. 저장 위치보다 실제 사용 기간과 소유자를 먼저 적습니다.

이해 점검 질문 3개​

  1. unique_ptr 변수와 그것이 소유한 동적 객체의 저장 기간은 어떻게 다른가요?
  2. 내부 블록의 자동 객체가 선언 역순으로 파괴되는 점이 RAII에 왜 유용한가요?
  3. 정적 객체로 모든 상태를 보관할 때 테스트가 어려워지는 이유는 무엇인가요?

핵심 요약​

다음 강의 연결​

3강. 포인터를 제대로 이해하기에서 객체 주소를 값으로 보관하고 역참조할 때 필요한 조건을 다룹니다.

MINI QUIZ

메모리는 어디에 존재할까: 스택·힙·정적 영역과 객체 수명 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“메모리는 어디에 존재할까: 스택·힙·정적 영역과 객체 수명” 내용을 실제 작업에 적용한 설명으로 가장 알맞은 것은 무엇인가요?
  2. 문제 2“메모리는 어디에 존재할까: 스택·힙·정적 영역과 객체 수명”의 작업 기준으로 ‘전역·정적 객체로 수명 문제를 숨김’을 진단하거나 바로잡은 선택은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

2강. 메모리는 어디에 존재할까: 스택·힙·정적 영역과 객체 수명 미완료 상태