Java - IdentityHashMap 클래스

서론

안녕하세요, 미래의 자바 개발자 여러분! 오늘은 자바의 IdentityHashMap 클래스의 세계로 흥미진진한 여정을 떠나보겠습니다. 이제 여러분이 무엇을 생각하고 있는지 알아요: "또 다른 맵 클래스? HashMap에 대해 배웠던 건가?" 그렇다면, 여러분이 정확히 맞는데, IdentityHashMap는 그 자체만의 독특한 맛이 있어 특별합니다. 그럼 들어가보죠!

Java - The IdentityHashMap Class

클래스 선언

먼저, IdentityHashMap를 어떻게 선언하는지 봅시다:

import java.util.IdentityHashMap;

IdentityHashMap<String, Integer> myMap = new IdentityHashMap<>();

이 코드는 String 키와 Integer 값을 저장할 새로운 IdentityHashMap를 만듭니다. 그러나 이것이 정상적인 HashMap과는 어떻게 다른 걸까요? 그것이 재미있는 부분입니다!

클래스 생성자

IdentityHashMap는 네 가지 생성자를 제공합니다. 그것들을 분석해봅시다:

  1. 기본 생성자:

    IdentityHashMap<String, Integer> map1 = new IdentityHashMap<>();

    이것은 기본 용량이 21인 빈 IdentityHashMap를 만듭니다.

  2. 초기 용량을 가진 생성자:

    IdentityHashMap<String, Integer> map2 = new IdentityHashMap<>(100);

    이것은 지정된 초기 용량을 가진 빈 IdentityHashMap를 만듭니다.

  3. 다른 Map을 가진 생성자:

    Map<String, Integer> existingMap = new HashMap<>();
    IdentityHashMap<String, Integer> map3 = new IdentityHashMap<>(existingMap);

    이것은 지정된 Map과 같은 매핑을 가진 IdentityHashMap를 만듭니다.

  4. 예상 최대 크기를 가진 생성자:

    IdentityHashMap<String, Integer> map4 = new IdentityHashMap<>(100, 0.75f);

    이것은 지정된 예상 최대 크기와 부하 요소를 가진 빈 IdentityHashMap를 만듭니다.

클래스 메소드

이제 IdentityHashMap에서 가장 일반적으로 사용되는 몇 가지 메소드를 살펴보겠습니다:

메소드 설명
put(K key, V value) 지정된 값이 지정된 키와 연관되도록 합니다
get(Object key) 지정된 키에 매핑된 값을 반환합니다
remove(Object key) 존재하면 이 키의 매핑을 제거합니다
clear() 이 맵에서 모든 매핑을 제거합니다
size() 이 맵에 있는 키-값 매핑의 수를 반환합니다
isEmpty() 이 맵에 키-값 매핑이 없으면 true를 반환합니다
containsKey(Object key) 이 맵에 지정된 키에 대한 매핑이 있으면 true를 반환합니다
containsValue(Object value) 이 맵이 하나 이상의 키를 지정된 값으로 매핑하면 true를 반환합니다

이러한 메소드 중 일부를 동작하는 것을 볼까요:

IdentityHashMap<String, Integer> ages = new IdentityHashMap<>();

// 키-값 쌍 추가
ages.put("Alice", 25);
ages.put("Bob", 30);

// 값 가져오기
System.out.println("Alice의 나이: " + ages.get("Alice")); // 출력: Alice의 나이: 25

// 키 존재 여부 확인
System.out.println("Charlie가 존재합니까? " + ages.containsKey("Charlie")); // 출력: Charlie가 존재합니까? false

// 키-값 쌍 제거
ages.remove("Bob");

// 크기 확인
System.out.println("항목 수: " + ages.size()); // 출력: 항목 수: 1

상속된 메소드

IdentityHashMap는 슈퍼 클래스와 인터페이스에서 메소드를 상속받습니다. 여기 몇 가지가 있습니다:

상속된 곳 메소드
java.util.AbstractMap clone(), equals(), hashCode(), toString()
java.util.Map entrySet(), keySet(), values()
java.lang.Object finalize(), getClass(), notify(), notifyAll(), wait()

IdentityHashMap에 키-값 매핑 추가 예제

이제 IdentityHashMap의 특별한 점에 대해 다루어보겠습니다. HashMap와 달리 equals() 메소드를 사용하여 키를 비교하는 대신, IdentityHashMap는 참조 동등성(==)을 사용합니다. 이는 두 키가 메모리에서 정확히 같은 객체인 경우에만 동등한 것으로 간주됩니다.

이를 동작하는 것을 볼까요:

IdentityHashMap<String, String> identityMap = new IdentityHashMap<>();

String key1 = new String("Hello");
String key2 = new String("Hello");

identityMap.put(key1, "World1");
identityMap.put(key2, "World2");

System.out.println("IdentityHashMap의 크기: " + identityMap.size());
System.out.println("key1의 값: " + identityMap.get(key1));
System.out.println("key2의 값: " + identityMap.get(key2));

출력:

IdentityHashMap의 크기: 2
key1의 값: World1
key2의 값: World2

놀라셨나요? key1과 key2가 같은 내용("Hello")이지만, IdentityHashMap는 메모리에서 다른 String 객체이므로 다른 키로 취급합니다.

이 동작은 특정 시나리오에서 매우 유용할 수 있습니다. 예를 들어, 여러분이 문서의 다른 버전을 추적하는 프로그램을 작성한다고 가정해 봅시다. 각 버전은 같은 제목을 가질 수 있지만, 여러분은 별도의 엔티티로 취급하고 싶습니다. IdentityHashMap는 이러한 경우에 완벽합니다!

결론적으로, IdentityHashMap는 Map 가족의 특별한 조카 같습니다. 다른 것들과 비슷하지만, 자신만의 독특한 방식으로 일을 합니다. 이를 이해하면 더 유연한 자바 프로그래머가 될 수 있습니다.

기억하세요, 프로그래밍의 세계에서는 모든 문제에 적합한 답은 없습니다. 각 도구는 자신의 장소가 있으며, IdentityHashMap를 사용할 때를 알아야만 여러분의 자바 지식의 양낭이 됩니다. 연습을 계속하고, 호기심을 지켜주시고, 즐거운 코딩하세요!

Credits: Image by storyset