Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
6b373c8
[refactor] LottoNumberCache를 제거하고 LottoNumber에 정적 팩토리 메소드를 추가
GunBros Dec 13, 2025
e97eb4f
[feat] 수동 로또 수 입력 UI 추가
GunBros Dec 15, 2025
776b1b6
[feat] LottoCount 클래스 구현
GunBros Dec 15, 2025
db48a73
[refactor] LottoCount 리팩토링
GunBros Dec 15, 2025
956c6ed
[feat] 구매 가격을 통한 LottoCount 생성자 추가
GunBros Dec 15, 2025
46c7cc1
[feat] LottoCount 대소 비교 함수 구현
GunBros Dec 15, 2025
86081b3
[feat] 수동숫자 입력 UI 구현
GunBros Dec 18, 2025
e7ce95e
[feat] LottoCount 증가 구현
GunBros Dec 18, 2025
6e8b44c
[feat] 수동 로또 번호 입력 처리
GunBros Dec 18, 2025
4b2bb27
[chore] 불필요한 print 제거
GunBros Dec 18, 2025
40727e7
[feat] 로또 개수의 차이를 구하는 메소드
GunBros Dec 18, 2025
81f5688
[feat] 카운트가 같은지 체크하는 메소드
GunBros Dec 18, 2025
9c64390
[refactor] price 대신 LottoCount를 사용하도록 수정
GunBros Dec 18, 2025
7476206
[feat] LottoCount toString 추가
GunBros Dec 18, 2025
c0d561a
[feat] toCountString을 사용하도록 수정
GunBros Dec 18, 2025
32f9ffe
[feat] 로또 테스트 수정
GunBros Dec 18, 2025
9efa8c3
[feat] 수동 로또 추가
GunBros Dec 18, 2025
2a09ff9
[feat] 수동 로또 로직 추가
GunBros Dec 18, 2025
4b0c25f
[docs] 수동 로또 문서 추가
GunBros Dec 18, 2025
2057c2a
[refactor] LottoGenerator 인터페이스 추가
GunBros Dec 21, 2025
b19f25e
[refactor] Lotto에서 count 필드 제거
GunBros Dec 21, 2025
c71a1c3
[refactor] LottoCount 관리하는 Controller 분리
GunBros Dec 21, 2025
36a9637
[refactor] 수동과 자동 분리
GunBros Dec 21, 2025
27b45bb
[refactor] 로또 생성자 추가
GunBros Dec 21, 2025
583bc6b
[refactor] 로또 개수 UI 수정
GunBros Dec 21, 2025
4f35f19
[refactor] 로또 앱 수정
GunBros Dec 21, 2025
39131b1
[style] 코드 포매팅
GunBros Dec 21, 2025
9a168a4
[refactor] 불필요한 코드 삭제
GunBros Dec 21, 2025
168d93c
[feat] 로또 개수 예외 처리 추가
GunBros Dec 21, 2025
748557d
[chore] 에러 메시지 수정
GunBros Dec 21, 2025
afdc5c2
[feat] 에러 메시지 출력 UI 구현
GunBros Dec 21, 2025
c0aab8d
[feat] 에러 처리 추가
GunBros Dec 21, 2025
5cb08fb
[refactor] LottCountController 제거
GunBros Dec 22, 2025
2ab95e2
[refactor] View에서 입력받은 결과를 리턴하도록 수정
GunBros Dec 22, 2025
e8a9c67
[refactor] 가격에서 로또 개수 차이를 구하는 함수 구현
GunBros Dec 22, 2025
640e1ca
[refactor] LottoPrice에서 예외 처리
GunBros Dec 22, 2025
bd424a4
[refactor] 컴포지트 패턴을 활용한 제너레이터 생성
GunBros Dec 22, 2025
f4aeb2d
[refactor] 테스트 수정
GunBros Dec 22, 2025
5cb65ea
[refactor] Application 수정
GunBros Dec 22, 2025
fb5fc18
[style] 코드 포매팅
GunBros Dec 22, 2025
bab2015
[refactor] AutoLottoMachine으로 리팩토링
GunBros Dec 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,19 @@
- 3, 4, 5, 6개의 당첨에 따른 가격을 알 수 있다.
- 3, 4, 5, 6개의 당첨 횟수를 알 수 있다.
- 당첨 수익률을 알 수 있다.


