Java 참조 타입: 강한 참조, 약한 참조, 부드러운 참조 차이점 완벽 이해
1. 강한 참조(Strong Reference)란?
강한 참조(Strong Reference)는 Java에서 가장 일반적인 참조 방식입니다. 우리가 일반적으로 객체를 생성할 때 사용하는 방식이며, 이 참조가 존재하는 한 가비지 컬렉터(Garbage Collector, GC)는 해당 객체를 절대 제거하지 않습니다.
public class StrongReferenceExample {
public static void main(String[] args) {
String strongReference = new String("Hello, Strong Reference");
System.out.println(strongReference); // 가비지 컬렉션 대상이 아님
}
}
2. 약한 참조(Weak Reference)란?
약한 참조(Weak Reference)는 java.lang.ref.WeakReference 클래스를 사용하여 선언할 수 있으며, GC가 해당 객체를 수거해도 문제가 없는 경우 사용됩니다. 강한 참조가 없는 약한 참조 객체는 GC 수행 시 제거됩니다.
import java.lang.ref.WeakReference;
public class WeakReferenceExample {
public static void main(String[] args) {
WeakReference<String> weakReference = new WeakReference<>(new String("Hello, Weak Reference"));
System.gc(); // GC 실행 시 약한 참조된 객체는 제거될 가능성이 높음
System.out.println(weakReference.get()); // null이 될 수 있음
}
}
3. 부드러운 참조(Soft Reference)란?
부드러운 참조(Soft Reference)는 java.lang.ref.SoftReference 클래스를 사용하여 선언하며, 메모리가 부족할 때만 GC에 의해 제거됩니다. 약한 참조보다 좀 더 강한 특징을 가지며, 캐시(Cache) 구현 시 유용하게 사용됩니다.
import java.lang.ref.SoftReference;
public class SoftReferenceExample {
public static void main(String[] args) {
SoftReference<String> softReference = new SoftReference<>(new String("Hello, Soft Reference"));
System.gc(); // 즉시 제거되지 않음
System.out.println(softReference.get()); // 여전히 값이 존재할 가능성이 높음
}
}
4. 강한 참조 vs 약한 참조 vs 부드러운 참조 비교
참조 유형GC 대상 여부주요 특징
강한 참조 | 제거 안됨 | 일반적인 참조 방식, 객체가 사용되는 한 제거되지 않음 |
약한 참조 | 즉시 제거 | GC가 탐색하면 바로 제거 가능, 캐시나 메모리 관리에 활용 |
부드러운 참조 | 메모리 부족 시 제거 | GC가 메모리가 부족할 때만 제거, 캐시 등에 사용 |
5. 언제 어떤 참조를 사용해야 할까?
- 강한 참조: 일반적인 객체 사용 시
- 약한 참조: 메모리 부담을 줄이고 캐시 구현 시
- 부드러운 참조: GC 부담을 최소화하면서 캐시를 유지할 때
6. 결론
Java에서 참조 유형을 올바르게 사용하면 메모리 관리를 효율적으로 할 수 있습니다. 특히, 캐시 관리나 메모리 최적화가 필요한 경우 약한 참조와 부드러운 참조를 적절히 활용하는 것이 중요합니다.
반응형
'Backend > JAVA' 카테고리의 다른 글
[Java] try-with-resources: 예외 처리와 자원 관리를 깔끔하게 해결하는 방법 (0) | 2025.04.04 |
---|---|
[JAVA] List 출력 "System.out::println" (0) | 2022.05.20 |
[이클립스] 편집창 세로줄 없애는 방법 (0) | 2021.12.02 |
[JDBC] DB 연동 클래스 생성 (0) | 2021.11.22 |
[JAVA] 컬렉션 클래스 정리 & 요약 (0) | 2021.10.06 |