ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA]로또 번호 만들기(2), 제네릭
    개발 완료 2020. 5. 21. 12:15
    반응형

    Java 배열을 이용해서 로또번호 추첨

     

    목적

    • 로또 번호 만든다
    • 제네릭을 사용해서 리팩토링

    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
           Set set = new HashSet();
    
            for (int i = 0; set.size() < 6; ++i) {
                int num = (int) (Math.random()*45) + 1;
                set.add((num));
            }
    
            System.out.println("set >>> " + set);
    
            List list = new LinkedList(set);
            Collections.sort(list);
            System.out.println("list >>>> " + list);
    
        }
    }
    자바의 정석 기초 편 참고

     

     

    1부터 46 사이의 번호를 랜덤하게 6개 뽑아주는, 로또 번호 추첨기입니다.

     

    Set 인터페이스, HashSet() 생성자를 이용해서, set 인스턴스를 생성했습니다. for문으로 1 ~ 46 번호를 랜덤으로 뽑아, set 변수에 추가해줍니다. Set 인터페이스는 중복된 요소 저장하지 않습니다. 또한 HashSet은 저장 순서를 유지하지 않습니다.

     

    만약에 sort 메서드를 이용해서 번호를 순서대로 저장하지 않는다면, 굳이 아래처럼 List 인터페이스로 변경한 후 순서대로 정리할 필요가 없습니다. 

     

    Collections 클래스의 sort 메소드는 인자로 List 인터페이스를 받습니다. 그래서 굳이 굳이 List 인터페이스로 set를 변경했습니다. LinkedList 클래스 또한 ArrayList를 쓰셔도 됩니다. List 인터페이스를 상속받는 클래스는 아무거나 써도 됩니다.


    근데 뭔가 아쉽습니다?

     

    제네릭을 사용하면 자바 컴파일러가 컴파일을 할 때 타입 체크를 더 명확하고 강력하게 합니다. 그렇게 된다면 찾기 힘든 에러를 찾을 수 있습니다. 또한 굳이 형변환을 하면서 시간과 메모리를 낭비할 필요가 없습니다. 제네릭에 대해서는 나중에 또 올리도록 하겠습니다.

     

    import java.lang.reflect.Array;
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
           Set<Integer> set = new HashSet<Integer>();
    
            for (int i = 0; set.size() < 6; ++i) {
                int num = (int) (Math.random()*45) + 1;
                set.add((num));
            }
    
            System.out.println("set >>> " + set);
    
            List<Integer> list = new LinkedList<Integer>(set);
            Collections.sort(list);
            System.out.println("list >>>> " + list);
    
        }
    }

     

    사실 이 코드에서는 굳이 제네릭을 사용하지 않아도 됩니다. 딱히 형변환을 해주는 것이 없으니까요. 하지만 단순히 형변환을 하지 않더라도, 코드의 재사용성이나 가독성, 컴파일할 때의 이점이 많기 때문에 습관적으로 해줍니다.

     

     

    반응형

    댓글

Designed by Tistory.