<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
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를 넘겨준