2019-04-29 [java-study] 로또1단계 스터디
29 Apr 2019 | java TDD로또 구현
요구사항
- 로또 구입 금액을 입력하면 구입 금액에 해당하는 로또를 발급해야 한다.
- 로또 1장의 가격은 1000원이다.
구입금액을 입력해 주세요.
14000
14개를 구매했습니다.
[8, 21, 23, 41, 42, 43]
[3, 5, 11, 16, 32, 38]
[7, 11, 16, 35, 36, 44]
[1, 8, 11, 31, 41, 42]
[13, 14, 16, 38, 42, 45]
[7, 11, 30, 40, 42, 43]
[2, 13, 22, 32, 38, 45]
[23, 25, 33, 36, 39, 41]
[1, 3, 5, 14, 22, 45]
[5, 9, 38, 41, 43, 44]
[2, 8, 9, 18, 19, 21]
[13, 14, 18, 21, 23, 35]
[17, 21, 29, 37, 42, 45]
[3, 8, 27, 30, 35, 44]
지난 주 당첨 번호를 입력해 주세요.
1, 2, 3, 4, 5, 6
당첨 통계
---------
3개 일치 (5000원)- 1개
4개 일치 (50000원)- 0개
5개 일치 (1500000원)- 0개
6개 일치 (2000000000원)- 0개
총 수익률은 35.7%입니다.
프로그래밍 요구사항
- 모든 기능을 TDD로 구현해 단위 테스트가 존재해야 한다. 단, UI(System.out, System.in) 로직은 제외
힌트
- 모든 기능을 TDD로 구현해 단위 테스트가 존재해야 한다. 단, UI(System.out, System.in) 로직은 제외
- 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 구분한다.
- UI 로직을 InputView, ResultView와 같은 클래스를 추가해 분리한다.
- 로또 자동 생성은 Collections.shuffle() 메소드 활용한다.
- Collections.sort() 메소드를 활용해 정렬 가능하다.
- ArrayList의 contains() 메소드를 활용하면 어떤 값이 존재하는지 유무를 판단할 수 있다.
할일
- test+구현
- 구현
- Test 추가구현
- 구현 및 리팩토링
목표
- test코드를 작성하고 코드를 구현하자!
궁금증
- 첫번째 (1부터 45까지 리스트를 미리 받아놓고 메소드에서 셔플 및 sublist실행)
public List<String> buyLotto(int totalLottoPrice) {
List<String> numbersInRange = ListGenerator.getNumbersInRange(LOTTO_NUMBER_RANGE);
for (int i = 0; i < getLottoCount(totalLottoPrice); i++) {
lottos.add(new Lotto(getRandomNumbers(numbersInRange)));
}
return showLottoHistory();
}
private List<String> getRandomNumbers(List<String> numbersInRange) {
Collections.shuffle(numbersInRange);
return numbersInRange.subList(0, LOTTO_NUMBER_COUNT);
}
출력
[26, 43, 13, 12, 18, 42]
[26, 43, 13, 12, 18, 42]
- 두번째 (1부터 45까지 리스트를 받아 셔플및 subList실행)
public List<String> buyLotto(int totalLottoPrice){
for (int i=0; i<getLottoCount(totalLottoPrice); i++){
lottos.add(new Lotto(getRandomNumbers(LOTTO_NUMBER_RANGE)));
}
return showLottoHistory();
}
private List<String> getRandomNumbers(int range){
List<String> numbersInRange = ListGenerator.getNumbersInRange(range);
Collections.shuffle(numbersInRange);
return numbersInRange.subList(0,LOTTO_NUMBER_COUNT);
}
출력
[26, 43, 13, 15, 18, 42]
[11, 18, 19, 33, 28, 34]
=> 첫번째 두번째 왜 결과가 다른지 궁금합니다.
- 업데이트 예정
힘든점
nextInt()
실행후nextLine()
메소드 실행시 그냥 넘어가 버림.
nextInt() 메소드 다음에 nextLine() 메소드를 실행하려고 할때 nextLine()메소드가 그냥 넘어가버리는 오류가 생겨난다. 이 이유는 nextInt()메소드를 실행 할 때 20을 콘솔에 입력하고 엔터를 누를때 20을 리턴시켰지만 Enter값은 그대로 남아있다. nextLine() 메소드는 Enter값을 기준으로 메소드를 종료시키기 때문에 nextLine()메소드가 실행될 때 남아있는 Enter값을 그대로 읽어 바로 종료된 것이다. 그래서 첫번째 문자열입력: 이 넘어가고 두번째 정수입력: 이 출력된 것이다.
=> 해결법 : nextInt() 사용 x, nextInt()와 nextLine()사이에 nextLine()한번더 사용
- 저번엔 문제에서 test코드가 미리 주어져서 원할하게 코드를 작성하였는데 이번엔 test-> 구현 방식을 지키려니 어려웠음.
- 처음 구상했던 로직으로 완성됬더라면 test를 변경할 일이없었겠지만 코드 구현하고 보니 도 좋은 아이디어가 생겨 test를 변경한 적이 많았음.
- 로또 번호를 Integer, String 중 무엇으로 구현할지 고민하였음. String이 메소드를 1개 덜 써서 사용함.
- 로또 번호로 연산할 일이 없기 때문에 문자열로 하기로 결정
Comments