✅ Set Interface
![](https://blog.kakaocdn.net/dn/3zK4m/btskAIM09Io/NvLs9o4aprWwa7iHhKmCL1/img.png)
자바에서 Set은 중복된 요소를 허용하지 않는 컬렉션 인터페이스입니다. Set은 수학적인 집합 개념을 모델링하며, 고유한 요소들의 모음을 나타냅니다. Set은 다양한 구현체를 가질 수 있으며, 가장 일반적인 구현체로는 HashSet, TreeSet, LinkedHashSet이 있습니다.
- 중복되는 요소(원소)를 허용하지 않습니다.
- 저장 순서를 유지하지 않습니다. (LinkedHashSet 만 예외)
Set 인터페이스는 Collection 인터페이스를 확장하고 있으며, 다양한 메서드를 제공합니다. 예를 들어, Set에 요소를 추가하려면 add()
메서드를 사용하고, 요소를 삭제하려면 remove()
메서드를 사용합니다. 또한, Set의 크기를 확인하려면 size()
메서드를 사용할 수 있습니다.
Set은 중복된 요소를 허용하지 않으므로, 요소의 동등성(equality, 값이 같은지)을 판단하기 위해 요소 클래스에 equals()
와 hashCode()
메서드를 적절하게 구현해야 합니다. 동등성 판단은 HashSet 및 HashMap과 같은 내부 구조를 사용하는 Set 구현체에서 중요합니다.
Set은 중복된 요소를 제거하고 고유한 요소들로만 구성된 컬렉션을 다루고자 할 때 유용합니다. 예를 들어, 집합 연산을 수행하거나 중복을 제거한 목록을 생성하려는 경우에 Set을 사용할 수 있습니다.
![](https://blog.kakaocdn.net/dn/zTVNS/btskynh5mhR/GWI7yO6krcKZsKh1wgUgD1/img.png)
🔹HashSet
HashSet은 해시 테이블을 사용하여 요소를 저장하는 Set의 구현체입니다. HashSet은 요소의 순서를 유지하지 않습니다. HashSet은 O(1) 시간 복잡도로 요소를 삽입, 삭제, 검색할 수 있습니다. 요소의 순서가 중요하지 않거나, 중복 요소를 허용하지 않는 경우에 사용하기 적합합니다.
- 요소의 순서를 보장하지 않습니다.
- 중복된 요소를 허용하지 않습니다.
- 해시 테이블을 기반으로 구현되어 데이터를 매우 빠르게 추가, 제거, 검색할 수 있습니다.
- 순서가 중요하지 않고, 중복된 요소를 허용하지 않아야 할 때 사용합니다.
Set<String> hashSet = new HashSet<>(); hashSet.add("apple"); hashSet.add("banana"); hashSet.add("apple"); // 중복된 요소는 추가되지 않음 for (String element : hashSet) { System.out.println(element); }
apple banana
HashSet은 중복된 요소를 허용하지 않습니다. 따라서 "apple"을 두 번 추가했지만 중복된 요소는 한 번만 저장되어 출력됩니다. HashSet은 순서를 보장하지 않기 때문에 요소의 출력 순서는 일정하지 않을 수 있습니다.
💡—HashSet은 왜 다른 Set보다 검색 속도가 빠를까? HashSet은 내부적으로 HashMap을 사용하여 구현되기 때문에 검색이 빠른 이유를 이해하기 위해서는 HashMap의 동작 원리를 알아야 합니다. HashMap은 { 키 : 값 } 쌍을 저장하는 자료구조로, 키(key)를 해시 함수에 넣어 해시코드(해시값)로 변환한 후, 이를 인덱스로 사용하여 배열에 저장합니다. 이렇게 변환된 해시코드를 인덱스로 사용하여 값을 저장하고 검색할 때, 배열의 크기와 상관없이 매우 빠른 검색 속도를 제공합니다. HashSet은 내부적으로 HashMap을 사용하여 요소를 저장하기 때문에, 중복을 허용하지 않는 Set의 특성을 가지면서도 검색 속도가 빠릅니다. HashSet에서 요소를 추가할 때, 요소를 HashMap의 키(key)로 저장하고, 값(value)은 모두 동일한 객체를 사용합니다. 이렇게 함으로써 HashSet은 중복 요소를 허용하지 않으면서도 HashMap의 해시 기반 검색 속도를 활용할 수 있습니다. HashSet에서 요소를 검색할 때, 내부적으로 HashMap의 해시 기반 검색 방식을 사용합니다. 검색하려는 요소의 해시코드를 계산하여 해당 인덱스로 접근하고, 저장된 요소와 비교하여 일치하는 요소를 찾습니다. 이 과정은 배열에서 직접 요소를 검색하는 것보다 해시코드를 이용하여 검색하기 때문에 훨씬 빠르게 요소를 찾을 수 있습니다.
🔹TreeSet
TreeSet은 이진 검색 트리를 사용하여 요소를 저장하는 Set의 구현체입니다. TreeSet은 요소를 기본적으로 오름차순으로 정렬된 상태로 유지합니다. TreeSet은 O(log n) 시간 복잡도로 요소를 삽입, 삭제, 검색할 수 있습니다. 정렬된 상태로 요소를 유지하고 싶거나, 범위 기반의 검색이 필요한 경우에 사용하기 적합합니다.
- 요소의 정렬된 순서를 유지합니다.
- 중복된 요소를 허용하지 않습니다.
- 이진 검색 트리를 기반으로 구현되어 데이터를 정렬된 상태로 유지하고 검색할 수 있습니다.
- 정렬된 순서가 필요하고, 중복된 요소를 허용하지 않아야 할 때 사용합니다.
Set<Integer> treeSet = new TreeSet<>(); treeSet.add(3); treeSet.add(1); treeSet.add(2); for (Integer element : treeSet) { System.out.println(element); }
1 2 3
TreeSet은 요소를 정렬된 순서로 유지합니다. 따라서, 1, 2, 3의 순서대로 출력됩니다. TreeSet은 내부적으로 이진 검색 트리를 사용하여 요소를 정렬하므로, 추가된 순서와는 관계없이 정렬된 순서로 요소가 출력됩니다.
🔹LinkedHashSet
LinkedHashSet은 해시 테이블과 연결 리스트를 사용하여 요소를 저장하는 Set의 구현체입니다. LinkedHashSet은 요소를 삽입한 순서대로 유지합니다. LinkedHashSet은 HashSet의 기능에 순서를 추가한 것으로 생각할 수 있습니다. HashSet과 마찬가지로 O(1) 시간 복잡도로 요소를 삽입, 삭제, 검색할 수 있습니다. 요소의 순서를 유지하고 싶으면서도 중복 요소를 허용하지 않는 경우에 사용하기 적합합니다.
- 요소의 삽입 순서를 유지합니다.
- 중복된 요소를 허용하지 않습니다.
- 해시 테이블과 연결 리스트를 조합하여 구현되어 데이터를 순서대로 유지하고 검색할 수 있습니다.
- 요소의 삽입 순서를 유지하고, 중복된 요소를 허용하지 않아야 할 때 사용합니다.
Set<String> linkedHashSet = new LinkedHashSet<>(); linkedHashSet.add("apple"); linkedHashSet.add("banana"); linkedHashSet.add("apple"); // 중복된 요소는 추가되지 않음 for (String element : linkedHashSet) { System.out.println(element); }
apple banana
LinkedHashSet은 요소의 삽입 순서를 유지합니다. 따라서, "apple"을 먼저 추가하고 "banana"를 추가한 순서대로 요소가 출력됩니다. 중복된 요소는 추가되지 않기 때문에, "apple"이 한 번만 출력됩니다.
🏷️이미지 출처 및 참고한 사이트
![](https://img1.daumcdn.net/thumb/R800x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ8Sz6%2Fbtq2idv771I%2FolWu6XcKgojDrzzkFPYSv0%2Fimg.png)
Uploaded by N2T