본문 바로가기
Knowlege book/개발 및 프로그래밍

정적할당과 동적할당

by 가을이짱짱 2006. 4. 8.
반응형
우리가 프로그래밍을 할때 변수를 할당하는 메모리 영역은 크게 스택(stack) 영역과 힙(heap) 영역으로 나뉘어집니다. 스택 영역은 메모리 영역중 매우 적은 영역만을 할당받고 있으며, 나머지 대부분의 영역이 힙 영역입니다. 데이터 구조상 힙 영역이 더 큰 공간을 사용하기에 합리적이기 때문이죠. (이것에 대한 지식은 자료구조 관련 서적을 보시기 바랍니다.) C++ 코드를 예로 들어가며 설명해드리겠습니다.

int a = 73;
char string[100];
strcpy(string, "abc");
코드1. 정적할당의 예

위와 같이 일반적인 변수선언은 스택영역에 메모리를 할당해줍니다. a라는 변수는 정수형이므로 스택영역에 4바이트를, string이라는 변수는 문자형 배열 100칸이므로 1바이트*100인 100바이트를 할당해줍니다.

스택영역은 메모리 할당과 해제가 자동이므로 저렇게 선언해주시고 사용만 하시면 알아서 메모리에서 해제가 됩니다. 스택영역에는 한 번 할당하면 끝까지 할당한 형태로만 사용해야하기 때문에 정적 할당(static allocation)이라고 부르죠.

스택영역과는 달리 힙영역에 할당하는 방식을 동적 할당(dynamic allocation)이라 부릅니다. 힙영역에 메모리를 할당하는 방식은 스택영역에 포인터 변수를 할당하고 그 포인터를 사용해서 힙 영역의 임의의 공간을 가리켜서 그 가리킨 곳부터 원하는 크기만큼을 할당해 사용하는데, 이 크기를 해제하고 또 다른 크기로 재할당하는 등 변화를 줄 수 있기 때문에 동적 할당이라 부르는 것이죠. 다음 그림을 보시기 바랍니다.

동적할당받은 공간은 다른 프로그램으로부터 보호를 받습니다. 힙 영역은 모든 프로그램이 공유하는 영역이기 때문이죠. 그렇기 때문에 보호할 필요가 있는 겁니다. 때문에 동적할당받아서 사용을 한 후, 사용이 끝났으면 이 영역을 해제해주어야 합니다. 그렇지 않으면 프로그램이 종료된 이후에도 보호된 상태로 남아있기 때문에 시스템이 이상한 현상을 보일 수도 있습니다. 다음은 정적할당하는 방법과 해제하는 방법입니다.

int* a = (int*)malloc( sizeof(int) );
char* string = (char*)malloc( sizeof(char) * 100 );
strcpy(string, "abc");

free( a );
free( string );
코드2. 동적할당의 예1 ~ C 컴파일러의 경우

int* a = new int;
char* string = new char[100];
strcpy(string, "abc");

delete a;
delete [] string;
코드3. 동적할당의 예2 ~ C++ 컴파일러의 경우

C++ 컴파일러는 기본적으로 동적할당/해제 연산자인 new와 delete를 제공하지만 C에서는 그렇지 않기 때문에 malloc()과 free()라는 함수를 사용해야 합니다. 하지만 요즘은 C 전용 컴파일러만 있는 경우는 거의 드물기 때문에 C++ 컴파일러를 기준으로 설명하겠습니다.

[출처: 별나라 네트]

반응형