산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> java

Java WeakHashMap 이해하기: 사용법, HashMap과의 차이점, 핵심 메서드

Java WeakHashMap

Java의 WeakHashMap을 생성법, HashMap과의 핵심 차이, 실전 예제, 필수 메서드 관점에서 종합 분석합니다.

WeakHashMap 클래스는 Java 컬렉션 프레임워크의 일부로 Map 인터페이스를 구현합니다. 일반 해시 테이블처럼 동작하지만 키를 약한 참조(weak reference)로 저장하여 더 이상 사용되지 않을 때 가비지 컬렉터가 키를 회수할 수 있게 합니다.

참고: WeakHashMap의 키는 WeakReference 객체로 래핑됩니다.

프로그램이 키 객체에 강한 참조를 더 이상 보유하지 않으면 약한 참조는 가비지 컬렉션 대상이 됩니다.


WeakHashMap 생성하기

java.util.WeakHashMap 임포트:

import java.util.WeakHashMap;

초기 용량과 부하 계수 선택적 지정으로 인스턴스화:

// 용량 8, 부하 계수 0.6인 WeakHashMap
WeakHashMap<Key, Value> numbers = new WeakHashMap<>(8, 0.6);

매개변수:

  • capacity – 리사이징 전 맵이 담을 엔트리 수. 기본값 16.
  • loadFactor – 맵 확장 임계값. 기본값 0.75.

매개변수 없이 기본값 적용:

WeakHashMap<Key, Value> numbers = new WeakHashMap<>();

HashMap vs WeakHashMap

둘 다 Map을 구현하지만 핵심 차이는 참조 강도에 있습니다:

  • HashMap – 키가 강한 참조, 엔트리는 명시적 제거까지 지속
  • WeakHashMap – 키가 약한 참조, 키에 더 이상 도달할 수 없으면 엔트리 사라짐

동작 시연 예제:

import java.util.WeakHashMap;
class Main {
    public static void main(String[] args) {
        WeakHashMap<String, Integer> numbers = new WeakHashMap<>();
        String two = new String("Two");
        Integer twoValue = 2;
        String four = new String("Four");
        Integer fourValue = 4;
        numbers.put(two, twoValue);
        numbers.put(four, fourValue);
        System.out.println("WeakHashMap: " + numbers);
        // 키 two에 대한 참조 무효화
        two = null;
        System.gc();
        System.out.println("WeakHashMap after GC: " + numbers);
    }
}

출력:

WeakHashMap: {Four=4, Two=2} WeakHashMap after GC: {Four=4}

"Two" 엔트리는 키가 더 이상 강하게 도달 가능하지 않아 사라집니다. 반면 HashMap은 엔트리를 유지합니다:

import java.util.HashMap;
class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> numbers = new HashMap<>();
        String two = new String("Two");
        Integer twoValue = 2;
        String four = new String("Four");
        Integer fourValue = 4;
        numbers.put(two, twoValue);
        numbers.put(four, fourValue);
        System.out.println("HashMap: " + numbers);
        two = null;
        System.gc();
        System.out.println("HashMap after GC: " + numbers);
    }
}

출력:

HashMap: {Four=4, Two=2} HashMap after GC: {Four=4, Two=2}

따라서 WeakHashMap은 미사용 키에 연결된 메모리를 맵이 자동 해제하길 원할 때 이상적입니다.


다른 맵에서 변환하기

기존 맵에서 WeakHashMap 인스턴스화하여 엔트리 복사:

import java.util.HashMap;
import java.util.WeakHashMap;
class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> evenNumbers = new HashMap<>();
        String two = new String("Two");
        evenNumbers.put(two, 2);
        System.out.println("HashMap: " + evenNumbers);
        WeakHashMap<String, Integer> numbers = new WeakHashMap<>(evenNumbers);
        System.out.println("WeakHashMap: " + numbers);
    }
}

출력:

HashMap: {Two=2} WeakHashMap: {Two=2}

WeakHashMap 주요 메서드

가장 자주 쓰이는 연산 선별:

