

Collection 인터페이스는 java.util패키지의 컬렉션 프레임워크의 핵심 인터페이스 중 하나List, Set, Queue와 같은 다양한 하위 인터페이스와 함께 사용되며, 이를 통해 데이터를 리스트, 세트, 큐 등의 형태로 관리할 수 있음Set 인터페이스 java.util 패키지의 컬렉션 프레임워크에 속하는 인터페이스 중 하나Set 인터페이스는 중복을 허용하지 않는 유일한 요소의 집합을 나타냄Set 내에 두 번 이상 나타날 수 없음Set은 수학적 집합 개념을 구현한 것으로, 순서를 보장하지 않으며, 특정 요소가 집합에 있는지 여부를 확인하는데 최적화되어 있음
Set인터페이스는HashSet,LinkedListSet,TreeSet등의 여러 구현 클래스를 가지고 있으며, 각 클래스는Set인터페이스를 구현하며 각가의 특성을 가지고 있음

구현 : 해시 자료 구조를 사용해서 요소를 저장
순서 : 요소들은 특정한 순서 없이 저장됨
시간 복잡도 : HashSet의 주요 연산(추가, 삭제, 검색)은 평균적으로 O(1) 시간 복잡도를 가짐
용도 : 데이터의 유일성만 중요하고, 순서가 중요하지 않은 경우에 적합함

구현 : LinkedHashSet은 HashSet에 연결 리스트를 추가해서 요소들의 순서를 유지
순서 : 요소들은 추가된 순서대로 유지됨
시간 복잡도 : LinkedHashSet도 HashSet과 마찬가지로 주요 연산에 대해 평균 O(1) 시간 복잡도를 가짐
용도 : 데이터의 유일성과 함께 삽입 순서를 유지해야 할 때 적합함
참고 : 연결 링크를 유지해야 하기 때문에 HashSet 보다는 조금 더 무거움

구현 : TreeSet은 이진 탐색 트리를 개선한 레드-블랙 트리를 내부에서 사용함
순서 : 요소들은 정렬된 순서로 저장됨
Comparator)로 변경할 수 있음시간 복잡도 : 주요 연산들은 O(log n)의 시간 복잡도를 가짐
HashSet보다는 느림용도 : 데이터들을 정렬된 순서로 유지하면서 집합의 특성을 유지해야 할 때 사용함

root)라 함TreeSet은 이진 탐색 트리를 개선한 레드-블랙 트리를 사용함
class Node {
Object item;
Node left;
Node right;
}






여기에는 총 15개의 데이터가 들어있음
여기서 숫자 35를 검색한다고 가정해보자
- 데이터가 총 15개인데 4번의 계산으로 필요한 결과를 얻을 수 있었음
- 이는
O(n)인 리스트의 검색보다는 빠르고,O(1)인 해시의 검색 보다는 느림- 리스트의 경우
O(n)이므로 15번의 연산이 필요함- 해시 검색은
O(1)이므로 1번의 연산이 필요함
이진 탐색 트리 계산의 핵심은 한 번에 절반을 날린다는 점
계산을 단순화 하기 위해 16개의 데이터가 있다고 가정
16개의 데이터가 있다. 루트에서 처음 비교를 통해 절반의 데이터를 찾지 않아도 된다. 따라서 16 / 2 = 8이 된다.
8개의 데이터가 있다. 비교를 통해 절반의 데이터만 남는다. 따라서 8 /2 = 4가 된다.
4개의 데이터가 있다. 비교를 통해 절반의 데이터만 남는다. 따라서 4 / 2 = 2가 된다.
2개의 데이터가 있다. 비교를 통해 절반의 데이터만 남는다. 따라서 2 / 2 = 1이 된다.
1이 남았으므로 이 값이 맞는지 확인하면 된다

16개의 경우 단 4번의 비교 만으로 최종 노드에 도달할 수 있음
log₂(2)=1log₂(4)=2log₂(8)=3log₂(16)=4log₂(32)=5log₂(64)=6log₂(1024)=101024개의 데이터를 단 10번의 계산으로 원하는 결과를 찾을 수 있음
데이터의 크기가 늘어나도 늘어난 만큼 한 번의 계산에 절반을 날려버리기 때문에, O(n)과 비교해서 데이터의 크기가 클수록 효과적임
이것을 수학으로 log₂(n)으로 표현함
빅오 표기법으로 나타내면 O(log n)로 표현함
O(log n)O(n)의 성능이 나옴
O(n)이 성능이 나옴
TreeSet은 레드-블랙 트리를 사용해서 균형을 지속해서 유지함O(log n)의 성능을 제공함

package collection.set.javaset;
import java.util.*;
public class JavaSetMain {
public static void main(String[] args) {
run(new HashSet<>());
run(new LinkedHashSet<>());
run(new TreeSet<>());
}
private static void run(Set<String> set) {
System.out.println("set = " + set.getClass());
set.add("C");
set.add("B");
set.add("A");
set.add("1");
set.add("2");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
System.out.println();
}
}
HashSet, LinkedList, TreeSet 모두 Set 인터페이스를 구현하기 때문에 구현체를 변경하면서 실행할 수 있음
iterator()를 호출하면 컬렉션을 반복해서 출력할 수 있음
iterator.hashNext() : 다음 데이터가 있는지 확인iterator.next() : 다음 데이터를 반환함실행결과
set = class java.util.HashSet
A 1 B 2 C
set = class java.util.LinkedHashSet
C B A 1 2
set = class java.util.TreeSet
1 2 A B C
HashSet : 입력한 순서를 보장하지 않음LinkedHashSet : 입력한 순서를 정확히 보장함TreeSet : 데이터 값을 기준으로 정렬함