# 로또 수동
- 사용자의 입력에 문제가 있으면 에러처리를 하도록 한다.
- 숫자가 아닌 경우
- 숫자가 6개를 넘는 경우
- 1 ~ 45번이 아닌 경우
-
- 수동으로 살 로또의 개수를 입력받는다(LottoMachine)
- 수동 개수 / 자동 개수 분리
- 수동 개수 입력이 완료되었는지 관리
- 수동의 개수가 전체 개수보다 많을 수 없다.
- 수동의 제외 나머지는 자동으로 관리한다.
- 수동으로 구매할 번호를 입력받는다.
- 수동으로 살 로또의 개수와 구매할 번호의 세트의 수가 같은지 확인이 필요
- Lotto에서는 수동과 자동의 번호 개수를 같이 관리한다.(생성자 필요)
3 changes: 1 addition & 2 deletions src/main/java/calculator/controller/Calculator.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package calculator.controller;

import calculator.domain.Operator;
import calculator.domain.Number;
import calculator.domain.Operator;

import java.util.List;
import java.util.Objects;
Expand All @@ -16,7 +16,6 @@ public Calculator(List<Number> numbers, List<Operator> operators) {
}



public Number calculate() {
Number result = numbers.getFirst();

Expand Down
6 changes: 3 additions & 3 deletions src/main/java/controller/Calculator.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package controller;

import domain.Operator;
import domain.Number;
import domain.Operator;
import domain.OperatorFactory;
import util.Parser;

Expand Down Expand Up @@ -29,7 +29,7 @@ public Calculator(List<Number> numbers, List<Operator> operators) {
private static List<Number> parseNumbers(String[] expression) {
List<Number> numbers = new ArrayList<>();

for (int i = 0; i < expression.length; i+=2) {
for (int i = 0; i < expression.length; i += 2) {
numbers.add(new domain.Number(expression[i]));
}

Expand All @@ -38,7 +38,7 @@ private static List<Number> parseNumbers(String[] expression) {

private static List<Operator> parseOperators(String[] expression) {
List<Operator> operators = new ArrayList<>();
for (int i = 1; i < expression.length - 1; i+=2) {
for (int i = 1; i < expression.length - 1; i += 2) {
operators.add(OperatorFactory.getOperator(expression[i]));
}

Expand Down
41 changes: 25 additions & 16 deletions src/main/java/lotto/LottoApplication.java
Original file line number Diff line number Diff line change
@@ -1,30 +1,39 @@
package lotto;

import lotto.controller.LottoMachine;
import lotto.domain.WinningLotto;
import lotto.domain.Lotto;
import lotto.domain.LottoNumber;
import lotto.domain.LottoResult;
import lotto.controller.LottosBundleGenerator;
import lotto.domain.*;
import lotto.ui.InputView;
import lotto.ui.ResultView;
import lotto.util.LottoNumberParser;

import java.util.List;

public class LottoApplication {
public static void main(String[] args) {
String purchaseAmount = InputView.getPurchaseAmount();
try {
String purchaseAmount = InputView.getPurchaseAmount();
String manualLottoCount = InputView.getManualNumberCount();

LottoPrice price = new LottoPrice(purchaseAmount);
LottoCount manualCount = new LottoCount(manualLottoCount);

InputView.printStartManualNumbersInput();
List<String> manualLottos = InputView.getManualLottosNumbers(new LottoCount(manualLottoCount));

LottoMachine lottoMachine = new LottoMachine(purchaseAmount);
Lotto lotto = lottoMachine.generate();
LottosBundleGenerator lottosBundleGenerator = new LottosBundleGenerator(price, manualCount, manualLottos);
Lotto lotto = lottosBundleGenerator.generate();

ResultView.printLotto(lotto);
ResultView.printLotto(manualCount, manualCount.diffFromPrice(price), lotto);

String winningNumbers = InputView.getWinningNumber();
String bonusNumber = InputView.getBonusNumber();
String winningNumbers = InputView.getWinningNumber();
String bonusNumber = InputView.getBonusNumber();

WinningLotto winningLotto = new WinningLotto(winningNumbers, bonusNumber);
LottoResult result = lotto.getMatchResult(winningLotto);
WinningLotto winningLotto = new WinningLotto(winningNumbers, bonusNumber);
LottoResult result = lotto.getMatchResult(winningLotto);

ResultView.printLottoResult(result.toString());
ResultView.printProfit(result.getProfit());
ResultView.printLottoResult(result.toString());
ResultView.printProfit(result.getProfit());
} catch (Exception ex) {
ResultView.printError(ex.getMessage());
}
}
}
Original file line number Diff line number Diff line change
@@ -1,32 +1,28 @@
package lotto.controller;

import lotto.domain.Lotto;
import lotto.domain.LottoCount;
import lotto.domain.LottoNumbers;
import lotto.domain.LottoPrice;
import lotto.util.LottoNumberParser;
import lotto.util.RandomNumbersGenerator;

import java.util.ArrayList;
import java.util.List;

public class LottoMachine {
private final LottoPrice lottoPrice;
public class AutoLottoMachine implements LottoGenerator {
private final LottoCount autoCount;

public LottoMachine(String price) {
this(new LottoPrice(price));
}

public LottoMachine(LottoPrice lottoPrice) {
this.lottoPrice = lottoPrice;
public AutoLottoMachine(LottoCount autoCount) {
this.autoCount = autoCount;
}

@Override
public Lotto generate() {
List<LottoNumbers> lottoNumbersList = new ArrayList<>();

for (int i = 0; i < lottoPrice.count(); i++) {
for (int i = 0; !autoCount.isCountSame(i); i++) {
lottoNumbersList.add(new LottoNumbers(LottoNumberParser.parse(RandomNumbersGenerator.randomNumbers())));
}

return new Lotto(lottoPrice, lottoNumbersList);
return new Lotto(lottoNumbersList);
}
}
7 changes: 7 additions & 0 deletions src/main/java/lotto/controller/LottoGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package lotto.controller;

import lotto.domain.Lotto;

public interface LottoGenerator {
Lotto generate();
}
34 changes: 34 additions & 0 deletions src/main/java/lotto/controller/LottosBundleGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package lotto.controller;

import lotto.domain.Lotto;
import lotto.domain.LottoCount;
import lotto.domain.LottoPrice;

import java.util.List;

public class LottosBundleGenerator implements LottoGenerator {
private final List<LottoGenerator> lottosGenerators;

public LottosBundleGenerator(LottoPrice price, LottoCount manualCount, List<String> manualLottoText) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public LottosBundleGenerator(LottoPrice price, LottoCount manualCount, List<String> manualLottoText) {
public LottosBundleGenerator(LottoPrice price, List<String> manualLottoText) {

manualLottoText 크기가 manualCount인데 manualCount는 필요없는 값이지 않을까?

this(toLottosGenerators(price, manualCount, manualLottoText));
}

public LottosBundleGenerator(List<LottoGenerator> lottosGenerators) {
this.lottosGenerators = lottosGenerators;
}

private static List<LottoGenerator> toLottosGenerators(LottoPrice price, LottoCount manualCount, List<String> manualLottoText) {
return List.of(new AutoLottoMachine(manualCount.diffFromPrice(price)), new ManualLottoMachine(manualLottoText));
}

@Override
public Lotto generate() {
Lotto lotto = new Lotto();

for (LottoGenerator lottosGenerator : lottosGenerators) {
lotto = new Lotto(lotto, lottosGenerator.generate());
}

return lotto;
}
}
27 changes: 27 additions & 0 deletions src/main/java/lotto/controller/ManualLottoMachine.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package lotto.controller;

import lotto.domain.Lotto;
import lotto.domain.LottoNumbers;
import lotto.util.LottoNumberParser;

import java.util.ArrayList;
import java.util.List;

public class ManualLottoMachine implements LottoGenerator {
private final List<String> lottoNumbersList;

public ManualLottoMachine(List<String> manualLottoNumbers) {
this.lottoNumbersList = manualLottoNumbers;
}

@Override
public Lotto generate() {
List<LottoNumbers> lottoNumbersList = new ArrayList<>();

for (int i = 0; i < this.lottoNumbersList.size(); i++) {
lottoNumbersList.add(new LottoNumbers(LottoNumberParser.parse(this.lottoNumbersList.get(i))));
}

return new Lotto(lottoNumbersList);
}
}
22 changes: 15 additions & 7 deletions src/main/java/lotto/domain/Lotto.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,29 @@
package lotto.domain;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Lotto {
private final LottoPrice price;
private final List<LottoNumbers> lottoNumbers;

public Lotto(LottoPrice price, List<LottoNumbers> lottoNumbers) {
this.price = price;
public Lotto(Lotto... lottos) {
this(combineLottoNumbers(lottos));
}

public Lotto(List<LottoNumbers> lottoNumbers) {
this.lottoNumbers = lottoNumbers;
}

private static List<LottoNumbers> combineLottoNumbers(Lotto... lottos) {
List<LottoNumbers> combined = new ArrayList<>();
for (Lotto lotto : lottos) {
combined.addAll(lotto.lottoNumbers);
}

return combined;
}

public LottoResult getMatchResult(WinningLotto winningLotto) {
LottoResult result = new LottoResult();

Expand All @@ -23,10 +35,6 @@ public LottoResult getMatchResult(WinningLotto winningLotto) {
return result;
}

public String count() {
return String.valueOf(price.count());
}

@Override
public String toString() {
return lottoNumbers.stream().map(LottoNumbers::toString).collect(Collectors.joining("\n"));
Expand Down
44 changes: 44 additions & 0 deletions src/main/java/lotto/domain/LottoCount.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package lotto.domain;

import java.util.Objects;

public class LottoCount {
private final int count;

public LottoCount(String count) {
this(Integer.parseInt(count));
}

public LottoCount(int count) {
this.count = count;
}

public LottoCount increase() {
return new LottoCount(this.count + 1);
}

public boolean isCountSame(int count) {
return this.count == count;
}

public LottoCount diffFromPrice(LottoPrice price) {
return new LottoCount(price.count() - count);
}

@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
LottoCount that = (LottoCount) o;
return count == that.count;
}

@Override
public int hashCode() {
return Objects.hashCode(count);
}

@Override
public String toString() {
return String.valueOf(count);
}
}
29 changes: 25 additions & 4 deletions src/main/java/lotto/domain/LottoNumber.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,39 @@
package lotto.domain;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

public class LottoNumber {
private final int number;
private static final int MIN = 1;
private static final int MAX = 45;
private static final LottoNumber NONE = new LottoNumber(0);
private static final Map<Integer, LottoNumber> Cache = new HashMap<>();

public LottoNumber(String number) {
this(Integer.parseInt(number));
static {
for (int i = MIN; i <= MAX; i++) {
Cache.put(i, new LottoNumber(i));
}
}

public LottoNumber(int number) {
private final int number;

private LottoNumber(int number) {
this.number = number;
}

public static LottoNumber get(int value) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

LottoNumber lottoNumber = Cache.getOrDefault(value, NONE);
if (lottoNumber == NONE) {
throw new IllegalArgumentException("로또의 숫자는 1에서 45 사이여야합니다.");
}
return Cache.get(value);
}

public static LottoNumber get(String value) {
return get(Integer.parseInt(value));
}

@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
Expand Down
3 changes: 0 additions & 3 deletions src/main/java/lotto/domain/LottoNumbers.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@

import lotto.util.LottoNumberParser;

import java.sql.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/lotto/domain/LottoPrice.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ public LottoPrice(String price) {
}

public LottoPrice(int price) {
if (price <= PRICE_PER_LOTTO) {
throw new IllegalArgumentException("로또를 구매할 수 없는 가격입니다");
}
this.price = price;
}

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/lotto/domain/WinningLotto.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ public class WinningLotto {
private final LottoNumber bonusNumber;

public WinningLotto(String winningNumbers, String bonusNumber) {
this(new LottoNumbers(LottoNumberParser.parse(winningNumbers)), new LottoNumber(bonusNumber));
this(new LottoNumbers(LottoNumberParser.parse(winningNumbers)), LottoNumber.get(bonusNumber));
}

public WinningLotto(LottoNumbers winningNumbers, LottoNumber bonusNumber) {
Expand Down
Loading