행복을 담는 블로그

[Java / 자료구조] TreeMap / TreeSet 이란? 본문

BackEnd/Java

[Java / 자료구조] TreeMap / TreeSet 이란?

hyun0zin 2025. 2. 25. 09:29

💡 TreeMap과 TreeSet이란?

 

TreeMap:

  • TreeMap은 키-값 쌍을 저장하는 Map 인터페이스의 구현체로, 를 기준으로 자동으로 오름차순 정렬됩니다.
  • 내부적으로 Red-Black Tree 자료구조를 사용하여 데이터 삽입/삭제/검색을 수행합니다.
  • 정렬 기준을 커스터마이즈하려면 Comparator를 지정할 수 있습니다.

TreeSet:

  • TreeSet은 고유한 값을 저장하는 Set 인터페이스의 구현체로, 을 기준으로 자동으로 오름차순 정렬됩니다.
  • 내부적으로 TreeMap을 활용하여 데이터의 중복을 방지하고 정렬을 유지합니다.
  • 정렬 기준을 커스터마이즈하려면 Comparator를 지정할 수 있습니다.

TreeMap 사용법 (Java 예제)

import java.util.*;

public class TreeMapExample {
    public static void main(String[] args) {
        // TreeMap 선언
        TreeMap<Integer, String> treeMap = new TreeMap<>();

        // 데이터 추가
        treeMap.put(3, "Three");
        treeMap.put(1, "One");
        treeMap.put(2, "Two");

        // 출력: 키는 정렬된 순서로 저장됨
        System.out.println(treeMap);

        // 특정 키 검색
        System.out.println("Key 2의 값: " + treeMap.get(2));

        // 첫 번째 키와 마지막 키
        System.out.println("첫 번째 키: " + treeMap.firstKey());
        System.out.println("마지막 키: " + treeMap.lastKey());

        // 하위/상위 맵
        System.out.println("1보다 작은 값: " + treeMap.headMap(1));
        System.out.println("2 이상의 값: " + treeMap.tailMap(2));

        // 키-값 삭제
        treeMap.remove(2);
        System.out.println("Key 2 삭제 후: " + treeMap);
    }
}

TreeSet 사용법 (Java 예제)

import java.util.*;

public class TreeSetExample {
    public static void main(String[] args) {
        // TreeSet 선언
        TreeSet<Integer> treeSet = new TreeSet<>();

        // 데이터 추가
        treeSet.add(5);
        treeSet.add(3);
        treeSet.add(1);

        // 출력: 값은 정렬된 순서로 저장됨
        System.out.println(treeSet);

        // 값 존재 여부 확인
        System.out.println("3이 포함되어 있는가? " + treeSet.contains(3));

        // 첫 번째와 마지막 값
        System.out.println("첫 번째 값: " + treeSet.first());
        System.out.println("마지막 값: " + treeSet.last());

        // 하위/상위 집합
        System.out.println("3보다 작은 값: " + treeSet.headSet(3));
        System.out.println("3 이상의 값: " + treeSet.tailSet(3));

        // 값 삭제
        treeSet.remove(3);
        System.out.println("3 삭제 후: " + treeSet);
    }
}

2. TreeMap/TreeSet vs. HashMap/HashSet 차이점

특징 TreeMap/TreeSet HashMap/HashSet
정렬 키(TreeMap) 또는 값(TreeSet)이 자동으로 정렬 데이터 삽입 순서 또는 무작위 순서로 저장
검색 속도 O(log n) (Red-Black Tree) O(1) (Hashing)
Null 허용 여부 TreeMap: Null 키 허용 불가
Null 값 가능
TreeSet: Null 값 허용 불가
HashMap: Null 키/값 허용
HashSet: Null 값 허용
정렬 기준 커스터마이즈 가능 (Comparator) 불가능
적합한 경우 - 데이터가 정렬되어 있어야 할 때
- 범위 검색이 필요할 때
- 데이터가 순서와 상관없이 빠르게 저장/검색되어야 할 때

사용 예시

  • TreeMap/TreeSet:
    • 데이터 정렬이 필요한 경우: 순위표, 범위 검색(예: 1~10 사이 값 찾기).
    • Comparator를 사용해 정렬 기준 변경.
  • HashMap/HashSet:
    • 데이터 검색 속도가 중요하고 정렬이 필요 없는 경우: 빠른 검색이 요구되는 캐시 시스템.

3. TreeMap/TreeSet 주요 메서드

TreeMap 주요 메서드

메서드 설명
put(K key, V value) 키와 값을 저장
get(K key) 키에 해당하는 값 반환
remove(K key) 특정 키와 그에 해당하는 값을 삭제
firstKey() 첫 번째 키 반환
lastKey() 마지막 키 반환
headMap(K toKey) 특정 키보다 작은 키-값 쌍 반환
tailMap(K fromKey) 특정 키보다 큰(같거나 큰) 키-값 쌍 반환
subMap(K fromKey, K toKey) 특정 범위의 키-값 쌍 반환

TreeSet 주요 메서드

메서드 설명
add(E e) 값을 추가 (중복 불가)
remove(Object o) 특정 값을 삭제
contains(Object o) 특정 값이 포함되어 있는지 확인
first() 첫 번째 값 반환
last() 마지막 값 반환
headSet(E toElement) 특정 값보다 작은 값 반환
tailSet(E fromElement) 특정 값보다 큰(같거나 큰) 값 반환
subSet(E fromElement, E toElement) 특정 범위의 값 반환

결론

  • TreeMap/TreeSet:
    • 정렬 및 범위 검색이 필요할 때 사용.
  • HashMap/HashSet:
    • 빠른 데이터 검색과 저장이 필요할 때 사용.