Java/Java이론
Java WeakHashMap 이해하기
P_eli
2024. 11. 25. 16:33
728x90
반응형
1. WeakHashMap란?
WeakHashMap은 Java의 java.util 패키지에서 제공되는 Map 인터페이스의 구현체로, 키(key)에 대해 **약한 참조(Weak Reference)**를 사용하는 특징을 가집니다.
이는 일반적인 HashMap과 달리, 가비지 컬렉터가 해당 키를 강한 참조(strong reference)가 아닌 약한 참조만 가지고 있는 경우 이를 수집(제거)할 수 있도록 설계되었습니다.
2. 왜 WeakHashMap을 사용할까?
WeakHashMap은 다음과 같은 상황에서 유용합니다:
- 캐시 데이터 관리:
오래된 데이터나 더 이상 필요하지 않은 데이터를 자동으로 제거할 수 있어 메모리 누수를 방지할 수 있습니다. - 임시 데이터 관리:
특정 객체의 라이프사이클 동안만 필요한 데이터를 관리하고, 해당 객체가 참조되지 않으면 메모리에서 제거되도록 설정합니다.
3. 주요 특징
- 키에 대한 약한 참조:
키 객체가 강한 참조로 유지되지 않으면, 가비지 컬렉션 과정에서 자동으로 제거됩니다.
값(value)은 여전히 강한 참조를 가지므로 직접 관리가 필요합니다. - 자동 메모리 관리:
필요 없는 데이터가 메모리에서 자동으로 제거되어 효율적인 메모리 관리를 제공합니다. - 비동기 데이터 제거:
가비지 컬렉션에 의해 키가 제거되더라도, WeakHashMap 내부에서 이 작업은 비동기적으로 처리됩니다.
4. 코드 예제: 기본 사용법
아래는 WeakHashMap의 기본적인 사용법을 보여주는 코드입니다.
import java.util.WeakHashMap;
public class WeakHashMapExample {
public static void main(String[] args) {
// WeakHashMap 생성
WeakHashMap<String, String> map = new WeakHashMap<>();
// 키와 값 추가
String key1 = new String("temp"); // 새로운 객체 생성
String key2 = new String("persistent"); // 새로운 객체 생성
map.put(key1, "Temporary Data");
map.put(key2, "Persistent Data");
System.out.println("초기 상태: " + map);
// 강한 참조 해제
key1 = null;
// 가비지 컬렉션 강제 실행
System.gc();
// 잠시 대기하여 가비지 컬렉션의 영향을 관찰
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// WeakHashMap 상태 출력
System.out.println("GC 이후 상태: " + map);
}
}
코드 설명
- WeakHashMap 생성 및 값 추가:
키로 key1과 key2를 사용하여 데이터를 추가합니다. - 강한 참조 해제:
key1에 대한 강한 참조를 해제합니다. 이로 인해 key1은 약한 참조만 남게 됩니다. - 가비지 컬렉션 실행:
System.gc()를 호출하여 가비지 컬렉터를 실행합니다. 이때, key1이 가비지 컬렉션 대상이 되어 제거됩니다. - 결과 확인:
WeakHashMap에서 key1 관련 데이터가 사라진 것을 확인할 수 있습니다.
출력 결과
5. 실무에서의 활용 사례
- 메모리 효율적 캐시 관리:
자주 사용되지만, 필요 없을 경우 자연스럽게 제거되는 데이터 캐싱에 사용됩니다. - 객체 그래프 관리:
객체 관계가 복잡한 상황에서 특정 객체가 더 이상 참조되지 않을 때 자동으로 정리되도록 설정할 수 있습니다.
6. 주의사항
- 가비지 컬렉션 의존성:
데이터 제거가 즉각적으로 이루어지지 않을 수 있습니다. 이는 가비지 컬렉션의 실행 시점에 따라 달라집니다. - 값에 대한 강한 참조:
WeakHashMap의 키는 약한 참조를 가지지만, 값은 여전히 강한 참조를 가집니다. 필요 시 값도 적절히 관리해야 합니다.
결론
WeakHashMap은 메모리 관리를 효율적으로 도와주는 유용한 자료구조입니다. 특히, 키에 대한 강한 참조를 유지하지 않고, 자동으로 정리될 수 있는 환경을 제공하여 메모리 누수를 방지합니다. 캐시나 임시 데이터 저장소를 구현할 때 WeakHashMap을 적절히 활용해 보세요!
728x90
반응형