Set은 순서가 없는 컬렉션이에요. List와 달리 중복된 값을 담지 않는다는 것이 보장되어 있죠.
Set 인터페이스의 제네릭 타입 매개변수는 Set에 담긴 원소의 타입을 나타내요.
Set<Integer> ints = Set.of(1, 2, 3);
Set<String> strings = Set.of("alpha", "beta", "gamma");
Set<Object> mixed = Set.of(1, false, "foo");
Set.of() 메서드는 수정 불가능한 Set 인스턴스를 만들어요.
이 인스턴스에서 add나 remove 같은 메서드를 호출하려고 하면 런타임에 예외가 발생해요.
수정 가능한 Set을 만들려면 Set 인터페이스를 구현하는 클래스를 인스턴스화해야 해요.
이 인터페이스를 구현하는 가장 많이 쓰이는 내장 클래스는 HashSet 클래스예요.
Set<Integer> ints = new HashSet<>();
Set 인터페이스는 Collection과 Iterable 인터페이스를 확장하기 때문에 다른 종류의 컬렉션과 많은 메서드를 공유해요.
그런데 Collection 인터페이스와 눈에 띄게 다른 점이 하나 있어요. add나 remove 같은 메서드가 void가 아니라 boolean을 반환한다는 건데, 이 값은 그 메서드를 호출했을 때 항목이 Set에 들어 있었는지 여부를 나타내요.
Set<Integer> set = new HashSet<>();
set.add(1);
// => true
set.add(2);
// => true
set.add(1);
// => false
set.size();
// => 2
set.contains(1);
// => true
set.contains(3);
// => false
set.remove(3);
// => false
set.remove(2);
// => true
set.size();
// => 1