맵과 트리 - java.util.TreeMap

이현빈·2025년 3월 1일
0
post-thumbnail

1. java.util.TreeMap 개괄

  • 이진 검색 트리를 사용하여 키-값 쌍으로 이루어진 데이터를 저장하는 컬렉션 클래스
    : 레드-블랙 트리를 이용하여 구현
  • Map 인터페이스를 구현
  • HashMap에 비해 범위 검색과 정렬에 특화됨
    : 단, 그 외의 검색 작업을 수행할 때는 HashMap을 사용하는 것이 더욱 효과적

관련 인터페이스/상위 클래스 간략 정리

cf1) 첫번째, 두번째 캡처본은 java.util.TreeMap이 구현한 인터페이스/상위클래스의 내부클래스까지 포함하는 클래스 다이어그램

상위 인터페이스

java.util.Map

  • 하나의 데이터를 키(key)-값(value) 쌍으로 묶어서 저장하는 맵을 구현하기 위한 인터페이스

java.util.Entry

  • Map에 저장되는 key-value 쌍을 다루기 위해 정의된 내부 인터페이스
  • Map을 구현하는 클래스는 Map.Entry 인터페이스도 반드시 구현
  • TreeMap.SimpleImmutableEntry, TreeMap.SimpleEntry, TreeMap.Entry 등으로 구현됨

java.util.SortedMap

  • 저장된 키-값 쌍들을 정렬한 맵 클래스를 다루는 데 필요한 기능들을 정의한 인터페이스
    : 키를 기준으로 한 범위 검색 기능 정의
  • TreeMap.SubMap 클래스 구현에 사용됨

java.util.NavigableMap

  • java.util.SortedMap에서 정의한 범위 검색 기능을 확장한 인터페이스
  • 설정한 키 정렬 기준에 기반한 탐색 기능과 역순 정렬 기능을 추가 정의
  • TreeMap, TreeMap.NavigableSubMap 등으로 구현됨

java.lang.Cloneable

  • 이 인터페이스를 구현한 클래스의 인스턴스는 Object clone() 메서드를 통해 복제될 수 있음
  • 마커 인터페이스

java.io.Serializable

  • 이 인터페이스를 구현한 클래스의 인스턴스는 직렬화될 수 있음
  • 마커 인터페이스

cf) 마커 인터페이스: 클래스에 관한 추가 정보를 제공하는 용도로 사용되는 빈 인터페이스

상위 클래스

java.util.AbstractMap

  • Map 인터페이스에 정의된 기능을 바탕으로 Map의 기본 골격을 제공하는 추상 클래스
  • TreeMap, TreeMap.NavigableSubMap, TreeMap.SubMap의 상위 클래스

java.util.AbstractMap.SimpleImmutableEntry

  • 단순히 Entry 인터페이스에 정의된 메서드를 구현한 AbstractMap 추상 클래스의 스태틱 내부 클래스
  • 멤버변수를 변경할 수 없는 불변 객체이므로 setValue() 호출 시 UnsupportedOperationException 발생
  • Serializable 인터페이스의 구현 클래스이므로 직렬화 가능

java.util.AbstractMap.SimpleEntry

  • 단순히 Entry 인터페이스에 정의된 메서드를 구현한 AbstractMap 추상 클래스의 스태틱 내부 클래스
  • Serializable 인터페이스의 구현 클래스이므로 직렬화 가능

java.util.TreeMap의 내부 클래스

cf1) 첫번째 캡처본은 java.util.TreeMap의 내부클래스에 관한 클래스 다이어그램
cf2) Iterator 계열 클래스를 제외한, TreeMap의 구성 요소(키, 값, 엔트리, 서브트리맵) 관련 내부 클래스를 중심으로 정리

맵 구성 요소 관련 내부 클래스

java.util.TreeMap.EntrySet

  • TreeMap에 저장된 키와 값을 키-값 쌍인 엔트리 형태로 저장하는 Set 클래스
  • entrySet() 메서드의 내부 코드를 구현하는 용도로 사용
  • 일반적인 집합 클래스와는 달리 데이터의 추가는 불가능

java.util.TreeMap.KeySet

  • TreeMap의 키들을 저장하기 위한 Set 클래스
  • keySet() 메서드의 내부 코드를 구현하는 용도로 사용
  • 일반적인 집합 클래스와는 달리 데이터의 추가는 불가능

java.util.TreeMap.Values

  • TreeMap의 값들을 저장하기 위한 Set 클래스
  • values() 메서드의 내부 코드를 구현하는 용도로 사용
  • 일반적인 컬렉션 클래스와는 달리 데이터의 추가는 불가능

