학습
C++ 동적 메모리 할당
C++ 동적 메모리 할당 — 중급
동적 메모리 할당
1. 도입 (왜 배워야 하는가)
동적 메모리 할당은 프로그램 실행 중에 필요한 메모리를 유동적으로 할당하고 해제할 수 있는 기능입니다. 실무에서는 데이터의 크기가 사전에 정해져 있지 않거나, 사용자 입력에 따라 데이터의 크기가 변동하는 경우가 많습니다. 예를 들어, 쇼핑몰에서 장바구니에 담기는 상품의 수는 사용자마다 다르기 때문에 동적 메모리 할당이 필수적입니다.
동적 메모리 할당을 모르면 메모리 부족, 메모리 낭비, 또는 프로그램의 비정상 종료와 같은 문제가 발생할 수 있습니다. 특히, 배열의 크기를 고정하면 메모리가 불필요하게 낭비되거나, 필요할 때 메모리가 부족해지는 상황이 발생할 수 있습니다.
2. 핵심 개념 설명
동적 메모리 할당은 주로 new와 delete 연산자를 사용하여 수행됩니다.
- new: 메모리를 동적으로 할당하고, 해당 메모리의 주소를 반환합니다.
- delete: 할당된 메모리를 해제하여 메모리 누수를 방지합니다.
관련 용어 정리
| 용어 | 설명 |
|---|---|
| 메모리 누수 | 할당된 메모리를 해제하지 않아 발생하는 문제 |
| 포인터 | 메모리의 주소를 저장하는 변수 |
| 동적 배열 | 런타임에 크기가 변하는 배열 |
3. 기본 코드 예제
아래는 동적 메모리 할당의 기본 사용법을 보여주는 예제입니다.
#include <iostream>
using namespace std;
int main() {
int* array = new int[5]; // 5개의 int 크기 배열을 동적으로 할당
for (int i = 0; i < 5; i++) {
array[i] = i + 1; // 배열에 1부터 5까지의 값 저장
}
for (int i = 0; i < 5; i++) {
cout << array[i] << " "; // 배열의 값을 출력
}
cout << endl;
delete[] array; // 동적으로 할당한 메모리 해제
return 0;
}
실행 결과:
1 2 3 4 5
코드 한 줄씩 동작 설명:
int* array = new int[5];: 5개의 정수를 저장할 수 있는 메모리를 동적으로 할당하고, 그 주소를array포인터에 저장합니다.array[i] = i + 1;: 1부터 5까지의 값을 배열에 저장합니다.cout << array[i] << " ";: 배열의 각 요소를 출력합니다.delete[] array;: 사용이 끝난 동적 메모리를 해제하여 메모리 누수를 방지합니다.- 동적 메모리 할당은 메모리를 유동적으로 관리할 수 있는 중요한 기능입니다.
new와delete를 사용하여 메모리를 할당하고 해제해야 합니다.- 동적 배열을 사용하여 사용자 맞춤형 데이터 구조를 구현할 수 있습니다.
- 메모리 해제를 잊지 않도록 주의해야 하며, 사용법을 잘 숙지해야 합니다.
4. 실전 활용 예제
예제 1: 쇼핑몰 장바구니 구현
#include <iostream>
#include <string>
using namespace std;
int main() {
int itemCount;
cout << "장바구니에 담을 상품의 수를 입력하세요: ";
cin >> itemCount;
string* cart = new string[itemCount]; // 사용자가 입력한 수만큼의 상품 이름 저장
for (int i = 0; i < itemCount; i++) {
cout << "상품 " << (i + 1) << " 이름을 입력하세요: ";
cin >> cart[i];
}
cout << "장바구니에 담긴 상품 목록:" << endl;
for (int i = 0; i < itemCount; i++) {
cout << cart[i] << endl;
}
delete[] cart; // 메모리 해제
return 0;
}
예제 2: 동적 배열을 이용한 학생 성적 관리
#include <iostream>
using namespace std;
int main() {
int studentCount;
cout << "학생 수를 입력하세요: ";
cin >> studentCount;
double* scores = new double[studentCount]; // 학생 수만큼 성적 저장
for (int i = 0; i < studentCount; i++) {
cout << "학생 " << (i + 1) << "의 성적을 입력하세요: ";
cin >> scores[i];
}
double total = 0;
for (int i = 0; i < studentCount; i++) {
total += scores[i]; // 총 성적 합산
}
cout << "전체 평균 성적: " << (total / studentCount) << endl;
delete[] scores; // 메모리 해제
return 0;
}
5. 흔한 실수와 주의사항
실수 1: 메모리 해제를 잊는 경우
int* array = new int[10]; // 메모리 할당
// ... (사용 코드)
// delete[] array; // 해제가 없으면 메모리 누수 발생
올바른 코드:
delete[] array; // 반드시 해제
실수 2: 잘못된 delete 사용
int* array = new int[10];
// ...
delete array; // 배열 메모리 해제 시 잘못된 방법
올바른 코드:
delete[] array; // 배열은 delete[]로 해제
6. 정리
다음에 학습하면 좋은 주제: 스마트 포인터 (C++11 이상), RAII(리소스 획득은 초기화), 컨테이너 클래스를 활용한 메모리 관리.