Skip to content

ynoolee/java-lotto

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

34 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

로또

진행 방법

  • 로또 요구사항을 파악한다.
  • 요구사항에 대한 구현을 완료한 후 자신의 github 아이디에 해당하는 브랜치에 Pull Request(이하 PR)를 통해 코드 리뷰 요청을 한다.
  • 코드 리뷰 피드백에 대한 개선 작업을 하고 다시 PUSH한다.
  • 모든 피드백을 완료하면 다음 단계를 도전하고 앞의 과정을 반복한다.

온라인 코드 리뷰 과정

1단계 - 문자열 계산기 요구사항

  • 사용자로부터 식을 입력받는다

  • 콘솔에 결과를 출력한다

  • ExpressionParser

    • 주어진 문자열을 공백 단위로 파싱한다
    • 숫자와 사칙연산자 그리고 공백을 제외한 다른 글자가 존재하는 지 검증한다
    • 숫자 - 사칙연산자 - 숫자의 패턴인 문자열인지 검증한다
  • 변환기

    • 문자열을 숫자로 변환한다
      • 정수인 숫자 임을 검증한다
  • 계산기

    • 나눗셈 결과는 정수로 떨어진다
    • 덧셈을 수행한다
    • 뺄셈을 수행한다
    • 곱셈을 수행한다
    • 입력값의 순서에 따라 결정된 순서로 사칙연산을 수행한다( 사칙연산 우선순위를 무시한다 )

Calculator 의 indent 를 줄이기 위해 객체 추가

  • 표현식

    • 연산을 위해선 "연산자" 그리고 "다음 수" 가 필요하다 -> 다음에 존재하는 "연산자" 가 존재하는지를 알려주면 된다
    • 피연산자 개수 = 연산자 개수 + 1 이다
      • 피연산자 추출 시 검증 : 피연산자 개수 = 연산자 개수 + 1
      • 연산자 추출 시 검증 : 연산자 개수 = 피연산자 개수 - 1
  • ConsoleView

    • 사용자로부터 입력을 받는다
    • 결과만을 출력한다

프로그래밍 요구사항

  • indent 의 depth 를 1단계로 줄일 것 (while + if -> 2단계)
  • 메서드 크기가 최대 10라인을 넘지 않을 것
  • else 사용하지 말 것

AssertJ 힌트

  • 자주 발생하는 Exception 의 경우 별도의 Exception 메서드를 제공하고 있다.
    • IllegalArgument
    • IllegalState
    • IO
    • NPE
  • 앞에서 사용했던 ParameterizedTest 와 ValueSource 사용 고려

2단계 : 로또(자동) + 🚀 3단계 - 로또(2등)

힌트

  • Collections.shuffle() 활용해 로또 자동 생성
  • Collections.sort() 활용해 정렬
  • ArrayList 의 contains() 사용해 값 존재 유무 확인
  • 내가 기존에 작성했던 Winning 이 Rank 와 유사한 것 같다. 그런데 여기에 보너스 볼 포함하여 5개가 일치된 경우에 대한 당첨금에 대한 정보도 갖는다.

프로그래밍 요구사항

  • 모든 기능은 TDD 로 구현해 단위 테스트가 존재해야 한다
    • 핵심로직 코드와 UI 담당 로직 분리
  • Java enum 을 적용해 프로그래밍을 구현한다
  • 일급 컬렉션을 쓴다
  • Indent 는 1까지만 허용한다
  • 함수 길이가 15를 넘지 않도록 한다.
  • else 예약어 사용하지 않기

4 단계

요구사항

  • 이전까지의 로또 생성기와 달리 '수동으로 입력' 도 가능해 질 것
구입금액을 입력해 주세요.
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이기 때문에 결과적으로 손해라는 의미임)

4단계에서 추가된 규칙

  • 모든 원시값, 문자열 포장
  • 줄여쓰지 않을 것
  • 예외처리를 통해 에러가 발생하지 않을 것

힌트

  • 예외 처리를 통해 에러가 발생하지 않도록 한다
    • 잘못된 값 입력시 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 메서드를 호출하는 순서를 우리가 보장할 수 없으니)

About

로또 게임 구현을 관리하는 저장소

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Java 100.0%