2019-06-01 [java-study] 로또2단계 스터디
01 Jun 2019 | java TDD로또 2단계
기능 요구사항
- 2등을 위해 추가 번호를 하나 더 추첨한다.
- 당첨 통계에 2등도 추가해야 한다.
- 사용자가 수동으로 추첨 번호를 입력할 수 있도록 해야 한다.
구입금액을 입력해 주세요.
14000
수동으로 구매할 로또 수를 입력해 주세요.
3
수동으로 구매할 번호를 입력해 주세요.
8, 21, 23, 41, 42, 43
3, 5, 11, 16, 32, 38
7, 11, 16, 35, 36, 44
수동으로 3장, 자동으로 11개를 구매했습니다.
[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
보너스 볼을 입력해 주세요.
7
당첨 통계
---------
3개 일치 (5000원)- 1개
4개 일치 (50000원)- 0개
5개 일치 (1500000원)- 0개
5개 일치, 보너스 볼 일치(30000000원) - 0개
6개 일치 (2000000000원)- 0개
총 수익률은 35.7%입니다.
프로그래밍 요구사항
- 모든 기능을 TDD로 구현해 단위 테스트가 존재해야 한다. 단, UI(System.out, System.in) 로직은 제외
- 예외 처리를 통해 에러가 발생하지 않도록 한다.
- 규칙 3: 모든 원시값과 문자열을 포장한다.
- 규칙 5: 줄여쓰지 않는다(축약 금지).
- 규칙 8: 일급 콜렉션을 쓴다.
힌트
-
규칙 3: 모든 원시값과 문자열을 포장한다.
- 로또 숫자 하나는 int 타입이다. 이 숫자 하나를 추상화한 LottoNo 객체를 추가해 구현한다.
-
규칙 8: 일급 콜렉션을 쓴다.
- 사용자가 구매한 로또 한장을 Lotto 객체, 당첨 번호에 해당하는 로또를 WinningLotto 객체로 추상화한다.
-
하드 코딩을 하지 않기 위해 상수 값을 사용하면 많은 상수 값이 발생한다. 자바의 enum을 활용해 상수 값을 제거한다. 즉, enum을 활용해 일치하는 수를 로또 등수로 변경해 본다.
public enum Rank { FIRST(6, 2000000000), SECOND(5, 30000000), THIRD(5, 1500000), FOURTH(4, 50000), FIFTH(3, 5000), MISS(0, 0); private int countOfMatch; private int winningMoney; private Rank(int countOfMatch, int winningMoney) { this.countOfMatch = countOfMatch; this.winningMoney = winningMoney; } public int getCountOfMatch() { return countOfMatch; } public int getWinningMoney() { return winningMoney; } public static Rank valueOf(int countOfMatch, boolean matchBonus) { // TODO 일치하는 수를 로또 등수로 변경한다. enum 값 목록은 "Rank[] ranks = values();"와 같이 가져올 수 있다. return null; } }
할일
-
test코드를 먼저짠다
=> test코드를 먼저짜는 이유 https://www.youtube.com/watch?v=cVxqrGHxutU&t=2111s
-
enum 공부하고 적용하자
-
로또 숫자 하나는 int 타입이다. 이 숫자 하나를 추상화한 LottoNo 객체를 추가해 구현한다.
=> 숫자 범위 밖 에러 발생
공부한 내용
- Enum
http://woowabros.github.io/tools/2017/07/10/java-enum-uses.html참고
-
comparable 과 comparator 차이
-
comparable : 객체 간의 일반적인 정렬이 필요할 때, Comparable 인터페이스를 확장해서 정렬의 기준을 정의
int compareTo(T o)
-
comparator : 객체 간의 특정한 정렬이 필요할 때, Comparator 인터페이스를 확장해서 특정 기준을 정의
int compare(T o1, T o2)
-
리뷰 받은 내용
-
Set 과 List 의 차이
- 가장 큰 차이는 set은 중복된 수를 허용하지 않는다는 점
-
한줄이더라도 괄호를 붙여주자!
-
생성자에서 일을 많이함
-
상속 사용
public class Lottos extends ArrayList<Lotto> { public LottoResults match(Lotto winningLotto) { LottoResults lottoResults = new LottoResults(); this.stream() .map(lotto -> new LottoResult(lotto.getCorrectCount(winningLotto.getNumbers()))) .forEach(lottoResults::add); return lottoResults; } }
후기
로또를 구현하면서 최대한 객체가 무슨일을 하는지 이해하려고 노력했다. test를 먼저 작성하려다보니 어려워 객체를 먼저 그림을 그려보고 무슨일을 하는지 정의해보았다. 마침 구현해보고 수업시간에 디자인패턴에 대해 언급을 해주었다. 자세히 배우지는 못하였지만 디자인 패턴에 대하여 호기심이 생겼다. 처음 부터 디자인 패턴을 알고 접근 하였으면 좀 더 체계적으로 구현을 할 수 있었을 거라 생각했다.
무엇보다 학교과제 프로젝트가 복합적으로 겹쳐서 힘들었고 집중하지 못한 점이 아쉽다.
소스 코드
https://github.com/jbj616/spring-study-lotto/tree/step2/src/main/java
Comments