import java.util.HashSet; import java.util.Set; public class SetLottoExample { public static void main(String[] args) { Set<Integer> lotto = new HashSet<>(); while(true) { lotto.add((int)(Math.random()*45+1)); if(lotto.size()>=6) break; } System.out.println(lotto); } }
1회 결과 [33, 37, 5, 6, 23, 43] 2회 결과 [32, 18, 35, 36, 41, 31] 3회 결과 [1, 19, 35, 22, 25, 14] 4회 결과 [2, 20, 21, 5, 41, 11] 5회 결과 [33, 17, 21, 8, 10, 28] 6회 결과 [16, 33, 39, 40, 9, 31]
HashSet<Num> set = new HashSet<>(); set.add(new Num(7799)); set.add(new Num(9955)); set.add(new Num(7799)); System.out.println("인스턴스 수: " + set.size()); for(Num n : set) System.out.print(n.toString() + '\t'); System.out.println();
인스턴스 수: 2 7799 9955
class Num{ private int num; public Num(int num) { this.num = num; } @Override public String toString() { return String.valueOf(num); } @Override public int hashCode() { return num; } @Override public boolean equals(Object obj) { if(num == ((Num)obj).num) return true; return false; } } import java.util.HashSet; public class VelogSetExample { public static void main(String[] args) { HashSet<Num> set = new HashSet<>(); set.add(new Num(7799)); set.add(new Num(9955)); set.add(new Num(7799)); System.out.println("인스턴스 수: " + set.size()); for(Num n : set) System.out.print(n.toString() + '\t'); System.out.println(); } }
인스턴스 수: 2 9955 7799
HashSet<Person> hSet = new HashSet<Person>(); hSet.add(new Person("LEE", 10)); hSet.add(new Person("LEE", 10)); hSet.add(new Person("PARK", 35)); hSet.add(new Person("PARK", 35)); System.onut.println("저장된 데이터 수: " + hSet.size()); System.out.println(hSet);
저장된 데이터 수: 2 [LEE(10세), PARK(35세)]
- add할 때 객체를 생성하는데 객체 생성 후 생성된 객체의 클래스의 오버라이드된 hashCode() 메소드를 먼저 불러와서 같은 것이 있는지 비교한다. 같은 것이 없으면 객체를 Set에 추가를 한다. 같은 것이 있다면 마찬가지로 오버라이드된 equals() 메소드에서 값을 확인한다. 그렇게 확인을 해서 equals() 메소드에서 true를 리턴하면 원래 있던 객체를 삭제하고 등록. false를 리턴하면 그냥 새로 생성한다.
- hashCode()와 equals() 메소드를 통해 중복되지 않도록 생성해 저장된 데이터 수는 2개고, 순서는 상관없기 때문에 또 오버라이딩 된 toString()메소드의 리턴값을 출력하며 LEE(10세), PARK(35세)가 출력되는 것이다.