<aside>

Set이 왜 필요할까

Set은 순서에 상관 없이, 어떤 데이터가 존재하는지를 확인하기 위한 용도로 많이 사용된다. 즉, 중복을 방지하고 원하는 값이 포함되어 있는지를 확인하는 것이 주 용도이다.

예를 들어 서버에 1분간 사용자가 요청한 로그가 있다고 했을 때, 이 서버에 요청한 IP를 기준으로 사용자의 수가 얼마나 되는지 확인한다고 가정해보자. 1분간 동일한 서버에 요청하는 중복 사용자 수는 매우 많다. 이러한 경우 Set을 구현한 클래스를 사용해 데이터를 추가하면 중복 없이 데이터를 저장할 수 있다. 이 때, 사용자가 사용한 IP순서는 중요하지 않다

이처럼 어떤 값이 존재하는지 여부만 중요할 때 Set을 사용한다

</aside>

Java 에서는 Set 인터페이스를 구현한 주요 클래스는 HashSet, TreeSet, LinkedHashSet이 있다

성능은 HashSet > TreeSet> LinkedHashSet 순으로 좋다

HashSet의 주요 메서드

리턴 타입 메서드 이름 및 매개 변수 설명
boolean add(E e) 데이터 추가
void clear() 모든 데이터 삭제
Object clone() HashSet 객체 복사. 담겨있는 데이터는 복사하지 않음
boolean contains(Object o) 지정한 객체가 존재하는지 확인
boolean isEmpty() 데이터가 있는지 확인
Iterator<E> iterator() 데이터를 꺼내기 위한 Iterator 객체를 리턴
boolean remove(Object o) 매개 변수로 넘어온 객체를 삭제
int size() 데이터의 개수 리턴

기본 사용법

import java.util.HashSet;

HashSet<String> set = new HashSet<>();

set.add("apple");     // 원소 추가
set.add("banana");
set.add("apple");     // 중복이므로 추가되지 않음

System.out.println(set); // 출력: [banana, apple] 등 (순서 보장 X)

set.remove("banana"); // 원소 제거
System.out.println(set.contains("apple")); // true

set.clear(); // 모든 원소 제거
System.out.println(set.isEmpty()); // true

반복문에서 Set 사용

for (String fruit : set) {
    System.out.println(fruit);
}

중복 제거할 때

String[] arr = {"a", "b", "a", "c", "b"};

// 1. 배열 → List로 변환
List<String> list = Arrays.asList(arr);

// 2. List → Set으로 중복 제거
Set<String> set = new HashSet<>(list);

System.out.println(set); // 출력: [a, b, c] (순서 무작위)

Arrays.asList() 는 배열을 List로 변환해주는 메서드로, HastSet 생성자의 인자로 변환한 list를 넘겨준