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);
    }
}

 

코드 설명

  1. WeakHashMap 생성 및 값 추가:
    키로 key1과 key2를 사용하여 데이터를 추가합니다.
  2. 강한 참조 해제:
    key1에 대한 강한 참조를 해제합니다. 이로 인해 key1은 약한 참조만 남게 됩니다.
  3. 가비지 컬렉션 실행:
    System.gc()를 호출하여 가비지 컬렉터를 실행합니다. 이때, key1이 가비지 컬렉션 대상이 되어 제거됩니다.
  4. 결과 확인:
    WeakHashMap에서 key1 관련 데이터가 사라진 것을 확인할 수 있습니다.

출력 결과

 

5. 실무에서의 활용 사례

  • 메모리 효율적 캐시 관리:
    자주 사용되지만, 필요 없을 경우 자연스럽게 제거되는 데이터 캐싱에 사용됩니다.
  • 객체 그래프 관리:
    객체 관계가 복잡한 상황에서 특정 객체가 더 이상 참조되지 않을 때 자동으로 정리되도록 설정할 수 있습니다.

 

6. 주의사항

  • 가비지 컬렉션 의존성:
    데이터 제거가 즉각적으로 이루어지지 않을 수 있습니다. 이는 가비지 컬렉션의 실행 시점에 따라 달라집니다.
  • 값에 대한 강한 참조:
    WeakHashMap의 키는 약한 참조를 가지지만, 값은 여전히 강한 참조를 가집니다. 필요 시 값도 적절히 관리해야 합니다.

 

결론

 

WeakHashMap은 메모리 관리를 효율적으로 도와주는 유용한 자료구조입니다. 특히, 키에 대한 강한 참조를 유지하지 않고, 자동으로 정리될 수 있는 환경을 제공하여 메모리 누수를 방지합니다. 캐시나 임시 데이터 저장소를 구현할 때 WeakHashMap을 적절히 활용해 보세요!

728x90
반응형