른록노트

[DataStructure] Map (Java) 본문

Programming/[DataStructure]

[DataStructure] Map (Java)

른록 2022. 1. 20. 20:19

1. Map

Java11

Module java.base
Package java.util
Interface Map<K,​V>

Type Parameters:
K - the type of keys maintained by this map
V - the type of mapped values

All Known Subinterfaces:
Bindings, ConcurrentMap<K,​V>, ConcurrentNavigableMap<K,​V>, NavigableMap<K,​V>, SortedMap<K,​V>

All Known Implementing Classes:
AbstractMap, Attributes, AuthProvider, ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, HashMap, Hashtable, Headers, IdentityHashMap, LinkedHashMap, PrinterStateReasons, Properties, Provider, RenderingHints, ScriptObjectMirror, SimpleBindings, TabularDataSupport, TreeMap, UIDefaults, WeakHashMap
public interface Map<K,​V>

키를 값에 매핑하는 개체입니다. 맵에는 중복 키가 포함될 수 없습니다. 각 키는 최대 하나의 값에 매핑할 수 있습니다.

이 인터페이스는 인터페이스가 아니라 완전히 추상적인 클래스인 Dictionary 클래스를 대신합니다.

Map 인터페이스는 세 가지 컬렉션 보기를 제공합니다. Map의 콘텐츠를 키 집합, 값 모음 또는 키-값 매핑 집합으로 볼 수 있도록 합니다.
Map의 순서는 Map의 컬렉션 보기에 있는 반복자가 요소를 반환하는 순서로 정의됩니다. TreeMap 클래스와 같은 일부 지도 구현은 순서를 구체적으로 보장합니다. HashMap 클래스와 같은 다른 것들은 그렇지 않습니다.

참고: 변경 가능한 객체를 맵 키로 사용하는 경우 각별히 주의해야 합니다. 객체가 맵의 키인 동안 등호 비교에 영향을 주는 방식으로 객체 값이 변경된 경우 맵의 동작이 지정되지 않습니다. 이 금지의 특별한 경우는 맵이 자신을 키로 포함하는 것이 허용되지 않는다는 것입니다. 맵이 값으로 포함되는 것은 허용되지만 극도의 주의가 권장됩니다: equals 및 hashCode 메소드는 이러한 맵에서 더 이상 잘 정의되지 않습니다.

모든 범용 Map 구현 클래스는 두 개의 "표준" 생성자를 제공해야 합니다:빈 맵을 생성하는 void(인수 없음) 생성자 및 해당 인수와 동일한 키-값 매핑을 사용하여 새 맵을 생성하는 Map 유형의 단일 인수가 있는 생성자. 실제로 후자의 생성자는 사용자가 원하는 클래스의 동등한 맵을 생성하여 모든 맵을 복사할 수 있도록 합니다. 이 권장 사항을 적용할 방법은 없지만(인터페이스는 생성자를 포함할 수 없기 때문에) JDK의 모든 범용 맵 구현은 준수합니다.

이 인터페이스에 포함된 "파괴적인" 메소드, 즉 작동하는 맵을 수정하는 메소드는 이 맵이 작업을 지원하지 않는 경우 UnsupportedOperationException을 발생시키도록 지정됩니다. 이 경우 이러한 메서드는 호출이 Map에 영향을 미치지 않으면 UnsupportedOperationException을 throw할 수 있지만 필수는 아닙니다. 예를 들어, 수정할 수 없는 Map에서 putAll(Map) 메서드를 호출하면 매핑이 "중첩"되어야 하는 Map이 비어 있는 경우 예외가 throw될 수 있지만 반드시 그래야 하는 것은 아닙니다.

