Java의 Map
Java에서 Map은 키와 값을 연결하는 자료 구조로, 키-값 쌍을 효율적으로 저장하고 조회하며 수정하고 삭제할 수 있습니다. 요소만 저장하는 컬렉션과 달리 Map은 키와 값 사이의 매핑 관계를 유지합니다. 각 키는 유일하며 정확히 하나의 값을 가리키지만, 여러 키가 같은 값을 가질 수 있습니다.
Map 인터페이스는 유일한(중복되지 않는) 키를 사용하여 값을 가져오는 기능을 제공합니다. 또한 Map의 내용을 서로 다른 방식으로 다룰 수 있도록 세 가지 컬렉션 뷰를 제공합니다. 키의 집합, 값의 컬렉션, 또는 키와 값 사이의 매핑 집합으로 다룰 수 있습니다. Map에서 파생되는 주요 인터페이스는 정렬된 Map을 나타내는 SortedMap과 그 하위 인터페이스인 NavigableMap입니다. Map은 표준 라이브러리의 여러 클래스에서 널리 사용됩니다. 동시성이 없는 Map에서 Map 인터페이스를 구현하는 주요 클래스는 HashMap, LinkedHashMap, TreeMap입니다. 동시성 Map에서는 ConcurrentHashMap과 ConcurrentSkipListMap이 주요 클래스입니다.
다음은 주요 메서드만 포함한 Map 인터페이스 정의의 일부입니다.
public interface Map<K,V>{
// Query Operations
int size();
boolean isEmpty();
boolean containsKey(Object key);
boolean containsValue(Object value);
V get(Object key);
// Modification Operations
V put(K key, V value);
V remove(Object key);
void putAll(Map<? extends K, ? extends V> m);
void clear();
// Views
Set<K> keySet();
Collection<V> values();
Set<Map.Entry<K, V>> entrySet();
// Definition of the Entry interface
interface Entry<K, V> {
// Body omitted
}
// (continues...)
}
다음 예제는 키가 자동차의 번호판이고 값이 해당 자동차 모델의 이름인 Map을 보여 줍니다. 이 Map을 사용하면 예를 들어 키를 containsKey 메서드의 인수로 사용하여 특정 요소가 존재하는지 확인할 수 있습니다. 또한 get 메서드는 인수로 전달된 키에 연결된 값을 가져오고, remove 메서드는 Map에서 해당 항목을 제거합니다.
void main() {
Map<String, String> cars = new HashMap<>();
cars.put("ABCD2935", "Tesla Model S");
cars.put("YJKF9353", "Toyota Corolla");
cars.put("WFLO1304", "Honda CRV");
var key = "ABCD2935";
if (cars.containsKey(key)){
IO.println("Vehicle data:");
IO.println(cars.get(key));
IO.println("Removing the vehicle...");
cars.remove(key);
} else
IO.println("Vehicle not found!");
}
Vehicle data:
Tesla Model S
Removing the vehicle...
위에서 설명한 메서드 외에도 추가 기능을 제공하는 여러 default 메서드가 있습니다.
이 인터페이스는 주어진 값으로 불변 Map을 생성하는 메서드(of, ofEntries 및 보조 메서드 entry)와 기존 Map으로부터 생성하는 메서드(copyOf)도 제공합니다.
그림 1은 Map 인터페이스와 주요 하위 인터페이스를 보여 줍니다. Map의 직접 하위 인터페이스는 SequencedMap, Bindings, ConcurrentMap입니다. 간접적으로는 SortedMap, NavigableMap, ConcurrentNavigableMap도 Map에서 파생된 인터페이스입니다(후자는 ConcurrentMap의 하위 인터페이스이기도 합니다).

Map의 중요한 하위 인터페이스로는 SortedMap과 NavigableMap이 있습니다.
SortedMap 인터페이스는 SequencedMap 인터페이스를 확장한 것으로, 키를 특정한 순서로 유지하는 Map을 나타냅니다. 이 순서는 키의 자연 순서에 따르거나 Map을 생성할 때 지정한 특정 comparator에 따릅니다. Collections Framework에서 SortedMap의 유일한 직접 하위 인터페이스인 NavigableMap은 Map의 키를 다루기 위한 보다 고급 탐색 연산을 제공하는 메서드를 추가합니다. 예를 들어 특정 값에 가장 가까운 키를 가져오거나 Map을 오름차순 또는 내림차순으로 순회할 수 있습니다.
실제로는 SortedMap보다 NavigableMap을 사용하는 경우가 많습니다. Collections Framework에서 SortedMap을 구현하는 두 클래스가 모두 간접적으로 구현하기 때문입니다(TreeMap은 NavigableMap을 구현하고 ConcurrentSkipListMap은 ConcurrentNavigableMap을 구현합니다). NavigableMap은 더 많은 기능을 제공하며 Map을 탐색하기 위한 전용 메서드를 제공합니다. 이는 집합에 대해 NavigableSet이 제공하는 기능과 유사합니다.
이 글은 Orientação a Objetos com Java라는 책의 내용을 바탕으로 한 것으로, Eduardo Kessler Piveta가 저술했습니다.