Menu
Coddy logo textTech

스택 vs 힙 메모리

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

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

스택은 빠르고 자동화된 메모리입니다. 함수 내부에서 선언된 변수들은 이곳에 저장되며, 범위를 벗어나면 자동으로 소멸됩니다.

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

힙(heap)은 더 크지만 속도가 느린 메모리로, 사용자가 직접 관리합니다. 힙에 있는 객체는 명시적으로 삭제할 때까지 유지됩니다.

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

주요 차이점:

스택 (Stack)힙 (Heap)
빠른 할당느린 할당
제한된 크기큰 용량
자동 정리수동 정리 필요
고정 크기 객체동적 크기 객체

작고 수명이 짧은 객체에는 스택 할당을 사용하세요. 객체가 해당 스코프를 벗어나서도 유지되어야 하거나 크기가 런타임에 결정되는 경우에는 힙 할당을 사용하세요.

힙 메모리를 삭제하는 것을 잊으면 메모리 누수(memory leaks)가 발생하며, 이는 C++ 프로그램에서 흔히 발생하는 버그의 원인입니다.

challenge icon

챌린지

쉬움

객체가 생성되고 소멸되는 방식을 추적하는 간단한 Counter 클래스를 빌드하여 스택(stack) 메모리와 힙(heap) 메모리의 차이점을 살펴보겠습니다.

코드를 정리하기 위해 두 개의 파일을 생성합니다:

  • Counter.h: private name 속성(string)을 가진 Counter 클래스를 정의합니다. 이름을 매개변수로 받아 "Creating: <name>"를 출력하는 생성자와, "Destroying: <name>"를 출력하는 소멸자를 포함하세요. 카운터의 이름을 반환하는 getName() 메서드를 추가합니다.
  • main.cpp: 스택 할당과 힙 할당을 모두 보여줍니다. 입력으로부터 이름을 읽은 후 다음을 수행합니다:
    • 해당 이름을 사용하여 스택에 할당된 Counter를 생성합니다.
    • "HeapCounter"라는 이름으로 힙에 할당된 Counter를 생성합니다.
    • 두 카운터의 이름을 "Stack: <name>""Heap: <name>" 형식으로 출력합니다.
    • 메모리 누수를 방지하기 위해 힙에 할당된 카운터를 삭제(delete)합니다.

각 객체를 생성하고 삭제하는 시점에 따라 생성자 및 소멸자 메시지가 서로 다른 순서로 나타나는지 확인해 보세요. 스택 객체는 main()이 종료될 때 자동으로 소멸되지만, 힙 객체는 명시적으로 삭제해야 합니다.

main.cpp에서 #include "Counter.h"를 사용하여 헤더 파일을 포함하세요.

치트 시트

C++ 프로그램은 두 가지 주요 메모리 영역인 스택(stack)힙(heap)을 사용합니다.

스택은 빠르고 자동화된 메모리입니다. 함수 내부에서 선언된 변수들은 이곳에 저장되며, 범위를 벗어나면 자동으로 소멸됩니다:

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

은 더 크지만 속도가 느린 메모리로, 사용자가 직접 관리해야 합니다. 힙에 생성된 객체는 명시적으로 삭제할 때까지 유지됩니다:

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

주요 차이점:

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

작고 수명이 짧은 객체에는 스택 할당을 사용하세요. 객체가 범위를 벗어나서도 유지되어야 하거나 런타임에 크기가 결정되는 경우에는 힙 할당을 사용하세요. 힙 메모리를 삭제하는 것을 잊으면 메모리 누수(memory leaks)가 발생합니다.

직접 해보기

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

using namespace std;

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

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

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

    // TODO: 스택 카운터 이름을 "Stack: <name>" 형식으로 출력

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

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

    return 0;
}
quiz icon실력 점검

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

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