기능 요구사항
- 현재 로또 생성기는 자동 생성 기능만 제공한다. 사용자가 수동으로 추첨 번호를 입력할 수 있도록 해야 한다.
- 입력한 금액, 자동 생성 숫자, 수동 생성 번호를 입력하도록 해야 한다.
구입금액을 입력해 주세요.
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개
총 수익률은 0.35입니다.(기준이 1이기 때문에 결과적으로 손해라는 의미임)
프로그래밍 요구사항
- 규칙 3: 모든 원시값과 문자열을 포장한다.
- 규칙 5: 줄여쓰지 않는다(축약 금지).
- 예외 처리를 통해 에러가 발생하지 않도록 한다.
- 모든 기능을 TDD로 구현해 단위 테스트가 존재해야 한다. 단, UI(System.out, System.in) 로직은 제외
- java enum을 적용해 프로그래밍을 구현한다.
- 규칙 8: 일급 콜렉션을 쓴다.
- indent(인덴트, 들여쓰기) depth를 2를 넘지 않도록 구현한다. 1까지만 허용한다.
- 함수(또는 메소드)의 길이가 15라인을 넘어가지 않도록 구현한다.
- 자바 코드 컨벤션을 지키면서 프로그래밍한다.
- else 예약어를 쓰지 않는다.
힌트
- 규칙 3: 모든 원시값과 문자열을 포장한다.
- 로또 숫자 하나는 int 타입이다. 이 숫자 하나를 추상화한 LottoNo 객체를 추가해 구현한다.
- 예외 처리를 통해 에러가 발생하지 않도록 한다.
- 사용자가 잘못된 값을 입력했을 때 java exception으로 에러 처리를 한다.
- java8에 추가된 Optional을 적용해 NullPointerException이 발생하지 않도록 한다.
기능 목록 및 commit 로그 요구사항
- 기능을 구현하기 전에 README.md 파일에 구현할 기능 목록을 정리해 추가한다.
- git의 commit 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위로 추가한다.
추가된 기능
2. 수동으로 구매할 로또 수 입력 받기
- "수동으로 구매할 로또 수를 입력해 주세요" 메세지 출력
- 사용자로부터 로또 수를 입력받는다.
3. 수동으로 구매할 번호를 입력 받기
- "수동으로 구매할 번호를 입력해 주세요." 메세지 출력
- 6개의 로또 번호를 로또 수 만큼 입력 받는다.
- ", " 구분자로 나눴을 때 하나의 로또 당 6개의 수가 들어왔는지 검증
4. 안내 메세지 출력.
- "수동으로 x장, 자동으로 x개를 구매했습니다." 메세지 출력
- 수동으로 구매한 로또 번호 출력
이번 step4 프로젝트의 관건은 수동으로 번호를 지정한 로또와, 자동으로 발행한 로또를 합치는 것이 관건이었다.
LottoTicket 이라는 빈 리스트를 만들고,
수동으로 로또 번호를 받을때는 addLotto 메서드를 이용하여 수동 로또 리스트를 추가하였고
자동 로또 번호를 받을때는 addBundle 메서드를 이용하여 자동 로또 리스트를 추가하였다.
LottoTicket lottoTicket = new LottoTicket();
for (int i = 0; i < manualLotto.getNumOfManualPurchaseLotto(); i++) {
LottoNumbers manualLottoNumber = new LottoNumbers(inputView.requestManualLottoNumber());
lottoTicket.addLotto(manualLottoNumber.getList());
}
lottoTicket.addBundle(customer.buyLotto(lottoInfo.getCount()-manualLotto.getNumOfManualPurchaseLotto()));
로또 티켓에 들어있는 번들을 꺼낼때 NPE를 방지하기 위해 getBundle 메서드에는 Optional.ofNullable 를 사용하였따.
public Optional<List<List<Integer>>> getBundle() {
return Optional.ofNullable(this.bundle);
}
이렇게 사용하여 null이라는 값이 들어와도 NPE 에러가 발생하지 않는다고 한다.
return으로 optional 타입을 받으면 get이라는 메서드를 이용하여 optional 타입 안에 있는 값을 꺼낼 수 있다.
resultView.printIssuedLottoList(lottoTicket.getBundle().get());
'강의 > TDD, Clean Code with Java 12기' 카테고리의 다른 글
람다 실습 1 - 익명 클래스를 람다로 전환 (0) | 2021.08.25 |
---|---|
람다 (0) | 2021.08.25 |
[로또] step4 - 로또(수동) - 29일차 (step3 피드백 및 피드백 반영) (0) | 2021.08.17 |
[로또] step3 - 로또(2등) - 27일차 (피드백 및 피드백 반영) (0) | 2021.08.15 |
[로또] step3 - 로또(2등) - 26일차 (0) | 2021.08.14 |