본문 바로가기
C++

[C++] - 동적 메모리 할당

by 개발 고양이 2023. 12. 7.

1. 정적 메모리 vs 동적 메모리

배열에 대해 처음 배울때, int arr[10], char word[20] 과 같이 보통 배열의 크기를 미리 정해놓고 선언한다. 이처럼 프로그램을 실행하기 전, 미리 정해진 크기의 메모리를 할당받는 것을 정적 메모리 할당이라고 한다. 정적으로 메모리를 할당하게 되면 아주 간단한 방법으로 배열 선언이 가능하다는 장점이 있지만, 할당한 크기 이상으로는 사용이 불가능하며, 공간 낭비를 초래할 수 있어 비효율적이기도 하다. (예를 들어, 100개의 이름을 저장할 수 있는 배열을 선언하고 실제로는 20명의 이름만 저장한다면, 나머지 80개만큼의 공간이 낭비되게 된다.)

다른 방법으로는 동적 메모리 할당이 있다. 프로그램 실행 도중에 필요한 만큼의 메모리를 할당받고, 사용이 끝나면 메모리를 다시 반납하는 방식이다. 필요한 만큼만 할당받아 사용한 후 반납하기 때문에 메모리를 매우 효율적으로 사용할 수 있다는 장점이 있다. 

 


2. 배열 동적 할당하기

배열을 정적 할당할 경우, 코드는 다음과 같이 간단하다.

int arr[10];

하지만 배열의 크기가 고정되어 있어 경우에 따라 메모리가 부족하거나 낭비될 수 있다.

 

그렇다면 메모리를 효율적으로 활용하기 위해 배열을 동적 할당하기 위해서는 어떻게 해야 할까?

C++에서는 new 연산자delete 연산자를 사용한다. 

//동적 할당
데이터타입 *포인터변수 = new 데이터타입 [배열의 크기];

//메모리 반납
delete [] 포인터변수;

 

예를 들어, 정수 n을 입력받아 n 크기의 정수 배열을 만든다면 코드는 아래와 같다. 

int n;
cin >> n;  //n을 키보드로부터 입력받기
int *arr = new int[n];

/* ...코드... */

delete []arr;

 

 


참고로 C언어에서는 malloc()과 free()를 사용하여 동적 할당, 반납을 한다.

int *arr = (int *)malloc(n * sizeof(int));
free(arr);

 

C++에서도 stdlib.h 헤더파일을 추가해준다면 이 방법으로도 동적 할당이 가능하지만, new와 delete를 이용하는 것이 더 간편한 방법이다. 따라서 C++을 이용하여 코드를 짠다면 new와 delete만 기억하고 있어도 충분할 것이다.