Menu
Coddy logo textTech

스택 vs 힙 메모리

Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 104개 중 12번째.

C++ 프로그램은 두 가지 주요 메모리 영역인 스택heap을 사용합니다. 객체가 어디에 존재하는지 이해하는 것은 효율적이고 버그가 없는 코드를 작성하는 데 매우 중요합니다.

스택은 빠른 자동 메모리입니다. 함수 내부에서 선언된 변수는 이곳에 존재하며, 범위를 벗어나면 automatically 소멸됩니다.

void example() {
    int x = 10;           // 스택 할당
    Player player;        // 스택 할당 - 자동으로 소멸됨
}   // x와 player는 여기서 소멸됩니다

heap은 더 크지만 더 느린 memory이며, 이를 수동으로 관리합니다. heap의 객체는 명시적으로 delete할 때까지 유지됩니다.

void example() {
    Player* player = new Player();  // 힙 할당
    // player는 삭제될 때까지 존재함
    delete player;                   // 수동 정리 필요
}

주요 차이점:

StackHeap
빠른 할당더 느린 할당
제한된 크기대용량
자동 정리수동 정리 필요
고정 크기 객체동적 크기 객체

작고 수명이 짧은 객체에는 stack allocation을 사용하세요. 객체가 해당 범위를 넘어 살아 있어야 하거나 크기가 런타임에 결정되는 경우에는 heap allocation을 사용하세요.

heap 메모리를 delete하는 것을 잊으면 C++ 프로그램에서 버그의 흔한 원인인 memory leaks가 발생합니다.

challenge icon

챌린지

쉬움

객체가 어떻게 생성되고 소멸되는지 추적하는 간단한 Counter class를 만들어 스택과 힙 memory의 차이를 살펴보겠습니다.

코드를 구성하기 위해 두 개의 파일을 만듭니다:

  • Counter.h: private name attribute를 가진 Counter class를 define합니다. 이름을 인수로 받고 "Creating: <name>"을 prints하는 constructor와 "Destroying: <name>"을 prints하는 destructor를 포함합니다. counter의 이름을 return하는 getName() method를 추가합니다.
  • main.cpp: 스택과 힙 allocation을 모두 보여 줍니다. input에서 이름을 Read한 다음:
    • 해당 이름을 사용하여 스택에 allocated된 Counter를 Create합니다
    • "HeapCounter"라는 이름으로 힙에 allocated된 Counter를 Create합니다
    • 두 counter 이름을 "Stack: <name>""Heap: <name>" format으로 Print합니다
    • memory leak을 prevent하기 위해 힙에 allocated된 counter를 delete합니다

각 객체를 언제 Create하고 delete하는지에 따라 constructor와 destructor 메시지가 서로 다른 순서로 나타나는 것을 확인하세요. 스택 객체는 main()이 끝날 때 automatically destroyed되지만, 힙 객체는 명시적으로 delete해야 합니다.

#include "Counter.h"를 사용하여 main.cpp에 header file을 include하세요.

직접 해보기

#include <iostream>
#include <string>
#include "Counter.h"

using namespace std;

int main() {
    // 입력에서 이름 읽기
    string inputName;
    cin >> inputName;

    // TODO: inputName을 사용하여 스택에 할당된 Counter 생성

    // TODO: 이름이 "HeapCounter"인 힙에 할당된 Counter 생성

    // TODO: Print stack counter name in format "Stack: <name>"

    // TODO: 힙 카운터 이름을 "Heap: <name>" 형식으로 출력

    // TODO: 메모리 누수를 방지하기 위해 힙에 할당된 카운터 삭제

    return 0;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 C++ 컴파일러