Skip to content

Commit

Permalink
[디디] 로또 수동 입력 (#168)
Browse files Browse the repository at this point in the history
* feat: 로또 수동

수동 로또 생성 기능 구현완료

* refactor : LottoCount 의존성 약화(Money 제거)

* refactor : 오탈자 수정

* refactor : LottoFactoryTest 리팩터링

* refactor : 피드백 반영

컨벤션에 맞게 띄어쓰기, 중괄호 수정
메서드, 변수명 명확하게 수정
LottoFactory 내의 메소드 makeManualLottos 추출, addAutoLotto 추출

* refactor : 피드백 반영

컨벤션에 맞게 띄어쓰기, 중괄호 수정
메서드, 변수명 명확하게 수정
LottoFactory 내의 메소드 makeManualLottos 추출, addAutoLotto 추출

* refactor : 2/29 피드백 반영

input parameter 명 ManualLotto로 수정

* refactor : 3/1 피드백 반영

Rank 의 isBonus메서드 리턴 방식 수정
  • Loading branch information
fucct authored Mar 4, 2020
1 parent 01f8895 commit 498371a
Show file tree
Hide file tree
Showing 18 changed files with 286 additions and 86 deletions.
39 changes: 16 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,15 @@
## 로또 미션을 위한 저장소

---

## 게임 순서

- 구입 금액을 입력 받는다.

- 1000단위가 아닌 경우는 예외처리
- 문자열이 포함되는 경우 예외처리
- 공백 및 NULL 예외처리
- 1000원 ~ 100,000원까지만 가능
- 구입 금액 또한 클래스로 분리하고
- 기능은 생성자를 통한 검증
- 장수를 계산해서 보내는 부분도

- 금액 / 1000 의 갯수만큼 로또를 자동으로 생성 및 출력한다.

- Number : 각각의 수
- 1~45 사이의 값인지
- 문자열이 포함되는 경우 예외처리
Expand All @@ -27,7 +21,6 @@
- Lotto를 구매한 만큼 가지고 있는 Lottos 객체를 생성한다.
- 금액 / 1000 == Lottos.size()
- 이렇게 생성된 Lottos 를 출력한다.

- 당첨번호(보너스 번호 제외) 6자리를 `,` 를 기준으로 분리한다.
- 싱글톤 ?
- 당첨번호를 담당하는 WinningLotto 객체를 생성한다.
Expand All @@ -36,23 +29,18 @@
- 갯수 6개
- 번호의 범위
- 각각 다른 번호인지

- 보너스 볼 하나를 입력한다
- 보너스 볼 객체 Bonus
- Number 하나를 갖는 객체

- 당첨 통계를 출력한다
- LottoModel ← Lottos , Winning
- OutputView
- Enum 에서 맞힌 갯수, 금액, 몇장인지를 가지는 Enum에서 처리

- 참고
- 숫자를 생성할 때 그리고 보너스 넘버를 생성할 때 로직이 겹치니까 해결책으로
- Validator를 따로 둔다.
- Number를 상속받는다.

### 구현 순서

- 구입 금액 테스트
- [x] 1000단위가 아닌 경우는 예외처리
- [x] 문자열이 포함되는 경우 예외처리
Expand All @@ -62,48 +50,53 @@
- Utility 클래스 검증
- [x] 공백 제거
- [x] `,` Parsing 검증

- Number
- [x] 1~45 사이의 값인지
- [x] 문자열이 포함되는 경우 예외처리
- [x] 공백 및 NULL 예외처리
- Enum을 통해서 Number 기능을 같이 하는 방안 고려 (현재 static 부분)

- LottoFactory

- Lotto
- [x] `Lotto.size()` = 6
- [x] 중복된 수가 있으면 안된다.

- Lottos
- [x] Lotto를 구매한 만큼 가지고 있는 Lottos 객체를 생성한다
- [x] 금액 / 1000 == Lottos.size()

- WinningLotto
- [x] 보너스넘버와 WinningNumbers의 값이 겹치지 않아야 한다.
- [x] BonusNumber (상속 : Number)
- [x] WinningNumbers
- [x] 상속받고 있고 (Lotto) : 로직이 같고, 로또와 의미를 구분하기 위함

- [x] Result
- 인자 : WinningLotto, Lottos
- 기능
- [x] 맞힌 갯수별로 장수 + 수익금 계산
- [x] 수익률
- [x] OutputView 보내기

- 추가 요구사항(수동)
- [x] 수동으로 구매할 로또의 개수를 입력 받는다.
- [x] 개수라는 클래스를 두고
- [x] 음수 예외처리
- [x] 금액을 초과하는 경우
- [x] 문자열
- [x] Null & 공백
- [x] 금액이랑 비교
- [x] 수동으로 구매할 로또의 번호를 개수만큼 입력받는다.
- [x] 기존의 LottoFactory 를 재활용한다.
### 프로그래밍 요구사항

- indent(인덴트, 들여쓰기) depth를 2단계에서 1단계로 줄여라.
- depth의 경우 if문을 사용하는 경우 1단계의 depth가 증가한다. if문 안에 while문을 사용한다면 depth가 2단계가 된다.
- else를 사용하지 마라.
- 메소드의 크기가 최대 10라인을 넘지 않도록 구현한다.
- method가 한 가지 일만 하도록 최대한 작게 만들어라.
- **배열 대신 ArrayList를 사용한다.**
- enum을 적용해 프로그래밍을 구현한다.

- 예외가 발생하는 부분에 대해 자바 Exception을 적용해 예외처리한다.
- 사용자가 입력한 값에 대한 예외 처리를 철저히 한다.
### 힌트

- 로또 자동 생성은 Collections.shuffle() 메소드 활용한다.
- Collections.sort() 메소드를 활용해 정렬 가능하다.
- ArrayList의 contains() 메소드를 활용하면 어떤 값이 존재하는지 유무를 판단할 수 있다.
- ArrayList의 contains() 메소드를 활용하면 어떤 값이 존재하는지 유무를 판단할 수 있다.
## 추가 요구 사항
- 현재 로또 생성기는 자동 생성 기능만 제공한다. 사용자가 수동으로 추첨 번호를 입력할 수 있도록 해야 한다.
- 입력한 금액, 자동 생성 숫자, 수동 생성 번호를 입력하도록 해야 한다.
1 change: 1 addition & 0 deletions src/main/java/lotto/domain/Lotto.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.stream.Collectors;

import lotto.exception.InvalidLottoException;

Expand Down
37 changes: 37 additions & 0 deletions src/main/java/lotto/domain/LottoCount.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package lotto.domain;

import lotto.exception.ExceedMoneyException;
import lotto.util.StringUtil;

public class LottoCount {
private final int manualLotto;
private final int autoLotto;

public LottoCount(String manualLotto, int totalLotto) {
validate(manualLotto);
validateMoney(manualLotto, totalLotto);
this.manualLotto = Integer.parseInt(manualLotto);
this.autoLotto = totalLotto - this.manualLotto;
}

private void validate(String ManualLotto) {
StringUtil.checkNull(ManualLotto);
StringUtil.checkBlank(ManualLotto);
StringUtil.checkNumberFormat(ManualLotto);
StringUtil.checkRange(ManualLotto);
}

private void validateMoney(String input, int totalLotto) {
if (totalLotto < Integer.parseInt(input)) {
throw new ExceedMoneyException(totalLotto + "장 이하만 구매가 가능합니다.");
}
}

public int getManualLottoCount() {
return manualLotto;
}

public int getAutoLottoCount() {
return autoLotto;
}
}
31 changes: 26 additions & 5 deletions src/main/java/lotto/domain/LottoFactory.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package lotto.domain;

import java.util.*;
import lotto.util.StringUtil;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

import lotto.util.StringUtil;

import static lotto.domain.Number.MAX_LOTTO_NUMBER;
import static lotto.domain.Number.MIN_LOTTO_NUMBER;

Expand Down Expand Up @@ -65,9 +68,27 @@ public static Lotto create(String winningNumbers) {
*/
public static Lottos create(int count) {
List<Lotto> lottos = new ArrayList<>();
for (int i = 0; i < count; i++) {
addAutoLottos(count, lottos);
return new Lottos(lottos);
}

public static Lottos create(List<String> manualLottoNumbers, int autoCount) {
List<Lotto> lottos = addManualLottos(manualLottoNumbers);
addAutoLottos(autoCount, lottos);
return new Lottos(lottos);
}

private static void addAutoLottos(int autoCount, List<Lotto> lottos) {
for (int i = 0; i < autoCount; i++) {
lottos.add(create());
}
return new Lottos(lottos);
}

private static List<Lotto> addManualLottos(List<String> manualLottoNumbers) {
List<Lotto> lottos = new ArrayList<>();
for (String input : manualLottoNumbers) {
lottos.add(create(input));
}
return lottos;
}
}
27 changes: 4 additions & 23 deletions src/main/java/lotto/domain/Number.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import java.util.Objects;

import lotto.exception.InvalidNumberException;
import lotto.util.StringUtil;

import static javax.management.Query.value;

Expand All @@ -26,39 +27,19 @@ public Number(int number) {
}

public static void validate(String value) {
checkNull(value);
checkBlank(value);
checkNumberFormat(value);
StringUtil.checkNull(value);
StringUtil.checkBlank(value);
StringUtil.checkNumberFormat(value);
checkRange(value);
}

private static void checkNumberFormat(String value) {
try {
Integer.parseInt(value);
} catch (NumberFormatException e) {
throw new InvalidNumberException("문자는 사용이 불가능합니다.");
}
}

private static void checkRange(String value) {
int number = Integer.parseInt(value);
if (number > MAX_LOTTO_NUMBER || number < MIN_LOTTO_NUMBER) {
throw new InvalidNumberException("로또 번호는 1에서 45까지만 가능합니다");
}
}

private static void checkBlank(String value) {
if (value.trim().isEmpty()) {
throw new InvalidNumberException("공백은 사용이 불가능합니다.");
}
}

private static void checkNull(String value) {
if (Objects.isNull(value)) {
throw new InvalidNumberException("Null문자열은 사용이 불가능합니다.");
}
}

@Override
public String toString() {
return Integer.toString(number);
Expand Down
16 changes: 9 additions & 7 deletions src/main/java/lotto/domain/controller/LottoController.java
Original file line number Diff line number Diff line change
@@ -1,22 +1,24 @@
package lotto.domain.controller;

import lotto.domain.Lotto;
import lotto.domain.LottoFactory;
import lotto.domain.Lottos;
import lotto.domain.Number;
import lotto.domain.PurchaseMoney;
import lotto.domain.WinningLotto;
import lotto.domain.*;
import lotto.domain.model.LottoGame;
import lotto.domain.result.GameResult;
import lotto.view.InputView;
import lotto.view.OutputView;

import java.util.List;

public class LottoController {
public void run() {
PurchaseMoney money = new PurchaseMoney(InputView.getMoney());
Lottos lottos = LottoFactory.create(money.parseToPiece());
OutputView.printPieces(money.parseToPiece());
LottoCount count = new LottoCount(InputView.getManualLottoCount(), money.parseToPiece());
List<String> manual = InputView.getManualLottosNumber(count.getManualLottoCount());
Lottos lottos = LottoFactory.create(manual, count.getAutoLottoCount());

OutputView.printPieces(count.getManualLottoCount(), count.getAutoLottoCount());
OutputView.printLottos(lottos);

createResult(money, lottos, createWinningLotto());
}

Expand Down
13 changes: 13 additions & 0 deletions src/main/java/lotto/domain/result/Count.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package lotto.domain.result;

public class Count {
private int count = 0;

public void addCount() {
count++;
}

public int getCount() {
return count;
}
}
11 changes: 4 additions & 7 deletions src/main/java/lotto/domain/result/Rank.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ public enum Rank {
}

public static Rank getRank(int numberOfMatch, boolean isBonus) {
return Arrays.stream(values())
return Arrays.stream(values())
.filter(rank -> rank.matchingNumbers == numberOfMatch)
.filter(rank->rank.checkBonus(isBonus))
.filter(rank -> rank.checkBonus(isBonus))
.findFirst()
.orElse(DEFAULT);
}
Expand All @@ -47,10 +47,7 @@ public boolean checkBonus(boolean isBonus) {
return true;
}

public boolean isBonus(){
if(this==BONUS){
return true;
}
return false;
public boolean isBonus() {
return this == BONUS;
}
}
7 changes: 7 additions & 0 deletions src/main/java/lotto/exception/EmptyInputException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package lotto.exception;

public class EmptyInputException extends RuntimeException {
public EmptyInputException(String message) {
super(message);
}
}
7 changes: 7 additions & 0 deletions src/main/java/lotto/exception/ExceedMoneyException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package lotto.exception;

public class ExceedMoneyException extends RuntimeException {
public ExceedMoneyException(String message) {
super(message);
}
}
7 changes: 7 additions & 0 deletions src/main/java/lotto/exception/InvalidRangeException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package lotto.exception;

public class InvalidRangeException extends RuntimeException {
public InvalidRangeException(String message) {
super(message);
}
}
Loading

0 comments on commit 498371a

Please sign in to comment.