posted by 방랑군 2012. 1. 18. 23:16

출처 :   http://blog.naver.com/PostList.nhn?blogId=seokcrew&from=postList&categoryNo=13 

객체가 사라질 때 정리 작업을 수행한다.
생성자와 소멸자는 프레임워크에 의해 자동으로 호출된다.
C#에서는 다른 언어에 비해 소멸자를 잘 사용하지 않으며 필요한 경우도 드물다.
리소스 관리가 가비지 컬렉터에 의해 자동화되어 있기 때문이다.

 

소멸자가 필요한 상황은 프레임워크에 의해 관리되지 않은 리소스를 할당했거나 가비지 컬렉터가 해제할 수 없는 자원을 사용했을 때에 국한된다.


예를 들어 파일을 열어 놓았다거나 네트워크 연결을 해 놓았다면 소멸자에서 이런 비관리 자원을 해제해야 한다.
또는 화면 해상도나 사운드 카드의 볼륨처럼 메모리와 직접적인 상관이 없는 환경을 변경시켰을 때에도 원래대로 복구할 소멸자를 만들 필요가 있다.

 

** 파일 오픈, 권한 획득, 하드웨어 상태 변경 등은 가비지 컬렉터의 능력 밖이다. 이러한 비관리 자원은 최초 자원을 할당한 클래스의 소멸자에서 직접 처리해 주어야 한다.


** 가비지 컬렉터는 백그라운드에서 유휴 시간에 끼어들어 쓰레기 수집을 하므로 동작 시점은 예측할 수 없다. 따라서 객체 소멸 직후에 자원이 바로 해제된다고 보장할 수 없다.

 

** 객체 소멸 시에 리소스를 곧바로 해제하고 싶다면 가비지 컬렉터에 명시적으로 자원 해제를 요구하거나 IDisposable 인터페이스를 상속받아 Dispose 메서드를 구현하여 명시적 호출에 의해 비관리 자원이 해제되게끔 하는 방법을 택하는 것이 옳다. 단, 사용자가 Dispose의 호출을 잊어버릴 수도 있기 때문에 최소한의 방어를 위해 소멸자와 Dispose 메서드를 동시에 구현하는 것이 일반적이다.

 

class Foo : IDisposable
{
    private bool Disposed = false;

 

    public void Dispose()
    {
         Dispose(true);
         GC.SupressFinalize(this);
    }

 

    public virtual void Dispose(bool bManage)
    {
         if (Disposed) return;
         Disposed = true;

 

         if (bManage)
         {
              // 여기서 관리 자원을 해제한다.
         }

             // 여기서 비관리 자원을 해제한다.
     }

 

     ~Foo()
     {
          Dispose(false);
      }
}


 

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

[C#] Singleton 패턴이 적용된 File 로거  (0) 2012.01.19
[C#] 리플렉션 Reflection  (1) 2012.01.19
Thread vs ThreadPool  (0) 2012.01.18
마샬링 (Marshaling)  (0) 2012.01.18
멀티스레드 -> 멀티플렉싱  (0) 2012.01.18