메모리에서 변수를 저장하는 부분은 static 영역과 dynamic 영역으로 나뉜다. static영역은 프로그램이 시작될 때부터 종료될 때까지 메모리 공간을 차지하고 있는 전역변수가 저장되어 있다. dynamic 영역에는 local 변수들이 저장되어 있다. dynamic 영역은 stack 영역과 heap 영역으로 나뉜다. 그렇다면 어떤 변수들이 stack영역으로, 어떤 변수들이 heap 영역에 저장될까?

 

1. Stack-dynamic variable

 

    스택 다이나믹 변수는 프로그램에서 함수가 호출되어 실행될 때 아래의 그림과 같이 함수의 지역 변수들이 stack 영역에 저장된다.

func1에서 func2를 호출하고 func2에서 func3을 호출한 경우 위의 그림과 같이 stack영역에 저장된다. func3함수가 종료한 경우 stack영역에서 pop하게 된다. 그 다음 func2가 종료할 경우 stack 영역에는 func1의 지역 변수만 남게 된다. stack-dynamic 변수는 선언문이 수행될 때 storage binding이 일어난다. 즉 컴파일하는 시간에 메모리가 할당되는 것이 아니라 런타임에 storage binding이 일어난다는 것이다. 하지만 type binding은 프로그램이 실행되기 전에 static하게 일어난다.

 

 

2. Heap-dynamic variable

 

    힙 다이나믹 변수에는 두 가지가 있다. 첫 번째는 explicit heap-dynamic variable이고 다른 하나는 implicit heap-dynamic variable이다.

    Java의 경우 모든 객체를 heap 영역에 저장하므로 implicit(암묵적) 힙 다이나믹을 사용한다. implicit heap dynamic은 말 그대로 메모리를 할당이 자동적으로 된다. 배정문(assignment statement)가 실행될 때 heap storage에 binding된다.

    explicit(명시적) heap-dynamic 변수의 경우 프로그래머가 직접 메모리를 할당해주게 된다. 아래는 C언어의 explicit heap-dynamic의 예시이다.

char* explicit = (char*(malloc(sizeof(char)*10);
explicit = "hello\n";
printf("%s", explicit);
free(explicit);

malloc을 이용해 explicit 변수가 사용할 힙 영역을 크기 10만큼 동적할당한다. 저 동적할당문이 실행될 때 메모리가 할당된다. 프로그래머는 동적할당을 받은 변수를 사용한 다음 명시적으로 메모리를 반환해줘야한다. C언어에서는 free를 이용하여 반환해줬다. 만약 free하지 않고 메모리를 가리키는 포인터를 없애는 경우 Garbage 메모리가 생길 수 있다. 또 메모리를 해제하였지만 그 메모리를 가리키고 있는 또 다른 포인터는 그대로 있는 경우가 발생할 수 있다. 그런 포인터를 dangling pointer라고 한다. dangling pointer의 경우 가리키고 있는 엉뚱한 메모리를 읽거나 써서 프로그램에 문제를 발생시킬 수 있으므로 굉장히 조심해야 한다.

+ Recent posts