Skip to content

[행성 로또] 심호경 미션 제출합니다.#149

Open
simhokyung wants to merge 36 commits intowoowacourse-precourse:mainfrom
simhokyung:simhokyung
Open

[행성 로또] 심호경 미션 제출합니다.#149
simhokyung wants to merge 36 commits intowoowacourse-precourse:mainfrom
simhokyung:simhokyung

Conversation

@simhokyung
Copy link

💻 우테코 8기 최종 - 행성 로또

Console을 이용하여 우테코 로또 발매기인 행성 로또를 구현한다.
구입 금액에 맞춰 로또를 발행하고, 당첨 내역을 출력한다.


📥 입출력 명세

▫ 입력

  1. 로또 구입 금액을 입력 받는다.
  2. 당첨 번호를 입력 받는다. 번호는 쉼표(,)를 기준으로 구분한다.
  3. 보너스 번호를 입력 받는다.

▫ 출력

  1. 발행한 로또 수량 및 번호를 출력한다. 로또 번호는 오름차순으로 정렬하여 보여준다.
  2. 당첨 내역을 출력한다.
  3. 예외 상황 시 에러 문구를 출력해야 한다. 단, 에러 문구는 "[ERROR]"로 시작해야 한다.

▫ 실행 예시

구입금액을 입력해 주세요.
1000

2개를 구매했습니다.
[8, 11, 13, 21, 22]
[1, 3, 6, 14, 22]

당첨 번호를 입력해 주세요.
1, 2, 3, 4, 5

보너스 번호 번호를 입력해 주세요.
6

당첨 통계
---
5개 일치 (100,000,000원) - 0개
4개 일치, 보너스 번호 일치 (10,000,000원) - 0개
4개 일치 (1,500,000원) - 0개
3개 일치, 보너스 번호 일치 (500,000원) - 0개
2개 일치, 보너스 번호 일치 (5,000원) - 1개
0개 일치 (0원) - 1개

📄기능 구현 목록

1) 입력 흐름

  • InputView, OutputView 입출력 구성방식 확인 및 초기 패키지 구성
  • 구입금액 입력받은거 검증
  • 당첨번호 입력받은거 검증
  • 보너스 번호 입력받은거 검증

2) 주요 기능

  • Lotto 도메인 구현
  • Lottos 도메인 구현
  • LottoGenerator 구현
  • Rank(Enum) 구현
  • WinningNumbers 도메인 구현
  • 로또 생성 기능 구현
  • WinCountCalculator 구현(로또 당첨 횟수 계산)
  • 로또 당첨 내역 기능 구현

3) 예외 및 주의사항 체크

  • 로또 번호의 숫자 범위는 1~30까지이다.
  • 1개의 로또를 발행할 때 중복되지 않는 5개의 숫자를 뽑는다.
  • 로또 구입 금액을 입력하면 구입 금액에 해당하는 만큼 로또를 발행해야 한다.
  • 로또 1장의 가격은 500원이다.
  • 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.
  • 구입 금액은 500원 단위로 입력 받으며 500원으로 나누어 떨어지지 않는 경우 예외 처리한다.
  • 로또 번호는 오름차순으로 정렬하여 보여준다.
  • 에러 문구는 "[ERROR]"로 시작해야 한다.
  • 입력/출력 역할은 제공된 InputView, OutputView에서 수행하며 기존 메서드를 수정, 삭제할 수 없다.
  • OutputView에 있는 printErrorMessage 사용하기

4) 도전 목표

  • 기본 요구 사항을 모두 충족한 후, 아래 중 하나를 선택하여 도전하세요. 단, 도전 과제 수행 여부와 관계없이 기본 기능은 반드시 작동해야 합니다.
  • 도전 방향:
    • 리팩터링: 작동은 그대로 유지하면서 코드 품질을 높이는 방향을 목표로 한다.
  • 상세 구현 목표:
    • 매직 넘버를 사용하지 않는다.
    • 도메인에서 활용할 수 있는 기능이 있으면 최대한 활용한다.
    • private, static 의미에 맞게 사용하기
    • 이중 검증(validate) 구현
    • 모든 코드 정렬
    • 상세 과정은 커밋 메시지를 확인하세요.

5) 프로그래밍 요구사항 체크

  • 프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 이름을 수정하거나 이동하지 않는다.
  • 자바 코드 컨벤션을 지키면서 프로그래밍한다.
  • 기본으로 제공되는 테스트가 통과해야 한다.

6) 테스트 기능 목록 체크

  • 기능테스트: 전체 기능 구현: ("1000", "1,2,3,4,5", "6") 입력 시 실행예시에 맞게 출력
  • 예외테스트: 구입금액("500j") 입력 시 에러발생
  • 에러 테스트: 로또 번호의 개수가 5개가 넘어가면 예외가 발생
  • 에러 테스트: 로또 번호에 중복된 숫자가 있으면 예외가 발생
  • Rank 기능 테스트
  • WinningNumbers 기능 테스트

- 로또 당첨 내역 기능 구현
- 0개가 일치하는 경우를 빠뜨려서 수정함.
- 1000단위로 검증하던거 500단위로 수정
- validateNull(numbers);
- validateSize(numbers);
- validateRange(numbers);
- validateDuplicate(numbers);
- LOTTO_SIZE 도입
- MIN_NUMBER 도입
- MAX_NUMBER 도입
- 상수 도입으로 인한 매직넘버 제거
- 도메인 안에서 추가검증 구현
- 보너스 번호와 당첨 버호 중복 금지 검증 추가
- matchCount,IsBonus,prize 필드에 private 추가하여 보안 강화
- 안쓰는 메서드 제거
- WinCountCalculator의 기능을 간소화하고자 WinningNumbers 도메인에 countMatches, isBounusMatched 메서드 추가
- private 생성자를 도입하여 객체 생성 금지시킴
- 로또 당첨을 집계하는 순수한 함수이므로, 클래스의 인스턴스 상태에 의존하지 않기 때문에 static으로 선언하여 코드의 간결성과 효율성을 높임
- WinningNumbers에 추가된 countMatches 기능과 isBonusMatched 기능을 사용하여 메서드 변경
- WinCountCalculator -> ResultCalculator로 이름 변경
- WinningDetailsCalculator -> CountByRank로 이름 수정
- OutputView에 있는 printErrorMessage를 이용하기 위해 validator에서 [ERROR] 메시지 제거
-주제에 맞게 LottoController로 이름 변경
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

Comments