From 8f2693701bd702146c4b149fd77ecde30ecf10b4 Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 14:29:46 +0900 Subject: [PATCH 01/23] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=ED=95=A0=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 88 ++++++++++++++++++++++ src/main/java/planetlotto/Application.java | 2 +- 2 files changed, 89 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8a4f22ed0..1fff841c9 100644 --- a/README.md +++ b/README.md @@ -1 +1,89 @@ # java-planetlotto-precourse + +## 참고 +로또 번호 숫자 범위 +- 1 ~ 30 + +1개 로또 +- 중복되지 않는 5개의 숫자 + +당첨 번호 추첨 +- 중복되지 않는 숫자 5개 + 보너스 번호 1 개 + +당첨 기준 +1등 / 5개 일치 / 100,000,000 +2등 / ... + +예외 처리 +- 메세지 출력 후 해당 부분부터 다시 입력 +- [ERROR] 로또 번호는 1부터 30 사이의 숫자여야 합니다. + + +## 구현할 기능 목록 + +### 구입 금액 입력 +- [ ] 예외가 발생하면 로또 구입 금액 입력부터 재실행 한다. + + + 입력 +- [ ] 로또 구입 금액을 입력받는다. // int + + + 비즈니스 +- [ ] 금액이 500원 단위가 맞는지 확인한다. +- [ ] 500원 단위가 아니면 예외가 발생한다. +- [ ] 로또 구입 수량을 계산한다. 금액 / 500 + +### 로또 발행 +비즈니스 +- [ ] 로또 구입 수량만큼 반복한다. +- [ ] 랜덤 번호를 생성한다. List<로또번호> +- [ ] 로또를 생성한다. +- [ ] 로또를 저장한다. + + +출력 +- [ ] 구매한 로또를 출력한다 // + 입력 요구 -> List> lottos + +### 당첨 번호 입력 +- [ ] 예외가 발생하면 당첨 번호 입력부터 재실행한다. + + + 입력 +- [ ] 당첨 번호를 입력받는다. // List + + + 비즈니스 +- [ ] 입력된 당첨 번호가 5개인지 검증한다. +- [ ] 입력된 당첨 번호가 1~30 사이의 숫자인지 검증한다. +- [ ] 입력된 당첨 번호가 중복이 없는지 검사한다. +- [ ] 입력된 번호를 저장한다. // WinningLotto(List<당첨로또>, 보너스번호) + +### 보너스 번호 입력 +- [ ] 예외가 발생하면 보너스 번호 입력부터 재실행한다. + + + 입력 +- [ ] 보너스 번호를 입력받는다. // int + + + 비즈니스 +- [ ] 보너스 번호가 당첨번호와 중복되지 않는지 검증 +- [ ] 입력된 번호를 저장한다. + +### 당첨 통계 출력 +비즈니스 +- [ ] 로또와 당첨번호의 결과를 비교하여 등수를 반환한다. +- [ ] 구매한 로또의 등수를 계산한다. +- [ ] 등수를 저장한다. +- [ ] 결과를 출력한다. + 입력 요구 -> Map<등수, 당첨개수> countsByRank + +도메인 +- Lotto // 로또, 로또에 사용하는 숫자 검증 +- WinningLotto // 당첨로또, 보너스 번호 +- LottoGenerator // 로또 생성, List<로또 번호> +- PurchasedLotto // List +- LottoService // +- LottoPolicy // 구매금액 확인, 등수 계산 \ No newline at end of file diff --git a/src/main/java/planetlotto/Application.java b/src/main/java/planetlotto/Application.java index 27d0a8f96..4a81cd9be 100644 --- a/src/main/java/planetlotto/Application.java +++ b/src/main/java/planetlotto/Application.java @@ -2,6 +2,6 @@ public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + } } From 9ce16aefad6c245d845742b0914cbf4259861d3d Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 14:40:38 +0900 Subject: [PATCH 02/23] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EA=B5=AC?= =?UTF-8?q?=EC=9E=85=20=EA=B8=88=EC=95=A1=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- src/main/java/planetlotto/Application.java | 5 ++++- .../controller/LottoController.java | 19 +++++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 src/main/java/planetlotto/controller/LottoController.java diff --git a/README.md b/README.md index 1fff841c9..b9a36766d 100644 --- a/README.md +++ b/README.md @@ -22,11 +22,11 @@ ## 구현할 기능 목록 ### 구입 금액 입력 -- [ ] 예외가 발생하면 로또 구입 금액 입력부터 재실행 한다. +- [x] 예외가 발생하면 로또 구입 금액 입력부터 재실행 한다. 입력 -- [ ] 로또 구입 금액을 입력받는다. // int +- [x] 로또 구입 금액을 입력받는다. // int 비즈니스 diff --git a/src/main/java/planetlotto/Application.java b/src/main/java/planetlotto/Application.java index 4a81cd9be..5c6e2c8b0 100644 --- a/src/main/java/planetlotto/Application.java +++ b/src/main/java/planetlotto/Application.java @@ -1,7 +1,10 @@ package planetlotto; +import planetlotto.controller.LottoController; + public class Application { public static void main(String[] args) { - + LottoController controller = new LottoController(); + controller.run(); } } diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java new file mode 100644 index 000000000..b1ff40687 --- /dev/null +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -0,0 +1,19 @@ +package planetlotto.controller; + +import planetlotto.view.InputView; +import planetlotto.view.OutputView; + +public class LottoController { + + public void run() { + while (true) { + try { + int amount = InputView.askAmount(); + } catch (IllegalArgumentException e) { + OutputView.printErrorMessage(e.getMessage()); + continue; + } + break; + } + } +} From f880e42315b5e3b793ce18323bd7addf956f8fbe Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 14:48:05 +0900 Subject: [PATCH 03/23] =?UTF-8?q?feat:=20=EA=B5=AC=EC=9E=85=20=EA=B8=88?= =?UTF-8?q?=EC=95=A1=EC=9D=B4=20=EB=A1=9C=EB=98=90=20=EA=B8=88=EC=95=A1=20?= =?UTF-8?q?=EB=8B=A8=EC=9C=84=EC=99=80=20=EB=A7=9E=EB=8A=94=EC=A7=80=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/planetlotto/Application.java | 8 +++++++- .../java/planetlotto/controller/LottoController.java | 6 ++++++ src/main/java/planetlotto/domain/LottoPolicy.java | 9 +++++++++ src/main/java/planetlotto/service/LottoService.java | 11 +++++++++++ 5 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 src/main/java/planetlotto/domain/LottoPolicy.java create mode 100644 src/main/java/planetlotto/service/LottoService.java diff --git a/README.md b/README.md index b9a36766d..5b0755362 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ 비즈니스 -- [ ] 금액이 500원 단위가 맞는지 확인한다. +- [x] 금액이 500원 단위가 맞는지 확인한다. - [ ] 500원 단위가 아니면 예외가 발생한다. - [ ] 로또 구입 수량을 계산한다. 금액 / 500 diff --git a/src/main/java/planetlotto/Application.java b/src/main/java/planetlotto/Application.java index 5c6e2c8b0..dc977523c 100644 --- a/src/main/java/planetlotto/Application.java +++ b/src/main/java/planetlotto/Application.java @@ -1,10 +1,16 @@ package planetlotto; import planetlotto.controller.LottoController; +import planetlotto.domain.LottoPolicy; +import planetlotto.service.LottoService; public class Application { public static void main(String[] args) { - LottoController controller = new LottoController(); + LottoPolicy policy = new LottoPolicy(); + + LottoService service = new LottoService(policy); + + LottoController controller = new LottoController(service); controller.run(); } } diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index b1ff40687..b33371ddb 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -1,9 +1,15 @@ package planetlotto.controller; +import planetlotto.service.LottoService; import planetlotto.view.InputView; import planetlotto.view.OutputView; public class LottoController { + private LottoService service; + + public LottoController(LottoService service) { + this.service = service; + } public void run() { while (true) { diff --git a/src/main/java/planetlotto/domain/LottoPolicy.java b/src/main/java/planetlotto/domain/LottoPolicy.java new file mode 100644 index 000000000..2241f7adb --- /dev/null +++ b/src/main/java/planetlotto/domain/LottoPolicy.java @@ -0,0 +1,9 @@ +package planetlotto.domain; + +public class LottoPolicy { + private static final int LOTTO_PRICE = 500; + + public boolean isCorrectUnit(int amount) { + return amount % LOTTO_PRICE == 0; + } +} diff --git a/src/main/java/planetlotto/service/LottoService.java b/src/main/java/planetlotto/service/LottoService.java new file mode 100644 index 000000000..57db12649 --- /dev/null +++ b/src/main/java/planetlotto/service/LottoService.java @@ -0,0 +1,11 @@ +package planetlotto.service; + +import planetlotto.domain.LottoPolicy; + +public class LottoService { + private LottoPolicy policy; + + public LottoService(LottoPolicy policy) { + this.policy = policy; + } +} From dddf26656d594b365464ad14a2e599e729e2cb4b Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 14:59:46 +0900 Subject: [PATCH 04/23] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EA=B5=AC?= =?UTF-8?q?=EC=9E=85=20=EC=88=98=EB=9F=89=EC=9D=84=20=EA=B3=84=EC=82=B0?= =?UTF-8?q?=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- .../java/planetlotto/controller/LottoController.java | 12 ++++++++++-- src/main/java/planetlotto/domain/LottoPolicy.java | 4 ++++ src/main/java/planetlotto/service/LottoService.java | 10 ++++++++++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5b0755362..2938e6eb4 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,8 @@ 비즈니스 - [x] 금액이 500원 단위가 맞는지 확인한다. -- [ ] 500원 단위가 아니면 예외가 발생한다. -- [ ] 로또 구입 수량을 계산한다. 금액 / 500 +- [x] 500원 단위가 아니면 예외가 발생한다. +- [x] 로또 구입 수량을 계산한다. 금액 / 500 ### 로또 발행 비즈니스 diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index b33371ddb..69e24efd9 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -12,14 +12,22 @@ public LottoController(LottoService service) { } public void run() { + int amount = getAmount(); + int purchaseQuantity = service.getPurchaseQuantity(amount); + + } + + private int getAmount() { + int amount; while (true) { try { - int amount = InputView.askAmount(); + amount = InputView.askAmount(); + service.validateAmount(amount); } catch (IllegalArgumentException e) { OutputView.printErrorMessage(e.getMessage()); continue; } - break; + return amount; } } } diff --git a/src/main/java/planetlotto/domain/LottoPolicy.java b/src/main/java/planetlotto/domain/LottoPolicy.java index 2241f7adb..8df7716f1 100644 --- a/src/main/java/planetlotto/domain/LottoPolicy.java +++ b/src/main/java/planetlotto/domain/LottoPolicy.java @@ -6,4 +6,8 @@ public class LottoPolicy { public boolean isCorrectUnit(int amount) { return amount % LOTTO_PRICE == 0; } + + public int getPurchaseQuantity(int amount) { + return amount / LOTTO_PRICE; + } } diff --git a/src/main/java/planetlotto/service/LottoService.java b/src/main/java/planetlotto/service/LottoService.java index 57db12649..18aeca826 100644 --- a/src/main/java/planetlotto/service/LottoService.java +++ b/src/main/java/planetlotto/service/LottoService.java @@ -8,4 +8,14 @@ public class LottoService { public LottoService(LottoPolicy policy) { this.policy = policy; } + + public void validateAmount(int amount) { + if (!policy.isCorrectUnit(amount)) { + throw new IllegalArgumentException("구입 금액은 500원 단위로 입력해주세요."); + } + } + + public int getPurchaseQuantity(int amount) { + return policy.getPurchaseQuantity(amount); + } } From c9c1035c726a2c0bd77df9efd4a8b60130e51a4a Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 15:00:58 +0900 Subject: [PATCH 05/23] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EA=B5=AC?= =?UTF-8?q?=EC=9E=85=20=EC=88=98=EB=9F=89=EB=A7=8C=ED=81=BC=20=EB=B0=98?= =?UTF-8?q?=EB=B3=B5=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/planetlotto/controller/LottoController.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2938e6eb4..fe5a28196 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ ### 로또 발행 비즈니스 -- [ ] 로또 구입 수량만큼 반복한다. +- [x] 로또 구입 수량만큼 반복한다. - [ ] 랜덤 번호를 생성한다. List<로또번호> - [ ] 로또를 생성한다. - [ ] 로또를 저장한다. diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index 69e24efd9..7fcbc6db5 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -15,6 +15,9 @@ public void run() { int amount = getAmount(); int purchaseQuantity = service.getPurchaseQuantity(amount); + for (int i = 0; i < purchaseQuantity; i++) { + + } } private int getAmount() { From 196abed05c673745a2991d11347ec501cff094ee Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 15:17:26 +0900 Subject: [PATCH 06/23] =?UTF-8?q?feat:=20=EB=9E=9C=EB=8D=A4=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=EB=A1=9C=20=EB=A1=9C=EB=98=90=EB=A5=BC=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- src/main/java/planetlotto/Application.java | 5 ++++- .../controller/LottoController.java | 2 +- src/main/java/planetlotto/domain/Lotto.java | 18 ++++++++++++++++++ .../planetlotto/domain/LottoGenerator.java | 5 +++++ .../domain/RandomLottoGenerator.java | 11 +++++++++++ .../java/planetlotto/service/LottoService.java | 10 +++++++++- 7 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 src/main/java/planetlotto/domain/Lotto.java create mode 100644 src/main/java/planetlotto/domain/LottoGenerator.java create mode 100644 src/main/java/planetlotto/domain/RandomLottoGenerator.java diff --git a/README.md b/README.md index fe5a28196..fa4c84782 100644 --- a/README.md +++ b/README.md @@ -37,8 +37,8 @@ ### 로또 발행 비즈니스 - [x] 로또 구입 수량만큼 반복한다. -- [ ] 랜덤 번호를 생성한다. List<로또번호> -- [ ] 로또를 생성한다. +- [x] 랜덤 번호를 생성한다. List<로또번호> +- [x] 로또를 생성한다. - [ ] 로또를 저장한다. diff --git a/src/main/java/planetlotto/Application.java b/src/main/java/planetlotto/Application.java index dc977523c..5e1673fc7 100644 --- a/src/main/java/planetlotto/Application.java +++ b/src/main/java/planetlotto/Application.java @@ -1,14 +1,17 @@ package planetlotto; import planetlotto.controller.LottoController; +import planetlotto.domain.LottoGenerator; import planetlotto.domain.LottoPolicy; +import planetlotto.domain.RandomLottoGenerator; import planetlotto.service.LottoService; public class Application { public static void main(String[] args) { LottoPolicy policy = new LottoPolicy(); + LottoGenerator generator = new RandomLottoGenerator(); - LottoService service = new LottoService(policy); + LottoService service = new LottoService(policy, generator); LottoController controller = new LottoController(service); controller.run(); diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index 7fcbc6db5..d1f9ec0b7 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -16,7 +16,7 @@ public void run() { int purchaseQuantity = service.getPurchaseQuantity(amount); for (int i = 0; i < purchaseQuantity; i++) { - + service.generateLotto(); } } diff --git a/src/main/java/planetlotto/domain/Lotto.java b/src/main/java/planetlotto/domain/Lotto.java new file mode 100644 index 000000000..8fc79232e --- /dev/null +++ b/src/main/java/planetlotto/domain/Lotto.java @@ -0,0 +1,18 @@ +package planetlotto.domain; + +import java.util.List; + +public class Lotto { + private List numbers; + + public Lotto(List numbers) { + this.numbers = numbers; + } + + @Override + public String toString() { + return "Lotto{" + + "numbers=" + numbers + + '}'; + } +} diff --git a/src/main/java/planetlotto/domain/LottoGenerator.java b/src/main/java/planetlotto/domain/LottoGenerator.java new file mode 100644 index 000000000..88e1ddda1 --- /dev/null +++ b/src/main/java/planetlotto/domain/LottoGenerator.java @@ -0,0 +1,5 @@ +package planetlotto.domain; + +public interface LottoGenerator { + Lotto generate(); +} diff --git a/src/main/java/planetlotto/domain/RandomLottoGenerator.java b/src/main/java/planetlotto/domain/RandomLottoGenerator.java new file mode 100644 index 000000000..343c13455 --- /dev/null +++ b/src/main/java/planetlotto/domain/RandomLottoGenerator.java @@ -0,0 +1,11 @@ +package planetlotto.domain; + +import camp.nextstep.edu.missionutils.Randoms; + +public class RandomLottoGenerator implements LottoGenerator { + + @Override + public Lotto generate() { + return new Lotto(Randoms.pickUniqueNumbersInRange(1, 30, 5)); + } +} diff --git a/src/main/java/planetlotto/service/LottoService.java b/src/main/java/planetlotto/service/LottoService.java index 18aeca826..96b1b3dbd 100644 --- a/src/main/java/planetlotto/service/LottoService.java +++ b/src/main/java/planetlotto/service/LottoService.java @@ -1,12 +1,16 @@ package planetlotto.service; +import planetlotto.domain.Lotto; +import planetlotto.domain.LottoGenerator; import planetlotto.domain.LottoPolicy; public class LottoService { private LottoPolicy policy; + private LottoGenerator generator; - public LottoService(LottoPolicy policy) { + public LottoService(LottoPolicy policy, LottoGenerator generator) { this.policy = policy; + this.generator = generator; } public void validateAmount(int amount) { @@ -18,4 +22,8 @@ public void validateAmount(int amount) { public int getPurchaseQuantity(int amount) { return policy.getPurchaseQuantity(amount); } + + public void generateLotto() { + Lotto generate = generator.generate(); + } } From dca1e93cea1b1d6bf6f04e7d3f9881ce7e5782b1 Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 15:21:29 +0900 Subject: [PATCH 07/23] =?UTF-8?q?feat:=20=EC=83=9D=EC=84=B1=ED=95=9C=20?= =?UTF-8?q?=EB=A1=9C=EB=98=90=EB=A5=BC=20=EC=A0=80=EC=9E=A5=ED=95=9C?= =?UTF-8?q?=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/planetlotto/Application.java | 4 +++- src/main/java/planetlotto/domain/PurchasedLotto.java | 12 ++++++++++++ src/main/java/planetlotto/service/LottoService.java | 6 +++++- 4 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 src/main/java/planetlotto/domain/PurchasedLotto.java diff --git a/README.md b/README.md index fa4c84782..f7cb49512 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ - [x] 로또 구입 수량만큼 반복한다. - [x] 랜덤 번호를 생성한다. List<로또번호> - [x] 로또를 생성한다. -- [ ] 로또를 저장한다. +- [x] 로또를 저장한다. 출력 diff --git a/src/main/java/planetlotto/Application.java b/src/main/java/planetlotto/Application.java index 5e1673fc7..a7b528169 100644 --- a/src/main/java/planetlotto/Application.java +++ b/src/main/java/planetlotto/Application.java @@ -3,6 +3,7 @@ import planetlotto.controller.LottoController; import planetlotto.domain.LottoGenerator; import planetlotto.domain.LottoPolicy; +import planetlotto.domain.PurchasedLotto; import planetlotto.domain.RandomLottoGenerator; import planetlotto.service.LottoService; @@ -10,8 +11,9 @@ public class Application { public static void main(String[] args) { LottoPolicy policy = new LottoPolicy(); LottoGenerator generator = new RandomLottoGenerator(); + PurchasedLotto purchased = new PurchasedLotto(); - LottoService service = new LottoService(policy, generator); + LottoService service = new LottoService(policy, generator, purchased); LottoController controller = new LottoController(service); controller.run(); diff --git a/src/main/java/planetlotto/domain/PurchasedLotto.java b/src/main/java/planetlotto/domain/PurchasedLotto.java new file mode 100644 index 000000000..4eef0e49f --- /dev/null +++ b/src/main/java/planetlotto/domain/PurchasedLotto.java @@ -0,0 +1,12 @@ +package planetlotto.domain; + +import java.util.ArrayList; +import java.util.List; + +public class PurchasedLotto { + private List lottos = new ArrayList<>(); + + public void addLotto(Lotto lotto) { + lottos.add(lotto); + } +} diff --git a/src/main/java/planetlotto/service/LottoService.java b/src/main/java/planetlotto/service/LottoService.java index 96b1b3dbd..3149042af 100644 --- a/src/main/java/planetlotto/service/LottoService.java +++ b/src/main/java/planetlotto/service/LottoService.java @@ -3,14 +3,17 @@ import planetlotto.domain.Lotto; import planetlotto.domain.LottoGenerator; import planetlotto.domain.LottoPolicy; +import planetlotto.domain.PurchasedLotto; public class LottoService { private LottoPolicy policy; private LottoGenerator generator; + private PurchasedLotto purchased; - public LottoService(LottoPolicy policy, LottoGenerator generator) { + public LottoService(LottoPolicy policy, LottoGenerator generator, PurchasedLotto purchased) { this.policy = policy; this.generator = generator; + this.purchased = purchased; } public void validateAmount(int amount) { @@ -25,5 +28,6 @@ public int getPurchaseQuantity(int amount) { public void generateLotto() { Lotto generate = generator.generate(); + purchased.addLotto(generate); } } From 50fce6904a97b5fda0e7d5bac981144098be47b2 Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 15:33:14 +0900 Subject: [PATCH 08/23] =?UTF-8?q?feat:=20=EA=B5=AC=EB=A7=A4=ED=95=9C=20?= =?UTF-8?q?=EB=A1=9C=EB=98=90=EB=A5=BC=20=EC=B6=9C=EB=A0=A5=ED=95=9C?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/planetlotto/controller/LottoController.java | 3 +++ src/main/java/planetlotto/domain/Lotto.java | 4 ++++ src/main/java/planetlotto/domain/PurchasedLotto.java | 8 ++++++++ src/main/java/planetlotto/service/LottoService.java | 6 ++++++ 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f7cb49512..33493490e 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ 출력 -- [ ] 구매한 로또를 출력한다 // +- [x] 구매한 로또를 출력한다 // 입력 요구 -> List> lottos ### 당첨 번호 입력 diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index d1f9ec0b7..ab1d736d2 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -4,6 +4,8 @@ import planetlotto.view.InputView; import planetlotto.view.OutputView; +import java.util.List; + public class LottoController { private LottoService service; @@ -18,6 +20,7 @@ public void run() { for (int i = 0; i < purchaseQuantity; i++) { service.generateLotto(); } + OutputView.printPurchasedLottos(service.getPurchasedLottos()); } private int getAmount() { diff --git a/src/main/java/planetlotto/domain/Lotto.java b/src/main/java/planetlotto/domain/Lotto.java index 8fc79232e..a3d72aa68 100644 --- a/src/main/java/planetlotto/domain/Lotto.java +++ b/src/main/java/planetlotto/domain/Lotto.java @@ -9,6 +9,10 @@ public Lotto(List numbers) { this.numbers = numbers; } + public List getNumbers() { + return numbers; + } + @Override public String toString() { return "Lotto{" + diff --git a/src/main/java/planetlotto/domain/PurchasedLotto.java b/src/main/java/planetlotto/domain/PurchasedLotto.java index 4eef0e49f..b24df3569 100644 --- a/src/main/java/planetlotto/domain/PurchasedLotto.java +++ b/src/main/java/planetlotto/domain/PurchasedLotto.java @@ -9,4 +9,12 @@ public class PurchasedLotto { public void addLotto(Lotto lotto) { lottos.add(lotto); } + + public List> getLottos() { + List> resultLottos = new ArrayList<>(); + for (Lotto lotto : lottos) { + resultLottos.add(lotto.getNumbers()); + } + return resultLottos; + } } diff --git a/src/main/java/planetlotto/service/LottoService.java b/src/main/java/planetlotto/service/LottoService.java index 3149042af..7fddd5ad2 100644 --- a/src/main/java/planetlotto/service/LottoService.java +++ b/src/main/java/planetlotto/service/LottoService.java @@ -5,6 +5,8 @@ import planetlotto.domain.LottoPolicy; import planetlotto.domain.PurchasedLotto; +import java.util.List; + public class LottoService { private LottoPolicy policy; private LottoGenerator generator; @@ -30,4 +32,8 @@ public void generateLotto() { Lotto generate = generator.generate(); purchased.addLotto(generate); } + + public List> getPurchasedLottos() { + return purchased.getLottos(); + } } From ddb363ef959f972d724ed7c7161e7d9409b0978c Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 15:35:33 +0900 Subject: [PATCH 09/23] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/controller/LottoController.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index ab1d736d2..f5f68f096 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -4,8 +4,6 @@ import planetlotto.view.InputView; import planetlotto.view.OutputView; -import java.util.List; - public class LottoController { private LottoService service; @@ -14,6 +12,11 @@ public LottoController(LottoService service) { } public void run() { + purchaseLottos(); + + } + + private void purchaseLottos() { int amount = getAmount(); int purchaseQuantity = service.getPurchaseQuantity(amount); From f7c9f04d48e7f5c37d85fd20b35cdd948022c156 Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 15:38:17 +0900 Subject: [PATCH 10/23] =?UTF-8?q?feat:=20=EB=8B=B9=EC=B2=A8=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=9E=85=EB=A0=A5=20=EB=B0=8F=20=EC=9E=AC=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- .../java/planetlotto/controller/LottoController.java | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 33493490e..e7babc441 100644 --- a/README.md +++ b/README.md @@ -47,11 +47,11 @@ 입력 요구 -> List> lottos ### 당첨 번호 입력 -- [ ] 예외가 발생하면 당첨 번호 입력부터 재실행한다. +- [x] 예외가 발생하면 당첨 번호 입력부터 재실행한다. 입력 -- [ ] 당첨 번호를 입력받는다. // List +- [x] 당첨 번호를 입력받는다. // List 비즈니스 diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index f5f68f096..05a4f6d20 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -4,6 +4,8 @@ import planetlotto.view.InputView; import planetlotto.view.OutputView; +import java.util.List; + public class LottoController { private LottoService service; @@ -14,6 +16,15 @@ public LottoController(LottoService service) { public void run() { purchaseLottos(); + while (true) { + try { + List numbers = InputView.askWinningLotto(); + } catch (IllegalArgumentException e) { + OutputView.printErrorMessage(e.getMessage()); + continue; + } + break; + } } private void purchaseLottos() { From 9ba0e2022ae5eaf474c01df62f61e3f15f9ea8b8 Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 15:48:51 +0900 Subject: [PATCH 11/23] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=EB=90=9C=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=EB=A5=BC=20=EC=A0=80=EC=9E=A5=ED=95=9C?= =?UTF-8?q?=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/planetlotto/Application.java | 8 +++----- .../planetlotto/controller/LottoController.java | 3 ++- src/main/java/planetlotto/domain/Lotto.java | 5 +++++ .../java/planetlotto/domain/WinningLotto.java | 16 ++++++++++++++++ .../java/planetlotto/service/LottoService.java | 13 ++++++++----- 6 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 src/main/java/planetlotto/domain/WinningLotto.java diff --git a/README.md b/README.md index e7babc441..6529ab47d 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ - [ ] 입력된 당첨 번호가 5개인지 검증한다. - [ ] 입력된 당첨 번호가 1~30 사이의 숫자인지 검증한다. - [ ] 입력된 당첨 번호가 중복이 없는지 검사한다. -- [ ] 입력된 번호를 저장한다. // WinningLotto(List<당첨로또>, 보너스번호) +- [x] 입력된 번호를 저장한다. // WinningLotto(List<당첨로또>, 보너스번호) ### 보너스 번호 입력 - [ ] 예외가 발생하면 보너스 번호 입력부터 재실행한다. diff --git a/src/main/java/planetlotto/Application.java b/src/main/java/planetlotto/Application.java index a7b528169..1f31cc780 100644 --- a/src/main/java/planetlotto/Application.java +++ b/src/main/java/planetlotto/Application.java @@ -1,10 +1,7 @@ package planetlotto; import planetlotto.controller.LottoController; -import planetlotto.domain.LottoGenerator; -import planetlotto.domain.LottoPolicy; -import planetlotto.domain.PurchasedLotto; -import planetlotto.domain.RandomLottoGenerator; +import planetlotto.domain.*; import planetlotto.service.LottoService; public class Application { @@ -12,8 +9,9 @@ public static void main(String[] args) { LottoPolicy policy = new LottoPolicy(); LottoGenerator generator = new RandomLottoGenerator(); PurchasedLotto purchased = new PurchasedLotto(); + WinningLotto winning = new WinningLotto(); - LottoService service = new LottoService(policy, generator, purchased); + LottoService service = new LottoService(policy, generator, purchased, winning); LottoController controller = new LottoController(service); controller.run(); diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index 05a4f6d20..c95bf7755 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -18,7 +18,8 @@ public void run() { while (true) { try { - List numbers = InputView.askWinningLotto(); + List winningNumbers = InputView.askWinningLotto(); + service.setWinningNumbers(winningNumbers); } catch (IllegalArgumentException e) { OutputView.printErrorMessage(e.getMessage()); continue; diff --git a/src/main/java/planetlotto/domain/Lotto.java b/src/main/java/planetlotto/domain/Lotto.java index a3d72aa68..34fbdee04 100644 --- a/src/main/java/planetlotto/domain/Lotto.java +++ b/src/main/java/planetlotto/domain/Lotto.java @@ -7,12 +7,17 @@ public class Lotto { public Lotto(List numbers) { this.numbers = numbers; + validateNumbers(); } public List getNumbers() { return numbers; } + private void validateNumbers() { + + } + @Override public String toString() { return "Lotto{" + diff --git a/src/main/java/planetlotto/domain/WinningLotto.java b/src/main/java/planetlotto/domain/WinningLotto.java new file mode 100644 index 000000000..24ec316fd --- /dev/null +++ b/src/main/java/planetlotto/domain/WinningLotto.java @@ -0,0 +1,16 @@ +package planetlotto.domain; + +import java.util.List; + +public class WinningLotto { + private Lotto winning; + private int bonus; + + public void setWinning(List winningNumbers) { + this.winning = new Lotto(winningNumbers); + } + + public void setBonus(int bonus) { + this.bonus = bonus; + } +} diff --git a/src/main/java/planetlotto/service/LottoService.java b/src/main/java/planetlotto/service/LottoService.java index 7fddd5ad2..dd60f6d20 100644 --- a/src/main/java/planetlotto/service/LottoService.java +++ b/src/main/java/planetlotto/service/LottoService.java @@ -1,9 +1,6 @@ package planetlotto.service; -import planetlotto.domain.Lotto; -import planetlotto.domain.LottoGenerator; -import planetlotto.domain.LottoPolicy; -import planetlotto.domain.PurchasedLotto; +import planetlotto.domain.*; import java.util.List; @@ -11,11 +8,13 @@ public class LottoService { private LottoPolicy policy; private LottoGenerator generator; private PurchasedLotto purchased; + private WinningLotto winning; - public LottoService(LottoPolicy policy, LottoGenerator generator, PurchasedLotto purchased) { + public LottoService(LottoPolicy policy, LottoGenerator generator, PurchasedLotto purchased, WinningLotto winning) { this.policy = policy; this.generator = generator; this.purchased = purchased; + this.winning = winning; } public void validateAmount(int amount) { @@ -36,4 +35,8 @@ public void generateLotto() { public List> getPurchasedLottos() { return purchased.getLottos(); } + + public void setWinningNumbers(List winningNumbers) { + winning.setWinning(winningNumbers); + } } From c8e46d00a8d78ad3e2d3d01e4b0927748ac7a2c8 Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 15:50:51 +0900 Subject: [PATCH 12/23] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=EB=90=9C=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=EA=B0=80=205=EA=B0=9C=EA=B0=80=20=EB=A7=9E?= =?UTF-8?q?=EB=8A=94=EC=A7=80=20=EA=B2=80=EC=A6=9D=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/planetlotto/domain/Lotto.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6529ab47d..4e5db1b28 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ 비즈니스 -- [ ] 입력된 당첨 번호가 5개인지 검증한다. +- [x] 입력된 당첨 번호가 5개인지 검증한다. - [ ] 입력된 당첨 번호가 1~30 사이의 숫자인지 검증한다. - [ ] 입력된 당첨 번호가 중복이 없는지 검사한다. - [x] 입력된 번호를 저장한다. // WinningLotto(List<당첨로또>, 보너스번호) diff --git a/src/main/java/planetlotto/domain/Lotto.java b/src/main/java/planetlotto/domain/Lotto.java index 34fbdee04..228d0e395 100644 --- a/src/main/java/planetlotto/domain/Lotto.java +++ b/src/main/java/planetlotto/domain/Lotto.java @@ -15,7 +15,9 @@ public List getNumbers() { } private void validateNumbers() { - + if (numbers.size() != 5) { + throw new IllegalArgumentException("로또 숫자는 5개여야 합니다."); + } } @Override From 28eba4c8519bb1dd6fa762d4e68ff7fb4b3021b9 Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 15:52:27 +0900 Subject: [PATCH 13/23] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=EB=90=9C=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=20=EC=88=AB=EC=9E=90=20=EB=B2=94=EC=9C=84=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/planetlotto/domain/Lotto.java | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4e5db1b28..ae041cfcf 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ 비즈니스 - [x] 입력된 당첨 번호가 5개인지 검증한다. -- [ ] 입력된 당첨 번호가 1~30 사이의 숫자인지 검증한다. +- [x] 입력된 당첨 번호가 1~30 사이의 숫자인지 검증한다. - [ ] 입력된 당첨 번호가 중복이 없는지 검사한다. - [x] 입력된 번호를 저장한다. // WinningLotto(List<당첨로또>, 보너스번호) diff --git a/src/main/java/planetlotto/domain/Lotto.java b/src/main/java/planetlotto/domain/Lotto.java index 228d0e395..233194c05 100644 --- a/src/main/java/planetlotto/domain/Lotto.java +++ b/src/main/java/planetlotto/domain/Lotto.java @@ -18,6 +18,12 @@ private void validateNumbers() { if (numbers.size() != 5) { throw new IllegalArgumentException("로또 숫자는 5개여야 합니다."); } + + for (Integer number : numbers) { + if (number < 1 || number > 30) { + throw new IllegalArgumentException("로또 번호는 1부터 30 사이의 숫자여야 합니다."); + } + } } @Override From 6860fab64ad683184c7037f74028967beda4da3c Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 15:55:53 +0900 Subject: [PATCH 14/23] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=EB=90=9C=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=20=EC=88=AB=EC=9E=90=20=EC=A4=91=EB=B3=B5=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/planetlotto/domain/Lotto.java | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ae041cfcf..4b0c55aeb 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ 비즈니스 - [x] 입력된 당첨 번호가 5개인지 검증한다. - [x] 입력된 당첨 번호가 1~30 사이의 숫자인지 검증한다. -- [ ] 입력된 당첨 번호가 중복이 없는지 검사한다. +- [x] 입력된 당첨 번호가 중복이 없는지 검사한다. - [x] 입력된 번호를 저장한다. // WinningLotto(List<당첨로또>, 보너스번호) ### 보너스 번호 입력 diff --git a/src/main/java/planetlotto/domain/Lotto.java b/src/main/java/planetlotto/domain/Lotto.java index 233194c05..a01ee1b8c 100644 --- a/src/main/java/planetlotto/domain/Lotto.java +++ b/src/main/java/planetlotto/domain/Lotto.java @@ -1,5 +1,6 @@ package planetlotto.domain; +import java.util.HashSet; import java.util.List; public class Lotto { @@ -15,15 +16,22 @@ public List getNumbers() { } private void validateNumbers() { + // 숫자 5개 검증 if (numbers.size() != 5) { throw new IllegalArgumentException("로또 숫자는 5개여야 합니다."); } + // 숫자 범위 검증 for (Integer number : numbers) { if (number < 1 || number > 30) { throw new IllegalArgumentException("로또 번호는 1부터 30 사이의 숫자여야 합니다."); } } + + // 중복 검증 + if (numbers.size() != new HashSet<>(numbers).size()) { + throw new IllegalArgumentException("중복된 숫자 입력은 허용되지 않습니다."); + } } @Override From bd53e6e82996ae2fbf45804719d5d3534346845c Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 15:58:32 +0900 Subject: [PATCH 15/23] =?UTF-8?q?refactor:=20=EB=8B=B9=EC=B2=A8=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=20=EC=9E=85=EB=A0=A5=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/controller/LottoController.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index c95bf7755..fcbef99b0 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -15,7 +15,10 @@ public LottoController(LottoService service) { public void run() { purchaseLottos(); + setWinningNumbers(); + } + private void setWinningNumbers() { while (true) { try { List winningNumbers = InputView.askWinningLotto(); From 25a049a786ab0bbc0132da48a5d1b42be5a60df3 Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 15:59:45 +0900 Subject: [PATCH 16/23] =?UTF-8?q?feat:=20=EB=B3=B4=EB=84=88=EC=8A=A4=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=20=EC=9E=85=EB=A0=A5=20=EB=B0=8F=20=EC=9E=AC?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- .../java/planetlotto/controller/LottoController.java | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4b0c55aeb..b7c62bcc6 100644 --- a/README.md +++ b/README.md @@ -61,11 +61,11 @@ - [x] 입력된 번호를 저장한다. // WinningLotto(List<당첨로또>, 보너스번호) ### 보너스 번호 입력 -- [ ] 예외가 발생하면 보너스 번호 입력부터 재실행한다. +- [x] 예외가 발생하면 보너스 번호 입력부터 재실행한다. 입력 -- [ ] 보너스 번호를 입력받는다. // int +- [x] 보너스 번호를 입력받는다. // int 비즈니스 diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index fcbef99b0..5af29deb3 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -16,6 +16,18 @@ public LottoController(LottoService service) { public void run() { purchaseLottos(); setWinningNumbers(); + + while (true) { + try { + int bonus = InputView.askBonusNumber(); + + + } catch (IllegalArgumentException e) { + OutputView.printErrorMessage(e.getMessage()); + continue; + } + break; + } } private void setWinningNumbers() { From 77a4b3ca73df12cb8233df490c952a14c4a906d0 Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 16:06:14 +0900 Subject: [PATCH 17/23] =?UTF-8?q?feat:=20=EB=B3=B4=EB=84=88=EC=8A=A4=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=20=EC=A4=91=EB=B3=B5=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +++++-- src/main/java/planetlotto/controller/LottoController.java | 3 +-- src/main/java/planetlotto/domain/WinningLotto.java | 4 +++- src/main/java/planetlotto/service/LottoService.java | 4 ++++ 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b7c62bcc6..26d4c420f 100644 --- a/README.md +++ b/README.md @@ -69,8 +69,8 @@ 비즈니스 -- [ ] 보너스 번호가 당첨번호와 중복되지 않는지 검증 -- [ ] 입력된 번호를 저장한다. +- [x] 보너스 번호가 당첨번호와 중복되지 않는지 검증 +- [x] 입력된 번호를 저장한다. ### 당첨 통계 출력 비즈니스 @@ -80,6 +80,9 @@ - [ ] 결과를 출력한다. 입력 요구 -> Map<등수, 당첨개수> countsByRank +### 추가 +- [ ] 출력 정렬 필요함 + 도메인 - Lotto // 로또, 로또에 사용하는 숫자 검증 - WinningLotto // 당첨로또, 보너스 번호 diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index 5af29deb3..914ccad13 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -20,8 +20,7 @@ public void run() { while (true) { try { int bonus = InputView.askBonusNumber(); - - + service.setBonus(bonus); } catch (IllegalArgumentException e) { OutputView.printErrorMessage(e.getMessage()); continue; diff --git a/src/main/java/planetlotto/domain/WinningLotto.java b/src/main/java/planetlotto/domain/WinningLotto.java index 24ec316fd..75c9cd6fc 100644 --- a/src/main/java/planetlotto/domain/WinningLotto.java +++ b/src/main/java/planetlotto/domain/WinningLotto.java @@ -11,6 +11,8 @@ public void setWinning(List winningNumbers) { } public void setBonus(int bonus) { - this.bonus = bonus; + if (winning.getNumbers().contains(bonus)) { + throw new IllegalArgumentException("보너스 번호는 당첨 번호와 중복될 수 없습니다."); + } } } diff --git a/src/main/java/planetlotto/service/LottoService.java b/src/main/java/planetlotto/service/LottoService.java index dd60f6d20..09c514340 100644 --- a/src/main/java/planetlotto/service/LottoService.java +++ b/src/main/java/planetlotto/service/LottoService.java @@ -39,4 +39,8 @@ public List> getPurchasedLottos() { public void setWinningNumbers(List winningNumbers) { winning.setWinning(winningNumbers); } + + public void setBonus(int bonus) { + winning.setBonus(bonus); + } } From cac1ce0db5bcbbdded06525a073c7a71e213db92 Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 16:08:03 +0900 Subject: [PATCH 18/23] =?UTF-8?q?refactor:=20=EB=B3=B4=EB=84=88=EC=8A=A4?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + src/main/java/planetlotto/controller/LottoController.java | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index 26d4c420f..a6cf5637c 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,7 @@ ### 추가 - [ ] 출력 정렬 필요함 +- [ ] 보너스 번호 검증 안되고 있음. // LottoPolicy에서 체크 어떤지? 도메인 - Lotto // 로또, 로또에 사용하는 숫자 검증 diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index 914ccad13..d415f0451 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -15,8 +15,12 @@ public LottoController(LottoService service) { public void run() { purchaseLottos(); + setWinningNumbers(); + setBounus(); + } + private void setBounus() { while (true) { try { int bonus = InputView.askBonusNumber(); From d78403c86823e9d2e4fda3a9493f27a3d4f133fc Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 16:17:10 +0900 Subject: [PATCH 19/23] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=EC=99=80=20?= =?UTF-8?q?=EB=8B=B9=EC=B2=A8=EB=B2=88=ED=98=B8=EB=A5=BC=20=EB=B9=84?= =?UTF-8?q?=EA=B5=90=ED=95=98=EC=97=AC=20=EC=9D=BC=EC=B9=98=20=EC=88=98=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/planetlotto/Test.java | 12 ++++++++++++ src/main/java/planetlotto/domain/WinningLotto.java | 10 ++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 src/main/java/planetlotto/Test.java diff --git a/README.md b/README.md index a6cf5637c..8fcc2bff9 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ ### 당첨 통계 출력 비즈니스 -- [ ] 로또와 당첨번호의 결과를 비교하여 등수를 반환한다. +- [x] 로또와 당첨번호의 결과를 비교하여 등수를 반환한다. - [ ] 구매한 로또의 등수를 계산한다. - [ ] 등수를 저장한다. - [ ] 결과를 출력한다. diff --git a/src/main/java/planetlotto/Test.java b/src/main/java/planetlotto/Test.java new file mode 100644 index 000000000..7a3ca64bd --- /dev/null +++ b/src/main/java/planetlotto/Test.java @@ -0,0 +1,12 @@ +package planetlotto; + +import java.util.List; + +public class Test { + + public static void main(String[] args) { + List list = List.of(1, 2, 3, 4, 5); + List list1 = List.of(1, 2, 3, 4, 5); + System.out.println(list.equals(list1)); + } +} diff --git a/src/main/java/planetlotto/domain/WinningLotto.java b/src/main/java/planetlotto/domain/WinningLotto.java index 75c9cd6fc..459252b45 100644 --- a/src/main/java/planetlotto/domain/WinningLotto.java +++ b/src/main/java/planetlotto/domain/WinningLotto.java @@ -15,4 +15,14 @@ public void setBonus(int bonus) { throw new IllegalArgumentException("보너스 번호는 당첨 번호와 중복될 수 없습니다."); } } + + public int determineRank(Lotto lotto) { + int count = 0; + for (Integer numbers : lotto.getNumbers()) { + if (winning.getNumbers().contains(numbers)) { + count++; + } + } + return count; + } } From a493c3d7925ecafadd47e1908507650dd5eec54b Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 16:27:30 +0900 Subject: [PATCH 20/23] =?UTF-8?q?feat:=20=EB=93=B1=EC=88=98=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/domain/LottoPolicy.java | 14 ++++++++++++++ src/main/java/planetlotto/domain/WinningLotto.java | 6 +++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/planetlotto/domain/LottoPolicy.java b/src/main/java/planetlotto/domain/LottoPolicy.java index 8df7716f1..89dde7f03 100644 --- a/src/main/java/planetlotto/domain/LottoPolicy.java +++ b/src/main/java/planetlotto/domain/LottoPolicy.java @@ -10,4 +10,18 @@ public boolean isCorrectUnit(int amount) { public int getPurchaseQuantity(int amount) { return amount / LOTTO_PRICE; } + + public int determineRank(WinningLotto winning, Lotto lotto) { + int count = winning.compareWithWinning(lotto); + if (count == 5) return 1; + if (count == 4) { + if (winning.hasBonus(lotto)) { + return 2; + } + return 3; + } + if (count == 3 && winning.hasBonus(lotto)) return 4; + if (count == 2) return 5; + return 0; + } } diff --git a/src/main/java/planetlotto/domain/WinningLotto.java b/src/main/java/planetlotto/domain/WinningLotto.java index 459252b45..91cb9143f 100644 --- a/src/main/java/planetlotto/domain/WinningLotto.java +++ b/src/main/java/planetlotto/domain/WinningLotto.java @@ -16,7 +16,7 @@ public void setBonus(int bonus) { } } - public int determineRank(Lotto lotto) { + public int compareWithWinning(Lotto lotto) { int count = 0; for (Integer numbers : lotto.getNumbers()) { if (winning.getNumbers().contains(numbers)) { @@ -25,4 +25,8 @@ public int determineRank(Lotto lotto) { } return count; } + + public boolean hasBonus(Lotto lotto) { + return lotto.getNumbers().contains(bonus); + } } From e14218416c7c61c7703b1781d9b78bac789f322e Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 16:38:12 +0900 Subject: [PATCH 21/23] =?UTF-8?q?feat:=20=EB=93=B1=EC=88=98=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- src/main/java/planetlotto/Test.java | 12 ------------ .../planetlotto/controller/LottoController.java | 7 +++++-- .../java/planetlotto/domain/PurchasedLotto.java | 6 +++++- .../java/planetlotto/service/LottoService.java | 15 ++++++++++++++- 5 files changed, 27 insertions(+), 19 deletions(-) delete mode 100644 src/main/java/planetlotto/Test.java diff --git a/README.md b/README.md index 8fcc2bff9..40da805f7 100644 --- a/README.md +++ b/README.md @@ -75,9 +75,9 @@ ### 당첨 통계 출력 비즈니스 - [x] 로또와 당첨번호의 결과를 비교하여 등수를 반환한다. -- [ ] 구매한 로또의 등수를 계산한다. -- [ ] 등수를 저장한다. -- [ ] 결과를 출력한다. +- [x] 구매한 로또의 등수를 계산한다. +- [x] 등수를 저장한다. +- [x] 결과를 출력한다. 입력 요구 -> Map<등수, 당첨개수> countsByRank ### 추가 diff --git a/src/main/java/planetlotto/Test.java b/src/main/java/planetlotto/Test.java deleted file mode 100644 index 7a3ca64bd..000000000 --- a/src/main/java/planetlotto/Test.java +++ /dev/null @@ -1,12 +0,0 @@ -package planetlotto; - -import java.util.List; - -public class Test { - - public static void main(String[] args) { - List list = List.of(1, 2, 3, 4, 5); - List list1 = List.of(1, 2, 3, 4, 5); - System.out.println(list.equals(list1)); - } -} diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index d415f0451..d67f3a316 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -5,6 +5,7 @@ import planetlotto.view.OutputView; import java.util.List; +import java.util.Map; public class LottoController { private LottoService service; @@ -17,10 +18,12 @@ public void run() { purchaseLottos(); setWinningNumbers(); - setBounus(); + setBonus(); + + OutputView.printResult(service.aggregateRank()); } - private void setBounus() { + private void setBonus() { while (true) { try { int bonus = InputView.askBonusNumber(); diff --git a/src/main/java/planetlotto/domain/PurchasedLotto.java b/src/main/java/planetlotto/domain/PurchasedLotto.java index b24df3569..4860460f2 100644 --- a/src/main/java/planetlotto/domain/PurchasedLotto.java +++ b/src/main/java/planetlotto/domain/PurchasedLotto.java @@ -10,11 +10,15 @@ public void addLotto(Lotto lotto) { lottos.add(lotto); } - public List> getLottos() { + public List> getLottostoList() { List> resultLottos = new ArrayList<>(); for (Lotto lotto : lottos) { resultLottos.add(lotto.getNumbers()); } return resultLottos; } + + public List getLottos() { + return lottos; + } } diff --git a/src/main/java/planetlotto/service/LottoService.java b/src/main/java/planetlotto/service/LottoService.java index 09c514340..69918fb50 100644 --- a/src/main/java/planetlotto/service/LottoService.java +++ b/src/main/java/planetlotto/service/LottoService.java @@ -2,7 +2,9 @@ import planetlotto.domain.*; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class LottoService { private LottoPolicy policy; @@ -33,7 +35,7 @@ public void generateLotto() { } public List> getPurchasedLottos() { - return purchased.getLottos(); + return purchased.getLottostoList(); } public void setWinningNumbers(List winningNumbers) { @@ -43,4 +45,15 @@ public void setWinningNumbers(List winningNumbers) { public void setBonus(int bonus) { winning.setBonus(bonus); } + + public Map aggregateRank() { + List lottos = purchased.getLottos(); + Map countByRank = new HashMap<>(); + for (Lotto lotto : lottos) { + int rank = policy.determineRank(winning, lotto); + Integer value = countByRank.getOrDefault(rank, 0); + countByRank.put(rank, ++value); + } + return countByRank; + } } From 0630376bab95084ab2961da080dd9bc47ea9868e Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 16:49:34 +0900 Subject: [PATCH 22/23] =?UTF-8?q?feat:=20=EC=B6=9C=EB=A0=AC=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/planetlotto/controller/LottoController.java | 4 +++- src/main/java/planetlotto/domain/PurchasedLotto.java | 6 +++++- src/main/java/planetlotto/view/InputView.java | 2 +- src/main/java/planetlotto/view/OutputView.java | 7 ++++++- 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 40da805f7..ba5e0fe44 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ 입력 요구 -> Map<등수, 당첨개수> countsByRank ### 추가 -- [ ] 출력 정렬 필요함 +- [x] 출력 정렬 필요함 - [ ] 보너스 번호 검증 안되고 있음. // LottoPolicy에서 체크 어떤지? 도메인 diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index d67f3a316..4792613a1 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -5,7 +5,6 @@ import planetlotto.view.OutputView; import java.util.List; -import java.util.Map; public class LottoController { private LottoService service; @@ -27,6 +26,7 @@ private void setBonus() { while (true) { try { int bonus = InputView.askBonusNumber(); + OutputView.printLienSeparator(); service.setBonus(bonus); } catch (IllegalArgumentException e) { OutputView.printErrorMessage(e.getMessage()); @@ -40,6 +40,7 @@ private void setWinningNumbers() { while (true) { try { List winningNumbers = InputView.askWinningLotto(); + OutputView.printLienSeparator(); service.setWinningNumbers(winningNumbers); } catch (IllegalArgumentException e) { OutputView.printErrorMessage(e.getMessage()); @@ -64,6 +65,7 @@ private int getAmount() { while (true) { try { amount = InputView.askAmount(); + OutputView.printLienSeparator(); service.validateAmount(amount); } catch (IllegalArgumentException e) { OutputView.printErrorMessage(e.getMessage()); diff --git a/src/main/java/planetlotto/domain/PurchasedLotto.java b/src/main/java/planetlotto/domain/PurchasedLotto.java index 4860460f2..6f2df0483 100644 --- a/src/main/java/planetlotto/domain/PurchasedLotto.java +++ b/src/main/java/planetlotto/domain/PurchasedLotto.java @@ -13,7 +13,11 @@ public void addLotto(Lotto lotto) { public List> getLottostoList() { List> resultLottos = new ArrayList<>(); for (Lotto lotto : lottos) { - resultLottos.add(lotto.getNumbers()); + resultLottos.add( + lotto.getNumbers().stream() + .sorted(Integer::compareTo) + .toList() + ); } return resultLottos; } diff --git a/src/main/java/planetlotto/view/InputView.java b/src/main/java/planetlotto/view/InputView.java index c1eb55343..e5ce7d2f4 100644 --- a/src/main/java/planetlotto/view/InputView.java +++ b/src/main/java/planetlotto/view/InputView.java @@ -18,7 +18,7 @@ public static int askAmount() { } public static List askWinningLotto() { - System.out.println("지난 주 당첨 번호를 입력해 주세요."); + System.out.println("당첨 번호를 입력해 주세요."); try { return Arrays.stream(Console.readLine() .split(",")) diff --git a/src/main/java/planetlotto/view/OutputView.java b/src/main/java/planetlotto/view/OutputView.java index 0452898da..507333637 100644 --- a/src/main/java/planetlotto/view/OutputView.java +++ b/src/main/java/planetlotto/view/OutputView.java @@ -8,7 +8,7 @@ public class OutputView { public static void printPurchasedLottos(final List> lottos) { - final String header = String.format("%d개를 구매했습니다.", lottos.size()); + final String header = String.format("%d개를 구매했습니다.\n", lottos.size()); final String output = lottos.stream() .map(Object::toString) .collect(Collectors.joining( @@ -18,6 +18,7 @@ public static void printPurchasedLottos(final List> lottos) { )); System.out.println(output); + System.out.println(); } /** @@ -44,4 +45,8 @@ public static void printResult(final Map countsByRank) { public static void printErrorMessage(final String message) { System.out.printf("[ERROR] %s%n", message); } + + public static void printLienSeparator() { + System.out.println(); + } } From fd386a9556666bf64034fc823c2335e45212f699 Mon Sep 17 00:00:00 2001 From: tjdakf Date: Sat, 10 Jan 2026 16:56:40 +0900 Subject: [PATCH 23/23] =?UTF-8?q?feat:=20=EB=B3=B4=EB=84=88=EC=8A=A4=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=20=EB=B2=94=EC=9C=84=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/planetlotto/domain/WinningLotto.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ba5e0fe44..70c460bcc 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ ### 추가 - [x] 출력 정렬 필요함 -- [ ] 보너스 번호 검증 안되고 있음. // LottoPolicy에서 체크 어떤지? +- [x] 보너스 번호 검증 안되고 있음. // LottoPolicy에서 체크 어떤지? 도메인 - Lotto // 로또, 로또에 사용하는 숫자 검증 diff --git a/src/main/java/planetlotto/domain/WinningLotto.java b/src/main/java/planetlotto/domain/WinningLotto.java index 91cb9143f..0ba363333 100644 --- a/src/main/java/planetlotto/domain/WinningLotto.java +++ b/src/main/java/planetlotto/domain/WinningLotto.java @@ -11,6 +11,10 @@ public void setWinning(List winningNumbers) { } public void setBonus(int bonus) { + if (bonus < 1 || bonus > 30) { + throw new IllegalArgumentException("보너스 번호는 1부터 30 사이의 숫자여야 합니다."); + } + if (winning.getNumbers().contains(bonus)) { throw new IllegalArgumentException("보너스 번호는 당첨 번호와 중복될 수 없습니다."); }