Visual Basic에서 생성자는 Sub New 절차로, 클래스를 인스턴스화할 때 호출되어 객체를 초기화합니다. 소멸자는 Finalize 메소드나 IDisposable 인터페이스(Dispose 메소드)를 사용하여 구현되며, 이는 자원을 해제하는 데 매우 중요합니다.
고전적인 Visual Basic에서는 객체 생성 시 자동으로 생성자가 호출되었고(Class_Initialize), 소멸자는 삭제 시(Class_Terminate) 호출되었습니다. VB.NET에서는 오버로딩 가능한 생성자가 추가되고, 관리되는 자원과 비관리되는 자원의 해제 방법이 구분되며, 가비지 컬렉터(GC)를 사용합니다.
생성자나 소멸자를 잘못 사용하면 메모리 누수, 객체 초기화 실패, 자원 차단(예: 파일)이 발생할 수 있습니다.
객체를 초기화할 때는 Sub New를 사용하고, 자원을 명시적으로 해제하려면 반드시 Dispose를 구현하십시오. 소멸자(Finalize)를 사용할 경우, GC의 지연성과 호출 시점을 예측할 수 없음을 기억하십시오.
코드 예:
Public Class ResourceHolder Implements IDisposable Private resource As SomeResource Public Sub New() resource = New SomeResource() Console.WriteLine("Resource allocated") End Sub Protected Overrides Sub Finalize() Dispose(False) MyBase.Finalize() End Sub Public Sub Dispose() Implements IDisposable.Dispose Dispose(True) GC.SuppressFinalize(Me) End Sub Protected Overridable Sub Dispose(disposing As Boolean) If disposing Then If resource IsNot Nothing Then resource.Release() resource = Nothing End If End If End Sub End Class
주요 특징:
이미 존재하는 객체에서 수동으로 Sub New 생성자를 호출할 수 있습니까?
아니요, 생성자는 객체 생성 시에만 호출됩니다. 재초기화를 위해서는 별도의 Reset 메소드를 사용하십시오.
Finalize는 언제 호출되며 항상 보장됩니까?
Finalize는 객체가 파괴될 때 가비지 컬렉터에 의해 호출되지만, 그 실행이 항상 보장되지는 않습니다(예: 프로세스의 비정상 종료 또는 전원 차단 시).
Dispose 내부에서 GC.SuppressFinalize를 호출하는 이유는 무엇입니까?
이는 이미 수동으로 해제된 객체에 대해 Finalize가 다시 호출되는 것을 방지하여 성능을 높이고 메모리 누수를 방지합니다.
프로젝트에서 Dispose를 구현하지 않아 몇 개의 파일이 애플리케이션 종료 후에도 잠긴 채로 남아있었습니다 — 자원이 가비지 컬렉터의 개입까지 해제되지 않았습니다.
장점:
단점:
IDisposable 및 Dispose를 구현하고 외부 자원 사용 시 Using을 이용했습니다. 모든 파일이 올바르게 닫히고 애플리케이션이 안정적으로 작동합니다.
장점:
단점: