[자료구조] Set

1. 소개

Set이란?

Set은 Java 컬렉션 프레임워크의 일부로, 중복을 허용하지 않는 데이터 집합을 표현한다.

수학의 집합 개념과 유사

순서를 보장하지 않지만, 일부 구현체(LinkedHashSet, TreeSet)는 순서를 유지하거나 정렬한다.

 

특징

중복 요소를 허용하지 않는다.

null 요소를 허용한다. (TreeSet은 허용 X)

순서를 보장하지 않는다. (LinkedHashSet, TreeSet은 예외)

 

주요 메서드

boolean add(E e);          // 요소 추가
boolean remove(Object o);  // 요소 삭제
boolean contains(Object o); // 요소 포함 여부 확인
int size();                // Set의 크기 반환
boolean isEmpty();         // Set이 비어있는지 확인
void clear();              // 모든 요소 삭제
Iterator<E> iterator();    // Set의 요소를 순회하는 Iterator 반환

 

 

2. Set 구현 클래스

 

HashSet

  • 가장 일반적으로 사용되는 Set 구현체
  • 내부적으로 HashMap을 사용하여 데이터를 저장
  • 순서 보장하지 않음
  • null 허용

사용 사례

  • 중복을 허용하지 않는 데이터를 저장할 때
  • 순서가 중요하지 않은 경우

예제

Set<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Cherry");
set.add("Apple"); // 중복 추가 시 무시됨

System.out.println(set); // 출력: [Apple, Banana, Cherry]

 

 

 

LinkedHashSet

  • HashSet과 유사하지만, 삽입 순서를 유지
  • 내부적으로 LinkedHashMap을 사용하여 데이터를 저장
  • null 허용

사용 사례

  • 중복을 허용하지 않으면서 순서를 유지해야 할 때

예제

Set<String> set = new LinkedHashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Cherry");

System.out.println(set); // 출력: [Apple, Banana, Cherry] (삽입 순서 유지)

 

 

 

 

TreeSet

  • 정렬된 순서로 요소를 저장
  • 내부적으로 Red-Black Tree를 사용
  • null 허용 X
  • Comparator를 사용하여 사용자 정의 정렬이 가능

사용 사례

  • 중복을 허용하지 않으면서 정렬된 데이터를 저장할 때

예제

Set<String> set = new TreeSet<>();
set.add("Banana");
set.add("Apple");
set.add("Cherry");

System.out.println(set); // 출력: [Apple, Banana, Cherry] (기본 유니코드 순서로 정렬)

 

Comparator를 이용한 사용자 정의 정렬 - 문자열 길이를 기준으로한 예제

 

import java.util.Comparator;
import java.util.TreeSet;

public class TreeSetComparatorExample {
    public static void main(String[] args) {
        // Comparator를 사용하여 TreeSet 생성 (문자열 길이로 정렬)
        TreeSet<String> set = new TreeSet<>(new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                return Integer.compare(s1.length(), s2.length()); // 길이 기준 정렬
            }
        });

        // 데이터 추가
        set.add("Apple");
        set.add("Banana");
        set.add("Cherry");
        set.add("Dragonfruit");
        set.add("Egg");

        // 출력 (길이 순서로 정렬됨)
        System.out.println(set); // 출력: [Egg, Apple, Banana, Cherry, Dragonfruit]
    }
}

 

람다식으로도 가능

import java.util.TreeSet;

public class TreeSetComparatorExample {
    public static void main(String[] args) {
        // 람다 표현식으로 Comparator 구현 (문자열 길이로 정렬)
        TreeSet<String> set = new TreeSet<>((s1, s2) -> Integer.compare(s1.length(), s2.length()));

        // 데이터 추가
        set.add("Apple");
        set.add("Banana");
        set.add("Cherry");
        set.add("Dragonfruit");
        set.add("Egg");

        // 출력 (길이 순서로 정렬됨)
        System.out.println(set); // 출력: [Egg, Apple, Banana, Cherry, Dragonfruit]
    }
}

 

 

 

3. Set 활용법

 

중복 제거

List<String> list = Arrays.asList("Apple", "Banana", "Apple", "Cherry");
Set<String> set = new HashSet<>(list); // 중복 제거

System.out.println(set); // 출력: [Apple, Banana, Cherry]

 

집합 연산

Set<Integer> set1 = new HashSet<>(Arrays.asList(1, 2, 3));
Set<Integer> set2 = new HashSet<>(Arrays.asList(3, 4, 5));

// 합집합
Set<Integer> union = new HashSet<>(set1);
union.addAll(set2);
System.out.println("합집합: " + union); // 출력: [1, 2, 3, 4, 5]

// 교집합
Set<Integer> intersection = new HashSet<>(set1);
intersection.retainAll(set2);
System.out.println("교집합: " + intersection); // 출력: [3]

// 차집합
Set<Integer> difference = new HashSet<>(set1);
difference.removeAll(set2);
System.out.println("차집합: " + difference); // 출력: [1, 2]

 

4. 비교

구현 클래스 추가/삭제/조회 성능 순서 유지 정렬 null 허용
HashSet O(1) X X O
LinkedListSet O(1) O X O
TreeSet O(log n) X O X

 

'알고리즘공부 > 자료구조' 카테고리의 다른 글

[자료구조] Map  (0) 2025.01.27
[자료구조] Heap (힙)  (0) 2025.01.21
[자료구조] 그래프, dfs, bfs  (0) 2025.01.21
[자료구조] 트라이 (trie)  (0) 2025.01.20
[자료구조] 트리순회 (전위, 중위, 후위)  (0) 2025.01.20