java.util.TreeMap.Entry

  • java.util.Entry 인터페이스를 구현한 클래스
    : 키와 값을 한 쌍으로 묶기 위해 사용

서브맵 관련 내부 클래스

java.util.TreeMap.SubMap

  • SortedMap 인터페이스에 정의된 기능들을 구현한 SubMap의 기본 골격을 제공하는 추상 클래스

java.util.TreeMap.NavigableSubMap

  • NavigableSubMap 인터페이스에 정의된 기능들을 구현한 SubMap의 기본 골격을 제공하는 추상 클래스
  • TreeMap.DescendingSubMap 클래스와 TreeMap.AscendingSubMap 클래스에서 공통으로 사용되는 메서드를 제공
  • 내부 클래스로 추상 클래스 EntrySetView를 보유

java.util.TreeMap.DescendingSubMap

  • 키-값 쌍의 정렬 순서의 역순으로 범위 검색을 수행 가능한 SubMap을 구현한 클래스

java.util.TreeMap.AscendingSubMap

  • 키-값 쌍의 정렬 순서대로 범위 검색을 수행 가능한 SubMap을 구현한 클래스

java.util.TreeMap.EntrySetView

  • TreeMap.DescendingEntrySetView, TreeMap.AscendingEntrySetView에서 공통으로 사용되는 메서드를 제공하는 추상 클래스
  • SubMap에서의 엔트리를 일부 구현한 클래스

java.util.TreeMap.DescendingEntrySetView

  • SubMap에 저장된 키-값 쌍을 정렬 순서의 역순으로 접근하기 위한 iterator() 메서드를 제공
  • java.util.TreeMap.EntrySet과 기능적인 측면에서 유사

java.util.TreeMap.AscendingEntrySetView

  • SubMap에 저장된 키-값 쌍을 정렬 순서대로 접근하기 위한 iterator() 메서드를 제공
  • java.util.TreeMap.EntrySet과 기능적인 측면에서 유사

2. java.util.TreeMap의 주요 메서드

cf) TreeMap 클래스에 포함된 전체 메서드에 관한 설명은 여기에서 확인 가능

TreeMap의 생성자

TreeMap()

  • TreeMap 객체를 생성하는 기본 생성자

TreeMap(Comparator c)

  • 지정된 Comparator를 기준으로 정렬하는 TreeMap 객체를 생성

TreeMap(Map m)

  • 주어진 Map에 저장된 모든 요소를 포함하는 TreeMap 객체를 생성

TreeMap(SortedMap m)

  • 주어진 SortedMap에 저장된 모든 요소를 포함하는 TreeMap을 생성

키/값 포함여부 확인

boolean containsKey(Object key)

  • 지정된 키가 TreeMap에 포함되어 있는지에 따라 true/false 중 하나를 반환
    : 포함되면 true

boolean containsValue(Object value)

  • 지정된 값이 TreeMap에 포함되어 있는지에 따라 true/false 중 하나를 반환
    : 포함되면 true

데이터 추가/삭제/변경

데이터 추가

Object put(Object key, Object value)

  • 지정된 키와 값을 TreeMap에 저장
  • TreeMap에 이미 지정된 키와 매핑되는 값이 존재하면 그 값을 지정한 새로운 값으로 갱신

void putAll(Map map)

  • Map에 저장된 모든 요소를 TreeMap에 병합

데이터 삭제

Object remove(Object key)

  • TreeMap에서 지정된 키로 저장된 객체를 제거

데이터 변경

Object replace(Object key, Object value)

  • 기존의 키에 매핑되어 있던 값을 지정한 값으로 변경

boolean replace(Object key, Object oldValue, Object newValue)

  • 지정한 키-값 쌍이 TreeMap에 존재하면, 기존의 값을 지정한 새로운 값으로 변경
  • 지정한 키와 값을 갖는 키-값 쌍이 TreeMap에 존재하지 않으면 false만 반환 후 종료

void replaceAll(BiFunction<K, V, V> function)

  • 기존의 값마다 지정한 작업을 수행하여 얻은 결과값을 구하고, 해당 결과값으로 기존의 값들을 일괄적으로 대체

데이터 접근

객체 단위 조회

Object get(Object key)

  • TreeMap에서 지정된 키의 값을 반환

Object getOrDefault(Object key, Object defaultValue)

  • TreeMap에서 지정된 키의 값을 반환하되, 지정된 키에 대응되는 값이 TreeMap에 존재하지 않으면 지정한 초기값을 반환
  • Map 인터페이스에 구현된 default 메서드를 그대로 활용

