Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[로또] 곽상진 미션 제출합니다. #101

Open
wants to merge 59 commits into
base: main
Choose a base branch
from

Conversation

DDangDin
Copy link

@DDangDin DDangDin commented Nov 4, 2024

우테코 프리코스 3주차 - 로또

간단한 로또 발매기를 구현


⚙️ 기능 목록 정리

  • 입출력 기능
    • 입력
      • 로또 구입 금액을 1,000원 단위로 입력받는다
      • 당첨 번호를 입력 받는다. 번호는 쉼표(,)를 기준으로 구분한다.
      • 보너스 번호를 입력 받는다.
    • 입력 예외 처리
      • 구입 금액이 1,000원으로 나누어 떨어지지 않는 경우
      • 구입 금액이 1,000원 보다 적은 금액일 경우
      • 당첨 번호가 쉼표로 구분되어 있지 않은 경우
      • 당첨 번호가 중복되는 경우
      • 보너스 번호가 당첨 번호와 중복되는 경우
    • 입력 공통 예외 처리
      • 숫자가 아닐 경우
      • 공백일 경우
    • 출력
      • 발행한 로또 수량 및 번호를 출력한다. 로또 번호는 오름차순으로 정렬하여 보여준다.
      • 당첨 내역을 출력한다.
      • 예외 상황 시 에러 문구를 출력해야 한다. 단, 에러 문구는 "[ERROR]"로 시작해야 한다.
      • 수익률을 출력하고 로또 게임을 종료한다. 수익률은 소수점 둘째 자리에서 반올림한다. (ex. 100.0%, 51.5%, 1,000,000.0%)

  • 로또

    • 로또 번호의 숫자 범위는 1~45까지이다.
    • 1개의 로또를 발행할 때 중복되지 않는 6개의 숫자를 뽑는다.
    • 당첨 번호 추첨 시 중복되지 않는 숫자 6개와 보너스 번호 1개를 뽑는다.
    • 당첨은 1등부터 5등까지 있다.
    • 당첨 기준과 금액
      • 1등: 6개 번호 일치 / 2,000,000,000원
      • 2등: 5개 번호 + 보너스 번호 일치 / 30,000,000원
      • 3등: 5개 번호 일치 / 1,500,000원
      • 4등: 4개 번호 일치 / 50,000원
      • 5등: 3개 번호 일치 / 5,000원
    • 로또 구입 금액을 입력하면 구입 금액에 해당하는 만큼 로또를 발행해야 한다.
    • 로또 1장의 가격은 1,000원이다.
    • 사용자가 구매한 로또 번호와 당첨 번호(, 보너스 번호)를 비교한다.
    • 당첨 내역을 출력할 때 금액을 천 단위 당 쉼표로 구분한다.
    • 입력 부분에서 예외가 발생해도 예외 출력 후 계속해서 입력을 받는다.
  • 로또 예외 처리

    • 로또 번호는 최대 번호인 45를 초과하면 예외가 발생한다.
    • 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.
      • Exception이 아닌 IllegalArgumentException, IllegalStateException 등과 같은 명확한 유형을 처리한다.

- 구입 금액을 입력할 때 출력되는 텍스트는 LottoOutputText에서 통합적으로 관리
- 예외 메시지는 ErrorMessage에서 통합 관리
- 로또 발매기(LottoMachine)에서 1개의 로또를 생성하는 기능 추가
- 가격에 따른 로또 개수 계산 기능 추가
- 로또 구입 금액 만큼 로또를 발행
- LottoGenerator 라는 이름이 더 적합하다고 생각해서 클래스명 수정
- 발행한 로또 수량을 출력 텍스트와 함께 출력
- Lotto 클래스에서 정렬된 숫자를 반환하는 메서드 추가
- 로또 숫자 발행 시작 범위 0으로 잘못 명시 되어 있어서 1로 수정
- 당첨 번호, 보너스 번호를 입력만 받아 놓은 상태
- 입력 예외 처리와 입력 공통 예외 처리를 분리
- 입력 예외 처리에 몇 가지 항목 추가
- 당첨 내역과 수익률 기능을 분리하여 작성
- 당첨 번호 정수형으로 매핑
- 보너스 번호 입력 텍스트 추가
- 로또 리스트 -> 숫자 리스트로 매핑해주는 메서드 추가
- LottoResult에서 당첨 번호, 보너스 번호를 통해 당첨 카운트 출력
- 오름차순 정렬 테스트 추가
- LottoCounter를 통해 로또 번호를 당첨 번호와 보너스 번호와 비교
- Lotto 클래스에 numbers 반환하는 메서드 추가
- LottoCounter는 유틸리티 클래스로서 생성자 파라미터 제거
- Lotto 클래스에서 불필요한 확장함수 제거
- LottoCounter -> LottoMatcher 클래스 명 수정
- LottoMatcher의 countWithBonusNumber -> hasBonusNumber 메서드 명 수정
- hasBonusNumber 로직 수정
- 클래스 명 수정에 따른 테스트 코드 수정
- LottoNumberMatcher 메서드 명 수정
- LottoRank 를 통해 순위 지정
- LottoResult 에서 당첨 통계 계산
(현재는 로또 순위 매기는 기능만 존재)
- LottoResult 에서 수익률 계산하는 기능 추가
- 당첨 통계 내역을 가지고 있는 데이터 클래스 LottoResultDetail 추가
- 수익률 소수점 둘째 자리에서 반올림
- 수익률 Double 로 수정
- LottoResultDetail에 소수점 둘째자리에서 반올림한 수익률 프로퍼티 추가
(Application 에서 임시 출력 코드 추가)
- getLottoLank 메서드 추가
- 보너스 번호가 포함되어 있을 때 확실하게 처리하도록 수정
- LottoResult 수정에 따른 테스트 코드 수정
- 수익률 수식 아주 약간 변경
- 반올림 하는 확장함수 추가
- 당첨 내역을 출력하는 기능 추가
- 수익률을 출력하는 기능 추가
- 당첨 내역 출력 시 금액을 천단위 쉼표로 구분하는 확장함수 추가
- LottoRank를 출력용 문자열로 바꿔주는 함수 추가
- 유효성 검사를 위해서 로또 최소, 최대 번호 상수 값을 전역적으로 관리
- 중복되는 숫자가 없는지 검사
- 로또 최대 번호인 45를 초과하는 번호가 없는지 검사
- 로또 예외 처리 영역 생성
- 로또 예외 처리 추가
- 완료된 예외 처리 진행상황 업데이트
- MVC 패턴에 맞춰 리팩토링
- View 계층이 Model 계층을 의존하지 않게 수정
- 최대한 Controller 계층이 View, Model 계층의 다리 역할을 하게끔 수정
- 역할 별로 Validator를 생성
- 새로 생성한 Validator 적용
- 그 외 자잘한 수정
- 테스트 코드 파일 명 수정
- LottoOutputText 패키지 위치 수정
- 유효성 검사 수정
- 무한 루프 수정
- 무한 루프 수정
- LottoOutputView NewLine 메서드 추가
- 출력 텍스트 일부 수정
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant