Set 인터페이스 - 컬렉션

Kim taegwan·2026년 4월 1일

List 와 Set 의 결정적 차이

List 는 같은 값을 여러 번 저장할 수 있습니다. Set 은 같은 값을 저장할 수 없습니다.

List : [철수, 영희, 철수, 민준]  → 철수가 두 번 들어가도 됨
Set  : [철수, 영희, 민준]        → 철수를 두 번 넣으면 한 번만 저장됨
Collection (인터페이스)
    |
    ├── List (인터페이스)
    │    ├── ArrayList
    │    ├── LinkedList
    │    ├── Vector
    │    └── ...
    │
    ├── Set (인터페이스)
    │    ├── HashSet
    │    ├── LinkedHashSet
    │    ├── TreeSet
    │    └── ...

Set 의 세 가지 특징

  1. 중복 불허 : 같은 값은 한 번만 저장됩니다
  2. 순서 없음 : 넣은 순서가 보장되지 않습니다
  3. 가변 크기 : 추가/삭제 시 크기가 자동으로 변합니다

Set 이 필요한 순간

중복을 자동으로 제거하고 싶을 때 Set 이 딱입니다.

사용자 아이디 목록 → 아이디는 중복 불가
로또 번호 6개 뽑기 → 같은 번호 중복 불가
방문한 페이지 기록 → 같은 페이지 중복 제거

HashSet 기본 사용법

  • Set 계열의 가장 기본적인 구현체
  • 순서 없음 : 넣은 순서대로 저장되지 않음
  • null 허용 : null 값을 한 번 저장할 수 있음
  • 빠른 속도 : 내부적으로 해시 테이블을 사용해서 add(), remove(), contains() 가 빠름

값을 저장할 위치를 계산으로 결정하는 자료구조입니다.

package collection.set;

import java.util.HashSet;
import java.util.Set;

public class SetEx {

    public static void main(String[] args) {

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

        // 추가
        set.add("철수");
        set.add("영희");
        set.add("철수"); // 중복! 무시 됨

        System.out.println(set);
        System.out.println(set.size());

        // 포함 여부
        System.out.println(set.contains("철수"));
        System.out.println(set.contains("민준"));
        // set.contains("철수"); // true
        // set.contains("민준"); // false

        // 삭제
        set.remove("철수");

        // 전체 순회
        for (String name : set) {
            System.out.println(name);
        }


    } // end of main

} // end of class

package collection.set;

import java.util.*;

public class LottoGame {

    public static void main(String[] args) {

        Set<Integer> lotto = new HashSet<>();
        Random random = new Random();

        // 6개가 될 때까지 계속 추가
        while (lotto.size() < 6) {
            int number = random.nextInt(45) + 1; // 1 ~ 45
            lotto.add(number);
        }

        System.out.println("이번 주 로또 번호 : " + lotto);
        System.out.println("총 " + lotto.size() + "개");

        // 로또 번호를 오름 차순으로 정렬하시오.
        // 힌트 - 배열이나 List 계열은 순서가 있음.
        // ArrayList 생성자 안에 set 계열을 넣으면 자동으로 ArrayList 객체를 생성해 준다.
        List<Integer> sortedLotto = new ArrayList<>(lotto);

        // 오름 차순 정렬
        Collections.sort(sortedLotto);
        System.out.println("오름 차순 로또 번호 : " + sortedLotto);

    }
}

List sortedLotto = new ArrayList<>(lotto); 이렇게 하면
arrylist 안에 hashset자체가 들어가는게 아니라 요소만 들어간다.

import java.util.*;

public class Main {
  public static void main(String[] args) {

      // 1. 빈 리스트 생성
      ArrayList<String> a1 = new ArrayList<>();

      // 2. 초기 용량 지정
      ArrayList<String> a2 = new ArrayList<>(5);

      // 3. 다른 컬렉션 넣기
      Set<String> set = new HashSet<>();
      set.add("사과");
      set.add("바나나");

      ArrayList<String> a3 = new ArrayList<>(set);

      System.out.println(a1); // []
      System.out.println(a2); // []
      System.out.println(a3); // [사과, 바나나] 순서는 set 특성상 달라질 수 있음
  }
}

이렇게 보면 array list 안에는 크기를 지정할수도 있고 이렇게 다른 객체를 넣어서
new ArrayList<>(list)
new ArrayList<>(set)
new ArrayList<>(vector)
그래서

Set<String> set = new HashSet<>();
set.add("A");
set.add("B");

List<String> list = new ArrayList<>(set);
System.out.println(list);

이렇게 통째로 출력하거나

for (int i = 0; i < list.size(); i++) {
  System.out.println(list.get(i));
}

get으로도 출력할수있다

0개의 댓글