finalize() 메서드란?
finalize() 메서드는 자바의 모든 클래스가 상속받는 Object 클래스에 미리 정의되어 있으며, protected 접근 제어자를 가집니다. 이 메서드를 재정의하는 주된 목적은 객체가 가비지 컬렉션(Garbage Collection)으로 회수되기 전에 정리(clean-up) 코드를 실행하거나, 파일 핸들·소켓·데이터베이스 연결 같은 시스템 자원을 해제할 수 있도록 하기 위함입니다.
주의할 점은, finalize() 메서드를 재정의했다면 부모 클래스(Object)의 finalize()를 명시적으로 호출하는 것은 개발자의 책임이라는 것입니다. 또한 JVM은 특정 객체에 대해 finalize() 메서드를 단 한 번만 호출합니다.
문법(Syntex)
protected void finalize() throws Throwable
예제 코드
public class FinalizeMethodTest {
protected void finalize() throws Throwable {
try {
System.out.println("FinalizeMethodTest 클래스의 finalize() 메서드 호출");
} catch(Throwable th) {
throw th;
} finally {
System.out.println("Object 클래스의 finalize() 메서드 호출");
super.finalize();
}
}
public static void main(String[] args) throws Throwable {
FinalizeMethodTest test = new FinalizeMethodTest();
String str = "finalize() method in Java";
str = null;
System.out.println(str);
test.finalize();
}
}
실행 결과
null FinalizeMethodTest 클래스의 finalize() 메서드 호출 Object 클래스의 finalize() 메서드 호출
위 예제에서 finally 블록 안에서 super.finalize()를 호출하여 부모 클래스인 Object의 finalize()까지 반드시 실행되도록 처리한 것을 확인할 수 있습니다.
참고: finalize()는 더 이상 권장되지 않습니다
finalize() 메서드는 실행 시점을 예측할 수 없고 성능 저하와 메모리 누수 가능성 등의 문제로 인해 Java 9부터 공식적으로 deprecated(사용 중단 권고)되었습니다. 따라서 최신 자바 코드에서는 시스템 자원을 해제할 때 try-with-resources(AutoCloseable 구현) 방식이나 java.lang.ref.Cleaner를 사용하는 것이 권장됩니다.