TreeSet은 AbstractSet 클래스의 하위 클래스이며 NavigableSet 인터페이스를 구현한 자료구조입니다. 기본적으로 TreeSet은 요소를 오름차순(ascending order)으로 정렬하여 출력하며, 내부적으로 Comparable 인터페이스를 사용해 집합(set)의 요소들을 정렬합니다.
또한 TreeSet에는 동일한 타입의 요소만 추가해야 합니다. 서로 다른 타입의 요소를 섞어서 추가하면 기본적으로 Comparable 인터페이스에 의존해 정렬하기 때문에 ClassCastException이 발생할 수 있습니다.
TreeSet 선언 구문(Syntax)
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, Serializable
Java에서 TreeSet의 요소를 순회(iterate)하는 대표적인 방법은 크게 두 가지가 있습니다.
1. Iterator 인터페이스 사용
Iterator 인터페이스를 사용하면 TreeSet의 각 요소를 순차적으로 하나씩 접근할 수 있습니다. hasNext() 메소드로 다음 요소의 존재 여부를 확인하고, next() 메소드로 실제 요소를 가져오는 방식입니다.
예제 코드
import java.util.*;
public class IteratingTreeSetTest {
public static void main(String[] args) {
Set<String> treeSetObj = new TreeSet<>();
treeSetObj.add("Ramesh");
treeSetObj.add("Adithya");
treeSetObj.add("Jai");
treeSetObj.add("Vamsi");
treeSetObj.add("Chaitanya");
Iterator<String> it = treeSetObj.iterator(); // Iterator 인터페이스
while (it.hasNext()) {
System.out.println(it.next());
}
}
}실행 결과
Adithya Chaitanya Jai Ramesh Vamsi
출력 결과를 보면 요소를 추가한 순서와 관계없이 사전순(오름차순)으로 정렬되어 출력되는 것을 확인할 수 있습니다.
2. for-each 루프 사용
for-each 루프(향상된 for문)를 사용하면 코드가 훨씬 간결해집니다. 인덱스나 Iterator 객체를 직접 다룰 필요 없이 TreeSet의 모든 요소를 손쉽게 순회할 수 있습니다.
예제 코드
import java.util.*;
public class IteratingTreeSetForEachTest {
public static void main(String[] args) {
Set<String> treeSetObj = new TreeSet<>();
treeSetObj.add("India");
treeSetObj.add("Australia");
treeSetObj.add("West Indies");
treeSetObj.add("South Africa");
treeSetObj.add("England");
for(String str : treeSetObj) { // for-each 루프
System.out.println(str);
}
}
}실행 결과
Australia England India South Africa West Indies
정리
TreeSet은 자동으로 오름차순 정렬이 되기 때문에 어떤 방식으로 순회하든 항상 정렬된 순서로 요소를 얻을 수 있습니다. 요소를 순회하면서 제거 작업이 필요하다면 Iterator를 사용하고, 단순히 값을 읽기만 한다면 더 간결한 for-each 루프를 사용하는 것이 좋습니다.