최원종의 개발 블로그

Set 인터페이스 - 컬렉션 본문

Java/JAVA 유용한 클래스

Set 인터페이스 - 컬렉션

chl6698 2026. 3. 30. 09:11

List 와 Set 의 결정적 차이

  • List 는 같은 값을 여러 번 저장할 수 있다.
  • Set 은 같은 값을 저장할 수 없다
List : [철수, 영희, 철수, 민준]  → 철수가 두 번 들어가도 됨
Set  : [철수, 영희, 민준]        → 철수를 두 번 넣으면 한 번만 저장됨

 

Collection (인터페이스)
    |
    ├── List (인터페이스)
    │    ├── ArrayList
    │    ├── LinkedList
    │    ├── Vector
    │    └── ...
    │
    ├── Set (인터페이스)
    │    ├── HashSet
    │    ├── LinkedHashSet
    │    ├── TreeSet
    │    └── ...

 


Set 의 세 가지 특징

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

 

 

Set 이 필요할 때 ( 중복을 자동으로 제거하고 싶을 때)

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

 


HashSet 기본 사용법

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

해시 테이블이란?

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

-- 사물함 비유 —

일반 방식 (배열/리스트) 
사물함 1번부터 순서대로 빈 칸 찾아서넣기
찾을 때도 1번부터 하나씩 열어봐야 함 → 느림

해시 테이블 방식 
이름표를 계산기에 넣으면 → "37번 사물함에 넣어"
찾을 때도 계산기에 넣으면 → "37번 사물함 열어봐" → 바로 찾음, 빠름

 


-실습 코드

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("철수");// 중복1 무시됨

        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);

        }

    }
}

-로또 게임 코드

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<Integer> list = new ArrayList<>(lotto);
        Collections.sort(list);
        System.out.println("로또 오름차순 정렬 : " + list);
    }
}

List vs Set 비교

  List Set
순서 유지됨 유지 안 됨
중복 허용 불허
인덱스 접근 가능 (get(0)) 불가
주요 구현체 ArrayList, Vector HashSet
사용 상황 순서가 중요할 때 중복 없이 관리할 때

 


핵심 요약

Set 인터페이스
  중복 불허, 순서 없음, 크기 자동 조절

HashSet
  Set 의 가장 기본적인 구현체
  add() 로 추가, 중복이면 false 반환 후 무시
  contains() 로 포함 여부 확인

언제 쓰나요?
  중복 없이 데이터를 관리해야 할 때
  예: 아이디 목록, 로또 번호, 중복 제거

 

'Java > JAVA 유용한 클래스' 카테고리의 다른 글

컬렉션 프레임워크 실습 - 회원 관리 시스템  (0) 2026.03.31
Map 인터페이스 - 컬렉션  (0) 2026.03.31
List 인터페이스 - 컬렉션  (0) 2026.03.30
Vector - 컬렉션  (0) 2026.03.30
ArrayList - 컬렉션  (0) 2026.03.30