- 로또 요구사항을 파악한다.
- 요구사항에 대한 구현을 완료한 후 자신의 github 아이디에 해당하는 브랜치에 Pull Request(이하 PR)를 통해 코드 리뷰 요청을 한다.
- 코드 리뷰 피드백에 대한 개선 작업을 하고 다시 PUSH한다.
- 모든 피드백을 완료하면 다음 단계를 도전하고 앞의 과정을 반복한다.
-
사용자로부터 식을 입력받는다
-
콘솔에 결과를 출력한다
-
ExpressionParser
- 주어진 문자열을 공백 단위로 파싱한다
- 숫자와 사칙연산자 그리고 공백을 제외한 다른 글자가 존재하는 지 검증한다
- 숫자 - 사칙연산자 - 숫자의 패턴인 문자열인지 검증한다
-
변환기
- 문자열을 숫자로 변환한다
- 정수인 숫자 임을 검증한다
- 문자열을 숫자로 변환한다
-
계산기
- 나눗셈 결과는 정수로 떨어진다
- 덧셈을 수행한다
- 뺄셈을 수행한다
- 곱셈을 수행한다
- 입력값의 순서에 따라 결정된 순서로 사칙연산을 수행한다( 사칙연산 우선순위를 무시한다 )
Calculator 의 indent 를 줄이기 위해 객체 추가
-
표현식
- 연산을 위해선 "연산자" 그리고 "다음 수" 가 필요하다 -> 다음에 존재하는 "연산자" 가 존재하는지를 알려주면 된다
- 피연산자 개수 = 연산자 개수 + 1 이다
- 피연산자 추출 시 검증 : 피연산자 개수 = 연산자 개수 + 1
- 연산자 추출 시 검증 : 연산자 개수 = 피연산자 개수 - 1
-
ConsoleView
- 사용자로부터 입력을 받는다
- 결과만을 출력한다
- indent 의 depth 를 1단계로 줄일 것 (while + if -> 2단계)
- 메서드 크기가 최대 10라인을 넘지 않을 것
- else 사용하지 말 것
- 자주 발생하는 Exception 의 경우 별도의 Exception 메서드를 제공하고 있다.
- IllegalArgument
- IllegalState
- IO
- NPE
- 앞에서 사용했던 ParameterizedTest 와 ValueSource 사용 고려
- Collections.shuffle() 활용해 로또 자동 생성
- Collections.sort() 활용해 정렬
- ArrayList 의 contains() 사용해 값 존재 유무 확인
- 내가 기존에 작성했던 Winning 이 Rank 와 유사한 것 같다. 그런데 여기에 보너스 볼 포함하여 5개가 일치된 경우에 대한 당첨금에 대한 정보도 갖는다.
- 모든 기능은 TDD 로 구현해 단위 테스트가 존재해야 한다
- 핵심로직 코드와 UI 담당 로직 분리
- Java enum 을 적용해 프로그래밍을 구현한다
- 일급 컬렉션을 쓴다
- Indent 는 1까지만 허용한다
- 함수 길이가 15를 넘지 않도록 한다.
- else 예약어 사용하지 않기
- 이전까지의 로또 생성기와 달리 '수동으로 입력' 도 가능해 질 것
구입금액을 입력해 주세요.
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이기 때문에 결과적으로 손해라는 의미임)- 모든 원시값, 문자열 포장
- 줄여쓰지 않을 것
- 예외처리를 통해 에러가 발생하지 않을 것
- 예외 처리를 통해 에러가 발생하지 않도록 한다
- 잘못된 값 입력시 java exception 으로 에러 처리할 것
- java 8 에 추가된 Optional 을 적절하게 사용해 NPE 가 발생하지 않도록 할 것
-
Main
-
로또숫자(LottoNumber)
- 1 ~ 45 사이의 숫자임을 알고 있다
-
로또 머니
- 로또 하나의 값이 1000원임을 알고 있다
- 생성 가능한 로또의 개수를 알려준다
-
ValidationUtil
- 로또머니로 만들 수 있는 수동 로또 깨수인지 검증한다
-
로또 머신
초기 금액을 알고 있다.로또 하나의 값이 1000원임을 알고 있다- 수동 구매 개수를 알고 있다.
- 보관하는 로또에 대해 수동, 자동 여부를 구분할 필요는 없다.
- 돈을 받으면 자동으로 로또들을 생성하고 있는다.
- 수동 로또 개수를 입력 받으면
- -> 유효성을 검증한다 : 금액/1000 >= 수동 로또 개수
- -> 자동 로또 개수를 계산한다
- -> 자동 로또들을 생성한다
- 수동 로또 번호를 입력 받는다
- (LottoMachine 밖 ) 파싱 가능한 형태의 입력인지 검증
- 수동 로또 를 하나씩 추가 할 수 있다
- 로또를 생성 한다
- 로또 지갑에 추가한다
- 사용자 입력에 대한 예외를 처리한다
- 금액
- 수동 로또 개수
- 수동 로또 번호
- 당첨번호
- 당첨 넘버와 보너스 넘버를 받아, 매칭 개수별 로또 개수를 통계 정보를 알려줄 수 있다.
- 구입금액 대비 당첨금액을 통해 수익률을 알려준다
- 로또 개수를 알려준다
-
로또 생성기
- 로또는 1 ~ 45 사이의 숫자로 구성됨을 알고 있다
- 로또는 6개의 숫자로 구성됨을 알고 있다
- 1 ~ 45 의 숫자 6개로 로 이루어진 List 를 리턴한다
- 로또 하나를 자동 생성한다
- 개수가 주어지면 개수에 해당하는 개수만큼의 로또들을 자동 생성한다
- 수동 로또 번호들이 주어지면 로또를 생성한다
- 주어진 수동 로또 번호가 유효한 숫자인지 검증한다
-
로또
- 자신을 구성하는 숫자 6개를 알고 있다
- 로또는 6개의 중복되지 않는 로또넘버로 구성됨을 알고 있다
- 당첨 번호와 비교해 일치하는 숫자의 개수를 알려준다
- 보너스 넘버를 갖고 있는지 여부를 알려준다
- 중복되지 않은 6 개의 숫자로 이루어진다는 불변식을 지킨다
-
로또 지갑
- 생성된 로또 들에 대해 알고 있다.
- 지갑에 로또를 추가한다
- 원하는 시점에 지갑에 있는 로또들에 대한 총 당첨금액을 알려준다
- n 개 일치하는 로또의 개수를 알려준다
-
당첨금(Winning) -> 당첨과 관련된 정보들을 알고 있다
- 일치하는 숫자의 개수 별 당첨금을 알고 있다.
- 일치하는 숫자의 개수 별 당첨금을 알려준다
- 당첨금을 받을 수 있는 최소 일치 개수를 알려준다
- 당첨번호와 5개 일치하는(matchCount 가 5개 라는) 것 외에, 보너스 볼을 갖고 있는 경우 (2등 당첨자)의 당첨금액을 알려준다
-
문자열 파서
- 문자열을 ', ' 단위로 파싱하여 문자열 리스트로 리턴한다
-
ConsoleView
- 문자열 출력
- 입력을 받아 리턴
- 입력을 받아야 하는 경우, 입력을 요 구하는 출력문은 동일한 메서드에서 실행하도록 하자(클라이언트가 public 메서드를 호출하는 순서를 우리가 보장할 수 없으니)