Java에서 데이터가 가비지 컬렉션(Garbage Collection)되는 방식에 따라 참조는 크게 네 가지 유형으로 나눌 수 있습니다.
- 강한 참조(Strong Reference)
- 약한 참조(Weak Reference)
- 소프트 참조(Soft Reference)
- 팬텀 참조(Phantom Reference)
강한 참조(Strong Reference)
강한 참조는 Java에서 기본적으로 적용되는 참조 유형입니다. 강한 참조가 살아 있는 객체는 가비지 컬렉터가 임의로 회수할 수 없으며, 해당 객체를 회수 대상으로 만들려면 강한 참조를 담고 있는 변수에 null을 할당하는 것이 유일한 방법입니다. 아래 예제를 살펴보겠습니다.
예제
class Demo {
// 일부 기능
}
public class Demo_example{
public static void main(String[] args){
Demo my_inst = new Demo();
my_inst = null;
}
}
약한 참조(Weak Reference)
약한 참조는 기본 참조 유형이 아니기 때문에 명시적으로 선언해 주어야 합니다. 주로 WeakHashMap에서 엔트리(entry) 객체를 참조할 때 활용되며, 약한 참조로만 도달 가능한 객체는 JVM(Java Virtual Machine)에 의해 가비지 컬렉션 대상으로 표시됩니다. 약한 참조는 'java.lang.ref.WeakReference' 클래스를 사용하여 생성합니다.
예제
import java.lang.ref.WeakReference;
class Demo{
public void display_msg(){
System.out.println("Hello");
}
}
public class Demo_sample{
public static void main(String[] args){
Demo inst = new Demo();
inst.display_msg();
WeakReference<Demo> my_weak_ref = new WeakReference<Demo>(inst);
inst = null;
inst = my_weak_ref.get();
inst.display_msg();
}
}
실행 결과
Hello Hello
Demo 클래스에는 화면에 메시지를 출력하는 display_msg 메서드가 정의되어 있습니다. Demo_sample 클래스의 main 메서드에서는 Demo 인스턴스를 생성한 뒤 display_msg 메서드를 호출하고, 이어서 Demo 객체에 대한 약한 참조(WeakReference)를 만듭니다. 이후 원래 참조 변수에 null을 할당한 다음, 약한 참조의 get() 메서드로 객체를 다시 얻어와 동일한 메서드를 호출합니다. 그 결과 콘솔에 "Hello"가 두 번 출력되는 것을 확인할 수 있습니다.
소프트 참조(Soft Reference)
소프트 참조는 메모리가 부족한 상황에서만 가비지 컬렉터에 의해 회수되는 참조 유형입니다. 메모리에 여유가 있는 동안은 객체가 계속 유지되기 때문에, 메모리에 민감한 캐시(cache) 구현에 적합합니다. 'java.lang.ref.SoftReference' 클래스를 사용하여 생성할 수 있습니다.
팬텀 참조(Phantom Reference)
팬텀 참조는 객체가 메모리에서 실제로 회수된 시점을 추적하기 위해 사용됩니다. get() 메서드가 항상 null을 반환하기 때문에 객체 자체에는 접근할 수 없으며, 주로 ReferenceQueue와 함께 사용되어 객체가 최종화된 이후의 정리 작업을 처리하는 데 활용됩니다. 'java.lang.ref.PhantomReference' 클래스를 사용하여 생성합니다.