일부 지도 구현에는 포함할 수 있는 키와 값에 대한 제한이 있습니다. 예를 들어, 일부 구현에서는 null 키와 값을 금지하고 일부 구현에서는 키 type에 제한이 있습니다. 부적합한 키 또는 값을 삽입하려고 하면 일반적으로 NullPointerException 또는 ClassCastException과 같은 확인되지 않은 예외가 발생합니다. 부적격한 키 또는 값의 존재를 쿼리하려고 하면 예외가 발생하거나 단순히 false를 반환할 수 있습니다. 일부 구현은 전자의 동작을 나타내고 일부는 후자를 나타냅니다. 보다 일반적으로, 부적격한 요소가 Map에 삽입되지 않는 결과를 가져오지 않는 부적격한 키 또는 값에 대한 작업을 시도하면 구현 옵션에 따라 예외가 발생하거나 성공할 수 있습니다. 이러한 예외는 이 인터페이스의 사양에서 "선택 사항"으로 표시됩니다.

Collections Framework 인터페이스의 많은 메소드는 equals 메소드로 정의됩니다. 예를 들어, containsKey(Object key) 메서드에 대한 사양은 다음과 같습니다. "이 맵이 (key==null ? k==null : key.equals(k) )." 이 사양은 null이 아닌 인수 키를 사용하여 Map.containsKey를 호출하면 모든 키 k에 대해 key.equals(k)가 호출된다는 의미로 해석되어서는 안 됩니다. 구현은 예를 들어 두 키의 해시 코드를 먼저 비교하여 등호 호출을 피하는 최적화를 자유롭게 구현할 수 있습니다. (Object.hashCode() 사양은 해시 코드가 다른 두 객체가 같을 수 없음을 보장합니다.) 보다 일반적으로 다양한 Collections Framework 인터페이스의 구현은 구현자가 적절하다고 판단하는 경우 기본 Object 메서드의 지정된 동작을 자유롭게 활용할 수 있습니다.

Map의 재귀 순회를 수행하는 일부 Map 작업은 Map가 직접 또는 간접적으로 포함되는 자체 참조 인스턴스를 제외하고 실패할 수 있습니다. 여기에는 clone(), equals(), hashCode() 및 toString() 메서드가 포함됩니다. 구현은 선택적으로 자체 참조 시나리오를 처리할 수 있지만 대부분의 현재 구현은 그렇게 하지 않습니다.

Unmodifiable Maps
Map.of, Map.ofEntries 및 Map.copyOf 정적 팩토리 메서드는 수정할 수 없는 맵을 만드는 편리한 방법을 제공합니다. 이러한 메서드로 생성된 Map 인스턴스는 다음과 같은 특징을 가집니다.

  • 수정할 수 없습니다. 키와 값은 추가, 제거 또는 업데이트할 수 없습니다. Map에서 mutator 메서드를 호출하면 항상 UnsupportedOperationException이 발생합니다. 그러나 포함된 키 또는 값 자체가 변경 가능한 경우 Map이 일관되지 않게 동작하거나 해당 내용이 변경된 것처럼 보일 수 있습니다.
  • null 키와 값을 허용하지 않습니다. null 키 또는 값으로 생성하려고 하면 NullPointerException이 발생합니다.
  • 모든 키와 값이 직렬화 가능한 경우 직렬화 가능합니다.
  • 생성 시 중복 키를 거부합니다. 정적 팩토리 메서드에 중복 키가 전달되면 IllegalArgumentException이 발생합니다.
  • 매핑의 반복 순서는 지정되지 않았으며 변경될 수 있습니다.
  • 그들은 value 기반입니다. 호출자는 반환된 인스턴스의 ID에 대해 가정해서는 안 됩니다. 팩토리는 새로운 인스턴스를 생성하거나 기존 인스턴스를 재사용할 수 있습니다. 따라서 이러한 인스턴스에서 ID에 민감한 작업(참조 같음(==), ID 해시 코드 및 동기화)은 신뢰할 수 없으므로 피해야 합니다.
  • 직렬화된 양식 페이지에 지정된 대로 직렬화됩니다.

이 인터페이스는 Java Collections Framework의 구성원입니다.

Since:
1.2
See Also:
HashMap, TreeMap, Hashtable, SortedMap, Collection, Set

반응형
Comments