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

Java 9의 Cleaner 클래스란? 용도와 사용법 완벽 정리

프로그램 실행 중에 생성된 객체는 가비지 컬렉터(Garbage Collector, GC)에 의해 자동으로 제거됩니다. 어떤 스레드에서도 객체를 참조하지 않고, JVM이 해당 객체에 더 이상 접근할 수 없다고 판단하면 그 객체는 가비지 컬렉션 대상이 됩니다.

Object 클래스에는 finalize() 메서드가 있으며, GC가 힙(heap)에서 객체를 제거하기 전에 자동으로 호출됩니다. 하지만 Java 9부터 finalize() 메서드는 deprecated(사용 중단) 처리되었고, 대신 가비지 컬렉션 관리를 위한 새로운 클래스인 java.lang.ref.Cleaner가 추가되었습니다. Cleaner 객체는 객체가 가비지 컬렉션 대상이 되었을 때 자동으로 알림을 받으며, 정리(clean-up)가 필요한 객체는 register() 메서드를 사용하여 클리너에 등록해야 합니다.

Cleaner 클래스의 주요 특징

  • finalize()보다 안전하고 예측 가능한 리소스 정리 방식을 제공합니다.
  • 클리닝 동작은 별도의 스레드에서 실행되므로, 정리 로직 내에서 객체를 다시 참조하면 안 됩니다.
  • Runnable 구현체나 람다 표현식을 통해 정리 동작을 유연하게 정의할 수 있습니다.

예제 코드

import java.lang.ref.Cleaner;

public class CleanerTest {
    public static void main(String args[]) {
        System.out.println("TutorialsPoint");
        Cleaner cleaner = Cleaner.create();
        if(true) {
            CleanerTest myObject = new CleanerTest();
            cleaner.register(myObject, new State()); // 클리너 등록
        }
        for(int i = 1; i <= 10000; i++) {
            String[] largeObject = new String[1000];
            try {
                Thread.sleep(1);
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private static class State implements Runnable {
        public void run() {
            System.out.print("Cleaning action");
        }
    }
}

실행 결과

TutorialsPoint
Cleaning action

코드 설명

위 예제에서 myObject는 if 블록이 종료되면 더 이상 참조되지 않으므로 가비지 컬렉션 대상이 됩니다. 이후 반복문에서 대량의 객체를 생성하고 일부러 sleep을 호출하여 GC가 실행될 여유를 만들면, Cleaner에 등록된 State 객체의 run() 메서드가 호출되어 "Cleaning action"이 출력됩니다.

마무리

Java 9 이상 환경에서는 예측하기 어려운 finalize() 대신 Cleaner 클래스를 사용하는 것이 권장됩니다. 다만 Cleaner는 try-with-resources나 명시적인 close() 메서드를 대체하는 것이 아니라, 최후의 안전장치(final safety net)로 활용하는 것이 바람직합니다.