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 및 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
'VB.NET 2008 > VB - 개체지향' 카테고리의 다른 글
개체지향 - 상속 계층 구조의 확장을 용이하게 하는 제안 사항 (0) | 2011.04.15 |
---|---|
개체지향 - 상속(Inherit) 기능 (0) | 2011.04.15 |
개체지향 - 인터페이스(interface)를 사용해야 하는 이유 (0) | 2011.04.15 |
개체지향 - 개체를 생성할 수 있게 하는 클래스 (0) | 2011.04.15 |
Visual Basic의 개체 지향 프로그래밍 (0) | 2011.04.15 |