VB.NET 2008/VB - 개체지향

개체의 생성과 소멸

본클라쓰 2011. 4. 15. 09:38

 

개체의 생성

 

New 키워드를 사용하여 클래스, 개체의 인스턴스가 만들어집니다.

 

새 개체가 사용되기 전에 초기화 작업이 먼저 수행되어야 하는 경우가 많습니다. 일반적인 초기화 작업으로는 파일 열기, 데이터베이스 연결, 레지스트리 키의 값 읽기 등이 있습니다. Visual Basic에서는 초기화를 제어할 수 있도록 하는 특수 메서드인 생성자라는 프로시저를 사용하여 새 개체의 초기화를 제어합니다.

 

개체가 범위를 벗어나면 CLR(공용 언어 런타임)에 의해 개체가 해제됩니다. Visual Basic에서는 소멸자는 프로시저를 사용하여 시스템 리소스의 해제를 제어합니다. 생성자와 소멸자 모두가 견고하고 예측 가능한 클래스 라이브러리를 만들 수 있도록 지원합니다.

 

New 생성자는 동일한 클래스나 파생 클래스에서 다른 생성자 코드의 첫 줄 외에는 아무 곳에서 명시적으로 호출할 수 없습니다. 또한 Sub New 메서드의 코드는 항상 클래스의 다른 코드보다 먼저 실행됩니다. Visual Basic 2005 이상 버전에서는 사용자가 클래스에 대한 Sub New 프로시저를 명시적으로 정의하지 않는 경우 런타임에 암시적으로 Sub New 생성자를 만듭니다.

 

CLR는 개체를 해제하기 전에 Sub Finalize 프로시저를 정의하는 개체에 대해 Finaluze 메서드를 자동으로 호출합니다. Finalize 메서드에는 파일을 닫고 상태 정보를 저장하는 것과 같이 개체가 소멸되기 직전에 실행해야 하는 코드가 포함될 수 있습니다. Sub Finalize를 실행할 경우 성능이 다소 저하되므로 개체를 명시적으로 해제해야 하는 경우에만 Sub Finalize 메서드를 정의해야 합니다.

 

클래스 인스턴스는 주로 Windows 핸들 및 데이터베이스 연결과 같이 CLR에서 관리하지 않는 리소스를 제어합니다. 이러한 리소스는 개체가 가비지 수집기에 의해 소멸될 때 해제되도록 Finalize 메서드에서 삭제되어야 합니다. 그러나 가비지 수집기는 CLR에서 사용 가능한 메모리가 더 필요할 때만 개체를 소멸시킵니다. 즉, 개체가 범위를 벗어난 후 한참 있어야 리소스가 해제될 수 있습니다.

 

가비지 수집을 보완하기 위해 클래스에서 IDisposable 인터페이스를 구현하는 경우 시스템 리소스를 적극적으로 관리할 수 있는 메커니즘이 제공될 수 있습니다. IDisposable에는 클라이언트가 개체 사용을 완료할 때 호출해야 하는 Dispose 메서드 하나가 있습니다. Dispose 메서드를 사용하면 즉시 리소스를 해제하고 파일 닫기 및 데이터베이스 연결 등과 같은 작업을 수행할 수 있습니다. Finalize 소멸자와 달리 Dispose 메서드는 자동으로 호출되지 않습니다. 리소스를 즉시 해제하려는 경우 클래스의 클라이언트에서 Dispose 를 명시적으로 호출해야 합니다.

 

 

 

Dispose 메서드를 구현하여 명시적으로 개체의 리소를 해제하는 방법

 

다음 코드에서는 Dispose 및 Finalize를 사용하여 기본 클래스에서 리소스를 해제하는 방법을 보여 준다.

 

' Disign patter for a base class.

Public Class Base

    Implements IDisposable

 

    ' Keep track of when the object is disposed.

    Protected disposed As Boolean = False

 

    ' This method disposes the base object's resources.

    Protected Overridable Sub Dispose(ByVal disposing As Boolean)

 

        If Not Me.disposed Then

            If disposing Then

                ' Insert code to free managed resources.

            End If

        End If

        Me.disposed = True

 

    End Sub

 

    ' Do not change or add Overridable to these methods.

    ' Put cleanup code in Dispose(ByVal disposing As Boolean).

    Public Sub Dispose() Impements IDisposable.Dispose

        Dispose(True)

        GC.SuppressFinalize(Me)

    End Sub

    Protected Overrides Sub Finalize()

        Dispose(False)

        MyBase.Finalize()

    End Sub

 

End Class