Garbage Collector

C ++ 서적을 보다보니 …

자꾸 다음과 같은 말이 나왔다.

” C 에서는 ~ 인데 , C++ 에서는 ~ “

열받아서 데니스 리치가 쓴

C Programming Language

라는 C 서적을 읽다보니 다음과 같은 문구를 만나게 되었다.

The language does not define any storage allocation facility other than static definition and the stack discipline provided by the local variables of functions; there is no heap or garbage collection. Kernighan, Brian W.. C Programming Language (p. 2). Pearson Education. Kindle Edition. 에서 발췌.

(번역)

이 언어( = C 언어를 지칭)는 static 과 함수 내부의 public 외에 어떤 메모리 할당관련한 편의시설도 정의 하지 않는다. 그러므로 , Heap Collection 이나 Grabage Collection 이 없다.

뭐 C 에 가비지 컬렉터가 없는거야 너무 많이 들어서 당연히 알고 있었지만,

” Stack 이니, Static 과 함수내의 Public 등이 무슨 관계가 있는거지 ??? “

이런 의문이 들자. 곧바로 관련 내용을 검색해서 보충했다.

찾아본 글이 대부분 JAVA 관련 설명이긴 했으나, 워낙 기본적인 내용이기도 하고 , C# 도 메모리와 관련하여 크게 다르진 않을 것이다.

힙 메모리와 관련하여

프로그램이 사용하는 메모리를 크게 3가지 부분으로 나눌 수 있는데,

Data Stack Heap

이다.

Data

프로그램의 시작과 끝에 모두 존재하며 , 프로그램이 동작을 멈출때 해지된다. ( 여기서 프로그램이 쓰레드나 프로세스보다 큰 의미에서의 프로그램인지, 아니면 단순히 뭉뚱그리는 것인지는 확인아직 안함) public 과 static 으로 선언한 변수들에 해당한다.

Stack

스택은 이름처럼 스택 자료구조 처럼 , 함수 하나가 실행 될때 push 되고, 함수가 끝날 때 pop 된다. 함수 내에 존재하는 지역변수와 매개변수들이 저장된 것이다.

Heap

위 두가지 메모리로도 충분할 것 같아 보이지만, 컴파일 시에 정해지지 않고, 그 이후에 정해지는 형태의 데이터들 , 다시 말해 프로그래머가 할당한 데이터들은 heap 에 저장된다. 이해를 돕기위해 , 예를 들자면,

int a = int[4]; // 로 하면 함수 내부라면 스택 , static 이나 public 이라면 데이터에 해당하겠지만, 

int b = Random.Range(0,90); // 로 하면 컴파일 되기 전에 알 수 없으니,.. 
// 근데 사실 랜덤 아니고 그냥 숫자를 할당했어도 힙일 것이다. 
int c = int[b]; // 이렇게하면 힙에 저장되는 것

그래서 Heap 은

프로그래머가 할당 및 해제 와 관리를 해주어야 한다.

C# 이나 JAVA 의 경우 그것을 언어 수준에서 지원한다.

그게 바로 Garbage Collector( GC ) 이다.

C 는 그게 없다는 말.

( 물론 구현하는 경우도 있다고 한다. )