Set 인터페이스 살펴보기
Set 인터페이스는 Collection 인터페이스에 새로운 메서드를 가져오지 않습니다. 컬렉션 프레임워크는 Set 인터페이스의 하나의 일반 구현을 제공합니다: HashSet. 내부적으로, HashSet은 나중에 다룰 클래스인 HashMap의 인스턴스를 래핑하여 HashSet의 대리자 역할을 수행합니다.
이미 보셨듯이 Set이 Collection에 가져다주는 것은 중복을 금지한다는 것입니다. List 인터페이스에 비해 잃는 것은 요소가 특정한 순서 없이 저장된다는 점입니다. 세트에 추가한 것과 같은 순서로 반복할 가능성이 거의 없습니다.
다음 예제에서 이를 확인할 수 있습니다:
List<String> strings = List.of("one", "two", "three", "four", "five", "six");
Set<String> set = new HashSet<>();
set.addAll(strings);
set.forEach(System.out::println);이 코드를 실행하면 다음과 같은 결과가 생성됩니다:
six
four
one
two
three
fiveSet의 일부 구현은 해당 요소를 반복할 때 동일한 순서를 제공하지만 이는 보장되지 않으므로 코드에서 이에 의존해서는 안 됩니다.
SortedSet으로 Set 확장
Set의 첫 번째 확장은 SortedSet 인터페이스입니다. SortedSet 인터페이스는 특정 비교 논리에 따라 요소를 정렬된 상태로 유지합니다. 컬렉션 프레임워크는 SortedSet의 한 가지 구현인 TreeSet을 제공합니다.
이미 보셨듯이, TreeSet을 빌드할 때 비교기를 제공하거나, TreeSet에 넣은 요소에 대해 Comparable 인터페이스를 구현할 수 있습니다. 두 가지를 모두 수행하면 비교기가 우선합니다.
SortedSet 인터페이스는 Set에 새로운 메서드를 추가합니다.
first()및 [last()](https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/util/TreeSet.html#last()는 집합의 가장 낮은 요소와 가장 큰 요소를 반환합니다.headSet(toElement)및tailSet(fromElement)는toElement보다 낮거나fromElement보다 큰 요소를 포함하는 하위 집합을 반환합니다.subSet(fromElement, toElement)는fromElement와toElement사이의 요소의 하위 집합을 반환합니다.
toElement와 fromElement는 기본 집합의 요소일 필요는 없습니다. 만약 그렇다면, 일반적인 규칙에 따라 toElement는 결과에 포함되지 않고 fromElement는 포함됩니다.
다음 예를 생각해 보세요:
SortedSet<String> strings = new TreeSet<>(Set.of("a", "b", "c", "d", "e", "f"));
SortedSet<String> subSet = strings.subSet("aa", "d");
System.out.println("sub set = " + subSet);이 코드를 실행하면 다음과 같은 결과가 표시됩니다:
sub set = [b, c]이 메서드가 반환하는 세 개의 하위 집합은 메인 집합의 views 입니다. 복사본이 만들어지지 않으므로 이러한 하위 집합에 대한 모든 변경 사항이 집합에 반영되며, 그 반대의 경우도 마찬가지입니다.
You can remove or add elements to the main set through these subsets. There is one point you need to keep in mind though. These three subsets remember the limits on which they have been built. For consistency reasons, it is not legal to add an element through a subset outside its limits. For instance, if you take a headSet and try to add an element greater than toElement, then you will get an IllegalArgumentException.
SortedSet을 NavigableSet으로 확장하기
Java SE 6에서는 더 많은 메서드가 추가된 SortedSet의 확장이 도입되었습니다. TreeSet 클래스가 NavigableSet을 구현하도록 개조된 것으로 밝혀졌습니다. 따라서 두 인터페이스 모두에 동일한 클래스를 사용할 수 있습니다.
일부 메서드는 NavigableSet에 의해 오버로드됩니다.
headSet(),tailSet(),subSet()은 추가부울인수를 받아 결과 하위 집합에 제한(toElement또는fromElement)을 포함할지 여부를 지정할 수 있습니다.
다른 방법이 추가되었습니다.
ceiling(element),floor(element)는 제공된element보다 작거나 같은 가장 큰 요소 또는 가장 크거나 같은 가장 낮은 요소를 반환합니다. 그러한 요소가 없으면null이 반환됩니다.lower(element)와 [higher(element)](https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/util/NavigableSet.html#higher(E)는 제공된element보다 큰 요소 또는 가장 작은 요소를 반환합니다. 이러한 요소가 없으면null이 반환됩니다.pollFirst()및pollLast()는 집합의 가장 낮은 요소 또는 가장 큰 요소를 반환하고 제거합니다.
또한 NavigableSet을 사용하면 해당 요소를 내림차순으로 반복할 수도 있습니다. 이를 수행하는 방법은 두 가지가 있습니다.
descendingIterator()을 호출하면 내림차순으로 집합을 순회하는 일반Iterator를 얻을 수 있습니다.descendingSet()을 호출하면 있습니다. 이 집합에 대한 뷰를 얻을 수 있으며 이는 동일한 집합이 역순으로 정렬된 것처럼 보이게 하는 또 다른NavigableSet입니다.
다음 예는 이를 보여줍니다.
NavigableSet<String> sortedStrings = new TreeSet<>(Set.of("a", "b", "c", "d", "e", "f"));
System.out.println("sorted strings = " + sortedStrings);
NavigableSet<String> reversedStrings = sortedStrings.descendingSet();
System.out.println("reversed strings = " + reversedStrings);이 코드를 실행하면 다음과 같은 결과가 표시됩니다:
sorted strings = [a, b, c, d, e, f]
reversed strings = [f, e, d, c, b, a]