엔트리 삽입

  • put(key, value) – 매핑 추가
  • putAll(map) – 다른 맵 병합
  • putIfAbsent(key, value) – 키가 없을 때만 삽입

예제:

import java.util.WeakHashMap;
class Main {
    public static void main(String[] args) {
        WeakHashMap<String, Integer> evenNumbers = new WeakHashMap<>();
        evenNumbers.put(new String("Two"), 2);
        evenNumbers.putIfAbsent(new String("Four"), 4);
        System.out.println("Even numbers: " + evenNumbers);
        WeakHashMap<String, Integer> numbers = new WeakHashMap<>();
        numbers.put(new String("One"), 1);
        numbers.putAll(evenNumbers);
        System.out.println("All numbers: " + numbers);
    }
}

출력:

Even numbers: {Four=4, Two=2} All numbers: {Two=2, Four=4, One=1}

엔트리 접근

다음을 통해 데이터 검색:

  • get(key) – 값 반환, 없으면 null
  • getOrDefault(key, default) – 키 없을 때 기본값 반환
  • entrySet(), keySet(), values() – 엔트리, 키, 값 순회

예제:

import java.util.WeakHashMap;
class Main {
    public static void main(String[] args) {
        WeakHashMap<String, Integer> numbers = new WeakHashMap<>();
        numbers.put(new String("One"), 1);
        numbers.put(new String("Two"), 2);
        System.out.println("Map: " + numbers);
        System.out.println("Entry set: " + numbers.entrySet());
        System.out.println("Keys: " + numbers.keySet());
        System.out.println("Values: " + numbers.values());
        System.out.println("Get Two: " + numbers.get("Two"));
        System.out.println("GetOrDefault Four: " + numbers.getOrDefault("Four", 4));
    }
}

출력:

Map: {Two=2, One=1} Entry set: [Two=2, One=1] Keys: [Two, One] Values: [1, 2] Get Two: 2 GetOrDefault Four: 4

엔트리 제거

  • remove(key) – 제거하고 값 반환
  • remove(key, value) – 현재 매핑이 제공된 값과 일치할 때만 제거
  • clear() – 맵 비우기
  • containsKey(key), containsValue(value), size(), isEmpty()

예제:

import java.util.WeakHashMap;
class Main {
    public static void main(String[] args) {
        WeakHashMap<String, Integer> numbers = new WeakHashMap<>();
        numbers.put(new String("One"), 1);
        numbers.put(new String("Two"), 2);
        System.out.println("Map: " + numbers);
        int removed = numbers.remove("Two");
        System.out.println("Removed value: " + removed);
        boolean removedIf = numbers.remove("One", 3);
        System.out.println("Removed {One=3}? " + removedIf);
        System.out.println("After removal: " + numbers);
    }
}

출력:

Map: {Two=2, One=1} Removed value: 2 Removed {One=3}? false After removal: {One=1}

추가 유틸리티

메서드설명
clear()모든 엔트리 삭제
containsKey(key)키 존재 여부 확인
containsValue(value)값 존재 여부 확인
size()엔트리 수 반환
isEmpty()맵에 엔트리 없으면 true 반환

더 깊은 내용은 공식 Java WeakHashMap 문서를 참조하세요.

java

  1. Java 연산자 마스터하기: 종류, 문법, 실전 예제
  2. Java 주석: 종류, 사용법, 모범 사례
  3. Java 향상된 for 루프(for-each) 완벽 가이드: 문법, 예제, 비교
  4. Java String 마스터하기: 생성, 메서드, 모범 사례
  5. Java 인터페이스 마스터: 개념, 구현, 모범 사례
  6. Java 익명 내부 클래스 마스터: 정의, 문법, 실전 예제
  7. Java Try-with-Resources 마스터: 자동 리소스 관리 완전 해설
  8. Java 애너테이션 완전 해설: 종류, 배치 위치, 실전 예제
  9. Java Assertion(어설션) 실전 가이드: 버그 조기 발견과 코드 신뢰성 확보
  10. Java Vector 완벽 가이드: 사용법, 특징, ArrayList와의 비교