Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바에서 finalize() 메서드를 재정의하는 이유와 목적

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를 사용하는 것이 권장됩니다.