스택 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++ 프로그램에서 흔히 발생하는 버그의 원인입니다.
챌린지
쉬움객체가 생성되고 소멸되는 방식을 추적하는 간단한 Counter 클래스를 빌드하여 스택(stack) 메모리와 힙(heap) 메모리의 차이점을 살펴보겠습니다.
코드를 정리하기 위해 두 개의 파일을 생성합니다:
Counter.h: privatename속성(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;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.