언어 자료구조 알고리즘/C# 언어 문법

3. 소멸자

언제나휴일 2009. 8. 19. 05:47
반응형
소멸자

 

 

다루는 내용

 - 소멸자

 - unsafe한 코드 사용(Win32 API, C++기반의 dll, COM) 

 

생성자가 인스턴스를 생성할 때 수행할 구문을 위한 메소드인 것처럼 소멸자는 인스턴스가 소멸될 때 수행되는 구문을 위한 메소드이다. 

 

인스턴스를 생성하는 구문은 new연산자를 통해 C# 사용자에 의해 구동될 수 있지만 인스턴스를 소멸하는 것은 .NET garbage컬렉션에 의해 구동된다.  그럼에도 불구하고 C#클래스에 소멸자를 정의할 수 있다.

 

그렇다면 소멸자는 어떠한 경우에 필요한 것일까? 

 

C#에서는 관리되는 코드와 비관리 코드 모두 사용할 수 있다.  비 관리 코드는 COM개체나 Win32 API를 사용하기 위해서 제공한다고 볼 수 있는데 이들을 사용하는 부분에 대해서는 인스턴스의 생성과 소멸은 모두 C# 사용자가 결정해야 한다.  즉, 특정 클래스에서 비관리 인스턴스를 내부적으로 생성하여 사용을 할 경우에는 소멸자를 명시적으로 정의하여 비관리 인스턴스들을 소멸해야 할 것이다.

 

 

설정 

unsafe한 바이너리를 사용하기 위해서는 먼저 다음과 같은 설정을 해야 한다.

 

 

unsafe한 바이너리 사용 예

unsafe한 바이너리를 사용하기 위한 네임스페이스이다.

[DllImport(바이너리명)]

unsafe 한 자원에 대한 명시가 따라야 한다.

참고로 HANDLE을 System.IntPtr 타입으로 사용하면 된다. 

 

다음은 사용 예들이다. 

구현하는 메소드 내부에 unsafe한 코드가 있으면 해당 블록을 unsafe{}로 묶어서 사용할 수 있다.  물론, 메소드 signature 를 public unsafe int Read(...)와 같이 할 수도 있지만 unsafe한 부분은 해당 클래스에서 담당하고 제공하는 public메소드는 모두 safe하게 제공하자.  실제 이와 같을 때에 adapter컴포넌트를 만들어서 해당 컴포넌트는 unsafe한 바이너리를 사용하여 safe한 public메소드만을 제공함으로써 이를 사용하는 이는 unsafe한 코드가 있다는 것을 눈치채지 않게 해야 한다.  물론, 그러기 위해서는 모든 자원의 관리에 대한 책임을 질 수 있어야 할 것이다.

 

 

IDispasable 인터페이스로부터 파생된 클래스는 Dispose메소드를 반드시 구현해야 한다.  이는 빠르게 Gabage Collection되어야 효율성이 좋은 경우에 명시적으로 사용하기 위함이다.  unsafe한 인스턴스를 많이 사용하는 경우에는 이를 꼭 지키기 바란다.

 

Gabage Collection에 의해 소멸될 때 수행할 코드 블록이다.  Dispose와 같은 목적이지만 이는 명시적으로 호출을 하지 않더라도 해당 인스턴스 Gabage Collection에 의해 수행된다. 

 

내부적으로 소멸자는 다음과 같이 변환이 된다.  즉, 파생된 인스턴스의 경우 상속 체인에 있는 모든 base클래스의 Finalize가 호출 되는 것이다.

protected override void Finalize()
{
    try
    {
        소멸자에 구현한 코드
    }
    finally
    {
        base.Finalize();
    }

 

반응형

'언어 자료구조 알고리즘 > C# 언어 문법' 카테고리의 다른 글

11.Class  (0) 2009.08.19
10.Casting  (0) 2009.08.19
9.String  (0) 2009.08.19
8. Object  (0) 2009.08.19
7. 배열  (0) 2009.08.19
6. valuetype 기본 형식  (0) 2009.08.19
5. .NET Framework  (0) 2009.08.19
4. const 와 readonly  (0) 2009.08.19
2. 생성자  (0) 2009.08.19
1.Welcome! Here is ehclub.net  (0) 2009.08.19