컬렉션 단위 조회

Set entrySet()

  • TreeMap에 저장된 키와 값을 키-값 쌍이 결합한 엔트리 형태로 Set에 저장하여 반환

Set keySet()

  • TreeMap에 저장된 모든 키를 Set에 저장하여 반환

NavigableSet navigableKeySet()

  • TreeMap에 저장된 키를 정렬 순서대로 NavigableSet에 저장하여 반환

NavigableSet descendingKeySet()

  • TreeMap에 저장된 키를 정렬 순서의 역순으로 NavigableSet에 저장하여 반환

Collection values()

  • TreeMap에 저장된 모든 값을 컬렉션의 형태로 변환하여 반환

데이터 검색

단일 객체 검색

cf) 지정한 키를 기준으로 TreeMap에서 동일한 값이나 근사값을 찾는 경우,
해당하는 값이나 대체할 값을 아예 찾을 수 없다면 null을 반환

찾는 대상과 동일한 키 검색

Object floorKey(Object key)

  • 지정된 키와 일치하거나, 정렬 순서상 작은 것 중 제일 큰 키를 반환

Map.Entry floorEntry(Object key)

  • 지정된 키와 일치하거나, 정렬 순서상 작은 것 중 제일 큰 키를 갖는 키-값 쌍을 반환

Object ceilingKey(Object key)

  • 지정된 키와 일치하거나, 정렬 순서상 큰 것 중 제일 작은 키를 반환

Map.Entry ceilingEntry(Object key)

  • 지정된 키와 일치하거나, 정렬 순서상 큰 것 중 제일 작은 키를 갖는 키-값 쌍을 반환

찾는 대상보다 작은 키 검색

Object lowerKey(Object key)

  • 정렬 순서상 지정된 키보다 작은 것 중 제일 큰 키를 반환

Map.Entry lowerEntry(Object key)

  • 정렬 순서상 지정된 키보다 작은 것 중 제일 큰 키를 갖는 키-값 쌍을 반환

찾는 대상보다 큰 키 검색

Object higherKey(Object key)

  • 정렬 순서상 지정된 키보다 큰 것 중 제일 작은 키를 반환

Map.Entry higherEntry(Object key)

  • 정렬 순서상 지정된 키보다 큰 것 중 제일 작은 키를 갖는 키-값 쌍을 반환

최대/최소의 키 검색

Object firstKey()

  • TreeMap의 정렬 순서상 첫번째 키를 반환

Map.Entry firstEntry()

  • TreeMap의 정렬 순서상 첫번째 키를 갖는 키-값 쌍을 반환

Object lastKey()

  • TreeMap의 정렬 순서상 마지막 키를 반환

Map.Entry lastEntry()

  • TreeMap의 정렬 순서상 마지막 키를 갖는 키-값 쌍을 반환

범위 검색

SortedMap 인터페이스 정의 메서드

SortedMap headMap(Object toKey)
  • TreeMap에 저장된 첫번째 요소와 지정된 키 사이의 모든 요소가 담긴 SortedMap을 반환
  • ToKey는 지정한 범위에 미포함
SortedMap tailMap(Object fromToKey)
  • 지정된 키와 마지막 요소 사이의 모든 요소가 담긴 SortedMap을 반환
  • fromKey는 지정한 범위에 미포함
SortedMap subMap(Object fromKey, Object toKey)
  • 지정한 두 키 사이에 있는 모든 요소가 담긴 SortedMap을 반환
  • 지정한 범위는 fromKey ≤ 저장할 요소의 키 < toKey에 해당

NavigableMap 인터페이스 정의 메서드

NavigableMap headMap(Object toKey, boolean inclusive)
  • TreeMap에 저장된 첫번째 요소와 지정된 키 사이의 모든 요소가 담긴 NavigableMap을 반환
  • toInclusive가 true면 toKey를 범위에 포함
NavigableMap tailMap(Object fromToKey, boolean inclusive)
  • 지정한 키와 마지막 요소 사이의 모든 요소가 담긴 NavigableMap을 반환
  • fromInclusive가 true면 fromKey를 범위에 포함
NavigableMap subMap(Object fromKey, boolean fromInclusive, 
					  Object toKey, boolean toInclusive)
  • 지정한 두 키 사이에 있는 모든 요소가 담긴 SortedMap을 반환
  • fromInclusive가 true면 fromKey를, toInclusive가 true면 toKey를 범위에 포함

Reference

0개의 댓글