Java - IdentityHashMap 클래스
서론
안녕하세요, 미래의 자바 개발자 여러분! 오늘은 자바의 IdentityHashMap 클래스의 세계로 흥미진진한 여정을 떠나보겠습니다. 이제 여러분이 무엇을 생각하고 있는지 알아요: "또 다른 맵 클래스? HashMap에 대해 배웠던 건가?" 그렇다면, 여러분이 정확히 맞는데, IdentityHashMap는 그 자체만의 독특한 맛이 있어 특별합니다. 그럼 들어가보죠!
클래스 선언
먼저, IdentityHashMap를 어떻게 선언하는지 봅시다:
import java.util.IdentityHashMap;
IdentityHashMap<String, Integer> myMap = new IdentityHashMap<>();
이 코드는 String 키와 Integer 값을 저장할 새로운 IdentityHashMap를 만듭니다. 그러나 이것이 정상적인 HashMap과는 어떻게 다른 걸까요? 그것이 재미있는 부분입니다!
클래스 생성자
IdentityHashMap는 네 가지 생성자를 제공합니다. 그것들을 분석해봅시다:
-
기본 생성자:
IdentityHashMap<String, Integer> map1 = new IdentityHashMap<>();
이것은 기본 용량이 21인 빈 IdentityHashMap를 만듭니다.
-
초기 용량을 가진 생성자:
IdentityHashMap<String, Integer> map2 = new IdentityHashMap<>(100);
이것은 지정된 초기 용량을 가진 빈 IdentityHashMap를 만듭니다.
-
다른 Map을 가진 생성자:
Map<String, Integer> existingMap = new HashMap<>(); IdentityHashMap<String, Integer> map3 = new IdentityHashMap<>(existingMap);
이것은 지정된 Map과 같은 매핑을 가진 IdentityHashMap를 만듭니다.
-
예상 최대 크기를 가진 생성자:
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