자바에서 Map<K, V> 인터페이스는 Key와 Value 쌍을 저장하기 위해 사용된다. Map<K, V> 인터페이스를 상속하여 정의된 SortedMap<K, V>은 Key와 Value 쌍을 순서를 유지하면서 저장한다.
SortedMap
Map 인터페이스를 상속하는 SortedMap은 Key-Value 쌍을 정렬된 순서대로 저장한다. Map 인터페이스에서 정의하는 것처럼 Key를 통해 Value를 얻어올 수 있으며, 동시에 정렬된 순서대로 Key-Value 쌍을 순회할 수도 있다. Map에 저장되는 데이터를 순서대로 접근하고 싶은 경우 사용하면 좋다.
SortedMap에 저장되는 Key-Value는 Key값의 Natural Order에 맞게 저장된다. Key 클래스가 Comparable 인터페이스를 구현하도록하거나 SortedMap의 생성자에 Comparator를 넘겨주어 정렬된 순서를 정할 수 있다.
SortedMap 예제
SortedMap 인터페이스의 대표적인 구현체로 java.util.TreeMap이 있다.
SortedMap sortedMap = new TreeMap();
SortedMap 생성자에 Comparator를 인자로 주면, 저장되는 데이터의 정렬 순서에 사용된다.
Comparator comparator = new MyComparatorImpl();
SortedMap sortedMap = new TreeMap(comparator);
SortedMap은 기본적으로 Key의 오름차순으로 저장한다. Comparable 혹은 Comparator를 기준으로 작은 값부터 시작해 큰 값으로 저장된다. 내림차순으로 저장하고 싶은 경우 TreeMap.descendingKeySet()을 사용하면 된다.
SortedMap에 저장되어 있는 엘리먼트들을 순회하기 위해서 iterator를 이용할 수 있다.
SortedMap sortedMap = new TreeMap();
sortedMap.put("a", "one");
sortedMap.put("b", "two");
sortedMap.put("c", "three");
Iterator iterator = sortedMap.keySet().iterator();
while(iterator.hasNext()) {
String key = (String) iterator.next();
String value = (String) sortedMap.get(key);
}
SortedMap 주요 메소드
SortedMap은 Map 인터페이스를 상속한다. 따라서 Map 인터페이스에 정의되어 있는 메소드들을 구현해야 한다. SortedMap이 정의하는 메소드들은 JavaDoc을 통해 확인하자. (링크 : Interface SortedMap<K, V>)
Map 인터페이스에서 정의한 메소드 이외에 SortedMap이 정의하는 주요 메소드는 다음과 같다.
Method | 설명 |
---|---|
getComparator() | 정렬에 사용된 Comparator를 리턴 |
firstKey() | SortedMap에 저장된 데이터 중 가장 작은 Key를 리턴 |
lastKey() | SortedMap에 저장된 데이터 중 가장 큰 Key를 리턴 |
headMap(K toKey) | toKey보다 큰 값들로 구성되어 있는 SortedMap을 리턴 |
tailMap(K fromKey) | fromKey보다 큰 값들로 구성되어 있는 SortedMap을 리턴 |
subMap(K fromKey, K toKey) | fromKey 보다 크거나 같고, toKey보다 작은 키들로 구성된 SortedMap을 리턴 |
그림으로 그려보면 다음과 같다.
headMap(), tailMap(), subMap() 메소드를 이용해 정렬된 Key-Value 쌍의 특정 부분을 SortedMap으로 리턴받아 가져올 수 있다. 각 메소드에 인자로 넘겨주는 키 값이 리턴되는 SortedMap에 포함되는지 포함되지 않는지를 유의해야한다. fromKey는 리턴되는 맵에 포함되고, toKey는 포함되지 않는다.
Map 인터페이스의 구현체는 Java에서 가장 많이 사용되는 자료구조 중 하나다. HashMap을 가장 많이 쓰겠지만 구현하는 로직에 따라SortedMap을 구현한 TreeMap 같은 것들도 많이 사용한다. Map을 구현한 각 클래스들의 특성을 잘 알아두면 필요한 곳에 필요한 클래스를 적절하게 사용할 수 있을 것이다.
댓글