개발천재

[JAVA] Set 제대로 활용하기, 로또 번호 만들기 본문

개발 준비/JAVA

[JAVA] Set 제대로 활용하기, 로또 번호 만들기

세리블리 2025. 2. 21. 22:03
반응형

Set 이해하기

Set은 중복을 허용하지 않는 데이터 구조이다. 같은 값을 여러 번 저장할 수 없고, 순서도 보장되지 않는다.

 

Set은 중복된 값을 저장할 수 없기 때문에 동일한 값이 들어오게 되면 데이터가 하나 더 생기는 것이 아니라 기존 데이터가 유지된다. 또한 순서가 있는 List와 달리 Set은 순서를 보장하지 않고, null 값을 저장할 수 있다(단 한번). 또한 내부적으로 해싱(Hashing) 알고리즘을 사용하기 때문에 검색, 추가, 삭제가 빠르다는 장점이 있다.

 

set은 중복 데이터를 허용하지 않아야 할 때 사용한다. 예를 들어 회원 ID나 이메일을 저장할 때 중복 데이터가 있으면 안되기 때문에 Set을 사용할 수 있다.

 

✔ 중복 값 저장 불가
  순서가 보장되지 않음
  null 값 저장 가능
  빠른 검색과 삭제

 

자바에서 Set을 구현한 주요 클래스

Set 구현체 정렬여부 특징
HashSet  X, 정렬되지 않음 가장 일반적인 Set, 중복 불가, 검색 속도가 빠름
LinkedHashSet  O, 입력 순서 유지  저장 순서를 유지, HashSet보다 약간 느림
TreeSet  O, 자동 정렬됨 내부적으로 TreeMap 사용

 


 

 

Set 사용하기

HashSet<>, 가장 많이 사용

Set 자체가 중복을 허용하지 않기 때문에 "Apple"을 두 번 추가했지만 한 번만 저장된다. 출력 순서는 예측할 수 없다. (HashSet은 정렬되지 않음) contains()를 이용해 특정 요소가 있는지 확인할 수 있고, clear()로 전체 요소를 삭제할 수 있다.

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

public class HashSetExample {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();

        set.add("Apple");
        set.add("Banana");
        set.add("Cherry");
        set.add("Apple"); // 중복된 값, 추가되지 않음

        System.out.println(set); // [Banana, Apple, Cherry] (순서는 보장 안됨)

        set.remove("Banana"); // 특정 요소 삭제
        System.out.println(set.contains("Cherry")); // true (해당 요소가 존재하는지 확인)

        set.clear(); // 전체 요소 삭제
        System.out.println(set.isEmpty()); // true (비어 있는지 확인)
    }
}

 

 

 

 

LinkedHashSet 사용 예제 (순서 유지)

LinkedHashSet은 HashSet과 달리 입력한 순서가 유지된다. Set이 중복 데이터를 허용하지 않기 때문에 "Apple"을 두 번 추가해도 한 번만 저장된다.

import java.util.LinkedHashSet;
import java.util.Set;

public class LinkedHashSetExample {
    public static void main(String[] args) {
        Set<String> set = new LinkedHashSet<>();

        set.add("Apple");
        set.add("Banana");
        set.add("Cherry");
        set.add("Apple"); // 중복 추가 불가

        System.out.println(set); // [Apple, Banana, Cherry] (입력한 순서 유지)
    }
}

 

 

 

TreeSet 사용 예제 (자동 정렬)

TreeSet은 오름차순으로 자동 정렬된다.

import java.util.Set;
import java.util.TreeSet;

public class TreeSetExample {
    public static void main(String[] args) {
        Set<Integer> set = new TreeSet<>();

        set.add(30);
        set.add(10);
        set.add(20);
        set.add(10); // 중복 불가

        System.out.println(set); // [10, 20, 30] (자동 정렬)
    }
}

 

 


 

 

Set을 이용해 List의 중복 요소 제거하기

리스트에서 중복 요소를 제거하려면 Set으로 변환하면 가능하다.

import java.util.*;

public class RemoveDuplicates {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("Apple", "Banana", "Apple", "Cherry", "Banana");
        Set<String> set = new HashSet<>(list);

        System.out.println(set); // [Banana, Apple, Cherry] (중복 제거됨)
    }
}

 

 

 

 

Set 정렬하는 방법

HashSet이나 LinkedHashSet은 정렬 기능이 없으므로, 정렬하려면 List로 변환한 후 정렬해야 한다.
먼저, Set을 List로 변환하고 Collections.sort()를 사용하여 정렬하면 된다.

import java.util.*;

public class SetSorting {
    public static void main(String[] args) {
        Set set = new HashSet<>();
        set.add("Banana");
        set.add("Apple");
        set.add("Cherry");

        // Set -> List 변환 후 정렬
        List sortedList = new ArrayList<>(set);
        Collections.sort(sortedList);

        System.out.println(sortedList); // [Apple, Banana, Cherry] (정렬됨)
    }
}

 

 

 

Set 사용하여 로또 번호 만들기

로또번호 만들기

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

public class LottoNumber {
    public static void main(String[] args) {
        // 로또번호를 담는 Set 자료구조
        Set<Integer> lotto = new HashSet<>();
        while (lotto.size() < 6) {
            int num = ((int)(Math.random() * 45)) + 1;
            lotto.add(num);
        }
        System.out.println(lotto);
    }
}

 

Set을 List로 변경하기

        // Set을 List로 바꿔보기
        List<Integer> intLotto = new ArrayList<>(lotto);
        // 정렬하기
        Collections.sort(intLotto);
        System.out.println(intLotto);

        // 역으로 정렬하기
        Collections.sort(intLotto, Collections.reverseOrder());
        System.out.println(intLotto);

 

 

반응형