일반적으로 클래스를 생성할때 생성자인 new
키워드를 사용하여 생성한다. 클래스 또한 생성한 이후 객체와 같이 참조형식이기 때문에 GT(가비지 콜렉터)가 메모리에서 지우기는 하는데 완전한 프로그램 종료 때 말고 언제 지우는지는 GT만이 알 일이다.
이러한 상황에서 종료자 키워드 ~ClassName()
을 이용하여 GT가 해당 클래스를 종료하는 시점을 확인할 수 있다.
각 컴퓨터의 성능마다 언제 종료할지는 알 수 없지만, 종료에 맞춰서(클래스의 삭제 바로 직후) 특정한 메소드를 사용하고 싶거나 원하는 동작이 있다면 사용할 수 있다.
주의할 점은 종료자의 호출은 개발자가 원하는 타이밍 즉, 코드가 작성되어 호출되는 순간에 동작하는게 아니라, GT가 메모리상에 돌아다니면서 키워드를 적어둔 클래스를 종료시킬 때 호출된다.
주체가 GT가 되기 때문에 종료자에 맞춰 코드를 작성하면 수동적으로 코드를 작성하게 된다.
사용하게 된다면, 클래스의 종료시점이후 빠르게 동작시켜야 할 메소드가 있다면 사용할 수 있다.
public class MyClass : IDisposable
{
// 관리되지 않는 리소스
private IntPtr handle;
// 종료자
~MyClass()
{
Dispose(false);
}
// IDisposable 인터페이스 구현
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// 관리되는 리소스 해제
}
// 비관리 리소스 해제
// ...
// 종료자에서 호출되는 공통 정리 작업
}
}
이 코드에서는 종료자를 사용하여 비관리 리소스를 해제하고, IDisposable 인터페이스를 구현하여 개발자가 명시적으로 Dispose를 호출할 수 있도록 할 수 있다. 개발자가 명시적으로 Dispose를 호출하면 관리되는 리소스를 더 빠르게 해제할 수 있다.