TreeSet 클래스는 내부적으로 트리 형태로, 데이터를 관리하는 Collection 으로, Set 의 특징을 지닙니다. Set 의 특징은, 중복을 제거한다는 점입니다. 또, 트리 구조를 지니기 때문에, 정렬이 된다는 특징도 가집니다.


TreeSet 클래스의 대표적인 메소드, subSet 이 있는데, 이는, 시작 값과 끝 값을 매개변수로 받아, 그것을 범위로, 부분 Set 을 추출합니다. 


TreeSet 클래스에서 subSet 메소드는, 2 개의 메소드가 오버로딩되어 있습니다.


SortedSet<E> subSet(E fromElement, E toElement)

시작 ~ 끝 이전까지의 부분집합 반환


NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive)

시작 (포함여부 선택 가능) ~ 끝 (포함여부 선택 가능) 까지의 부분 집합 반환


이 중에서, 첫 번재 subSet 메소드는, 시작 값은 포함하고, 끝 값은 포함하지 않음을 뜻하고, 두 번째 subSet 메소드는 시작 값과 끝 값의 포함 여부를 직접 지정할 수 있습니다.


주의해야 할 점은, subSet 메소드의 내부에서, 원본 set 의 데이터들을 복사해서 새로 부분 집합을 구성하는 것이 아니라, 원본 데이터들을 그대로 두고, 원본 set 과 Sub Set 이 같이 바라보고 있는 상태에서, subSet 은 해당 범위만 바라볼 수 있는 형태로 되어 있다는 것입니다. 이에 따라, subSet 메소드 후에, 원본 Set 이나 sub Set 에 변경이 일어나면 (추가, 삭제 등) 원본 Set, Sub Set 모두 변경이 동시에 일어난다고 보면 됩니다. (단, Sub Set 은 해당 범위만 보여짐)


TreeSet 에 객체를 추가하려면, 그 객체의 클래스는 무조건 비교 가능해야 한다는 제약 조건이 따르게 됩니다. 즉, 그 객체가 TreeSet 에 존재하는지 체크할 수 있는, compareTo 메소드가 있어야 한다는 것입니다. TreeSet 에 객체를 추가할 때, 내부적으로, 설정된 compareTo 메소드를 호출하여, 반환값이 0 이 나오면, 같은 객체가 이미 존재한다고 간주하여, 현재 객체를 다시 추가하지 않게 됩니다.




(TreeSet 클래스 참고)

https://docs.oracle.com/javase/8/docs/api/java/util/TreeSet.html

by kkikkodev 2015. 6. 22. 00:57