Dispose/Finalize 

Dispose/Finalize 차이는 소멸자 호출 여부이다.


.net은 GC(Garbage Collector)에서 메모지(자원)을 관리한다. 개발자가 직접적으로 관리를 원할 경우에 사용하는 것이다.


간단하게 말하자면

Dispose : USING과 호환되며 주로 File, Database 호출 밎 조작할때 사용된다. Dispose에서는 GC에서 지우기는 하지만 소멸자 호출을 하지 않는다. 

차후 GC가 알아서 관리하면서 호출하는 것 같다.


Finalize : Destructor를 호출해서 완전하게 메모리에서 지운다.




좀 더 자세하게 들어가자면 소멸자를 이해하기 전에 객체와 메모리에 대해서 알아야한다.


객체와 메모리

객체 생존 기간

객체는 new 연산자에 의해 메모리를 할당 하고 생성자에 의해 메모리에 있는 객체가 초기화 된다.

반대로 소멸되는 경우에는 먼저 Finalize 메소드를 이용하여 메모리를 초기화 되지 않은 상태로 돌린다.


다음으로 이메모리 공간을 Heap에 반환하는 것이다. 그러므로 객체의 존속기는 new를 이용하여 메모리를 할당받는 순간부터 메모리를 Heap에 반환 할 때 까지이다.



GC(Garbage Collector)

C#의 경우 기존의 C/C++ 처럼(new, delete) 프로그래머가 메모리 관리를 하지 않아도 된다.

CLR에서 자동으로 알아서 소멸 시켜 준다. 또한 C#의 경우 명시적으로 코드상에서 객체를 소멸 할 수 없는 대신 Garbage Collector라는 것을 지원 해 준다. 


Garbage Collector는 메모리에 있는 참조가 끝난 객체를 쓰레기 치우는 것처럼 소멸 시키는 역할을 하는 것 이다. 

메모리가 부족 하다고 판단이 들면 Garbage Collector는 참조되는 않는 객체의 메모리 영역을 청소하여 Heap에 반환을 하는 것이다. 


또한 Garbage Collector는 객체를 오직 한번만 제거해 버리며 참조되고 있지 않은것들만 제거 한다. 프로그래머다 일일이 코드를 통해 기술 했을때의 문제인 객체를 반복해서 소멸 한다든지, 참조되고 있는객체를 소멸한다든지 하는것은 막아 주는 것이다. 

코딩 상에서 Garbage Collector에거 명시적으로 객체를 소멸 시켜 달라고 할 수 있으나 그것은 객체를 소멸 시켜도 된다는 것을 알리는 역할을 할 뿐이지 즉시 작동 하는 것은 아니다.


'Develop > C#' 카테고리의 다른 글

박싱과 언박싱  (0) 2016.12.07
using  (0) 2016.12.01
프로젝트 exe 파일(Release 버전) 생성  (1) 2016.11.15
ListBox items Random 함수 사용  (0) 2016.11.15

+ Recent posts