프로그래밍/C++

C++ 문법 - 동적할당

게으른구름 2018. 2. 10. 22:31

< 동적할당 >


프로그래밍을 하다보면 얼마나 큰 변수를 만들어둬야할지 모르겠을 때가 있습니다.


예를 들어서 이름을 저장하는 char 배열을 만든다고 가정합시다.

이 때, 이름이 3글자인 사람, 4글자인 사람, 영어인 사람 등 많은 사람이 있기 때문에 우리는 정확히 몇 칸 짜리 배열을 만들어둬야할지 모릅니다.

그동안 배운 내용을 가지고 만들려면 크기가 모자르면 안 되니 일단 넘지 않을 만큼의 큰 배열을 만들어두고 그 중에서 일부만 사용합니다.


1
2
3
char name[30];
cin >> name;
cout << name << endl;
cs


이렇게 30칸 char 배열을 만든 뒤 이름이 3글자면 7칸만, 4글자면 9칸만 사용합니다.

만약 이름이 '박하늘별님구름햇님보다사랑스러우리'처럼 한글 17글자라면 어떻게 할까요?


이름을 받을 때마다 배열의 크기를 바꾸는 방법이 있습니다.

바로 "동적할당"을 이용하는 방법입니다.


동적할당이란 메모리를 프로그램이 실행되는 중에 할당하는 것을 뜻합니다.



일반적으로 사용하는 포인터는 다음과 같습니다.


1
2
3
4
int a;
int *= &a;
= 20;
cout << *<< endl;
cs


이와 다르게 동적할당 연산자 "new"를 사용하면 다음과 같습니다.


1
2
3
int *= new int;
*= 20;
cout << *b << endl;

cs


두 코드는 같은 결과를 보여줍니다.

new int 라는 코드는 임의의 int 변수를 하나 만들고 그것의 주소를 b에 저장합니다.

이 때 임의의 int 변수 이름이 없다는 점이 위의 코드와 다를 뿐이죠.



다시 본론으로 돌아와 이름을 받을 때마다 배열의 크기를 바꿔봅시다.


배열 동적할당은 다음과 같이 사용합니다.


1
2
3
4
int n;
cin >> n;
char *name = new char[n];
cout << name << endl;
cs


n에 원하는 숫자를 입력하면 그 숫자만큼 큰 배열이 생성됩니다.

위와 마찬가지로 new char[n]이라는 코드는 n칸 짜리 char 배열을 임의로 만들고 그것의 주소를 name에 저장합니다.




동적할당을 사용할 때 유의할 사항이 있습니다.

new를 통해 메모리를 할당받았습니다.

할당받은 메모리가 필요없어진다면 메모리를 원상태로 돌려놓는 작업이 필수적입니다.


원상태로 돌려놓지 않고 계속해서 사용한다면 프로그램을 오래 실행할수록 메모리가 점점 더 많이 필요해지고 불필요한 메모리가 할당됩니다.

이를 위한 delete 연산자가 있습니다.


1
2
int *temp = new int;
delete temp;
cs


new로 temp에 할당된 메모리를 원상태로 돌려놓는 연산자입니다.


배열을 할당받은 경우는 다음과 같이 돌려놓을 수 있습니다.


1
2
int *temp = new int[100];
delete[] temp;
cs