From 6c29f53cb7c4fc06da7805f64eb59b8d5f4e42fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 13:44:02 +0900 Subject: [PATCH 01/36] =?UTF-8?q?docs:=20README=20=EC=9E=91=EC=84=B1=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=EB=AA=A9?= =?UTF-8?q?=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 | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 98 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8a4f22ed0..7cc0b940e 100644 --- a/README.md +++ b/README.md @@ -1 +1,98 @@ -# java-planetlotto-precourse +# ๐Ÿ’ป ์šฐํ…Œ์ฝ” 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) ์ฃผ์š” ๊ธฐ๋Šฅ +- [ ] Lottos ๋„๋ฉ”์ธ ๊ตฌํ˜„ +- [ ] LottoGenerator ๊ตฌํ˜„ +- [ ] Lotto ๋„๋ฉ”์ธ ๊ตฌํ˜„ +- [ ] Rank(Enum) ๊ตฌํ˜„ +- [ ] WinningNumbers ๋„๋ฉ”์ธ ๊ตฌํ˜„ +- [ ] ๋กœ๋˜ ์ƒ์„ฑ ๊ธฐ๋Šฅ ๊ตฌํ˜„ +- [ ] WinCountCalculator ๊ตฌํ˜„(๋กœ๋˜ ๋‹น์ฒจ ํšŸ์ˆ˜ ๊ณ„์‚ฐ) +- [ ] ๋กœ๋˜ ๋‹น์ฒจ ๋‚ด์—ญ ๊ธฐ๋Šฅ ๊ตฌํ˜„ + + +### 3) ์˜ˆ์™ธ ๋ฐ ์ฃผ์˜์‚ฌํ•ญ ์ฒดํฌ +- [ ] ๋กœ๋˜ ๋ฒˆํ˜ธ์˜ ์ˆซ์ž ๋ฒ”์œ„๋Š” 1~30๊นŒ์ง€์ด๋‹ค. +- [ ] 1๊ฐœ์˜ ๋กœ๋˜๋ฅผ ๋ฐœํ–‰ํ•  ๋•Œ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” 5๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋ฝ‘๋Š”๋‹ค. +- [ ] ๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก์„ ์ž…๋ ฅํ•˜๋ฉด ๊ตฌ์ž… ๊ธˆ์•ก์— ํ•ด๋‹นํ•˜๋Š” ๋งŒํผ ๋กœ๋˜๋ฅผ ๋ฐœํ–‰ํ•ด์•ผ ํ•œ๋‹ค. +- [ ] ๋กœ๋˜ 1์žฅ์˜ ๊ฐ€๊ฒฉ์€ 500์›์ด๋‹ค. +- [ ] ์‚ฌ์šฉ์ž๊ฐ€ ์ž˜๋ชป๋œ ๊ฐ’์„ ์ž…๋ ฅํ•  ๊ฒฝ์šฐ IllegalArgumentException๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ , "[ERROR]"๋กœ ์‹œ์ž‘ํ•˜๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅ ํ›„ ๊ทธ ๋ถ€๋ถ„๋ถ€ํ„ฐ ์ž…๋ ฅ์„ ๋‹ค์‹œ ๋ฐ›๋Š”๋‹ค. +- [ ] ๊ตฌ์ž… ๊ธˆ์•ก์€ 1,000์› ๋‹จ์œ„๋กœ ์ž…๋ ฅ ๋ฐ›์œผ๋ฉฐ 1,000์›์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•œ๋‹ค. +- [ ] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ๋ณด์—ฌ์ค€๋‹ค. +- [ ] ์—๋Ÿฌ ๋ฌธ๊ตฌ๋Š” "[ERROR]"๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค. + +### 4) ๋„์ „ ๊ณผ์ œ +- ๊ธฐ๋ณธ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋ชจ๋‘ ์ถฉ์กฑํ•œ ํ›„, ์•„๋ž˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์—ฌ ๋„์ „ํ•˜์„ธ์š”. ๋‹จ, ๋„์ „ ๊ณผ์ œ ์ˆ˜ํ–‰ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์€ ๋ฐ˜๋“œ์‹œ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- ๋„์ „ ๋ฐฉํ–ฅ + -[ ] ๋ฆฌํŒฉํ„ฐ๋ง: ์ž‘๋™์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋†’์ด๋Š” ๋ฐฉํ–ฅ + + +### 5) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ์‚ฌํ•ญ ์ฒดํฌ +- [ ] ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ ์‚ฌํ•ญ์—์„œ ๋‹ฌ๋ฆฌ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š” ํ•œ ํŒŒ์ผ, ํŒจํ‚ค์ง€ ์ด๋ฆ„์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ด๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. +- [ ] ์ž๋ฐ” ์ฝ”๋“œ ์ปจ๋ฒค์…˜์„ ์ง€ํ‚ค๋ฉด์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•œ๋‹ค. +- [ ] ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•ด์•ผ ํ•œ๋‹ค. + + +### 6) ๋ฆฌํŒฉํ† ๋ง +- [ ] ์ฒดํฌ์™„๋ฃŒ + +### 7) ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ๋ชฉ๋ก ์ฒดํฌ +- [ ] ๊ธฐ๋Šฅํ…Œ์ŠคํŠธ: ์ „์ฒด ๊ธฐ๋Šฅ ๊ตฌํ˜„: ("1000", "1,2,3,4,5", "6") ์ž…๋ ฅ ์‹œ ์‹คํ–‰์˜ˆ์‹œ์— ๋งž๊ฒŒ ์ถœ๋ ฅ +- [ ] ์˜ˆ์™ธํ…Œ์ŠคํŠธ: ๊ตฌ์ž…๊ธˆ์•ก("500j") ์ž…๋ ฅ ์‹œ ์—๋Ÿฌ๋ฐœ์ƒ +- [ ] ์—๋Ÿฌ ํ…Œ์ŠคํŠธ: ๋กœ๋˜ ๋ฒˆํ˜ธ์˜ ๊ฐœ์ˆ˜๊ฐ€ 5๊ฐœ๊ฐ€ ๋„˜์–ด๊ฐ€๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ +- [ ] ์—๋Ÿฌ ํ…Œ์ŠคํŠธ: ๋กœ๋˜ ๋ฒˆํ˜ธ์— ์ค‘๋ณต๋œ ์ˆซ์ž๊ฐ€ ์žˆ์œผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ \ No newline at end of file From 0a5a9385adce03a9d020d478394062b0e0641b7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 13:47:40 +0900 Subject: [PATCH 02/36] =?UTF-8?q?feat:=20InputView,=20OutputView=20?= =?UTF-8?q?=EC=9E=85=EC=B6=9C=EB=A0=A5=20=EA=B5=AC=EC=84=B1=EB=B0=A9?= =?UTF-8?q?=EC=8B=9D=20=ED=99=95=EC=9D=B8=20=EB=B0=8F=20=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++---- src/main/java/planetlotto/Application.java | 4 +++- .../planetlotto/controller/MainController.java | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 src/main/java/planetlotto/controller/MainController.java diff --git a/README.md b/README.md index 7cc0b940e..a05dcb8e2 100644 --- a/README.md +++ b/README.md @@ -50,10 +50,10 @@ Console์„ ์ด์šฉํ•˜์—ฌ ์šฐํ…Œ์ฝ” ๋กœ๋˜ ๋ฐœ๋งค๊ธฐ์ธ ํ–‰์„ฑ ๋กœ๋˜๋ฅผ ๊ตฌํ˜„ํ•œ ### 1) ์ž…๋ ฅ ํ๋ฆ„ -- [ ] InputView, OutputView ์ž…์ถœ๋ ฅ ๊ตฌ์„ฑ๋ฐฉ์‹ ํ™•์ธ -- [ ] ๊ตฌ์ž…๊ธˆ์•ก ์ž…๋ ฅ๋ฐ›์•„ ํŒŒ์‹ฑ -- [ ] ๋‹น์ฒจ๋ฒˆํ˜ธ ์ž…๋ ฅ๋ฐ›์•„ ํŒŒ์‹ฑ -- [ ] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ๋ฐ›์•„ ํŒŒ์‹ฑ +- [ ] InputView, OutputView ์ž…์ถœ๋ ฅ ๊ตฌ์„ฑ๋ฐฉ์‹ ํ™•์ธ ๋ฐ ์ดˆ๊ธฐ ํŒจํ‚ค์ง€ ๊ตฌ์„ฑ +- [ ] ๊ตฌ์ž…๊ธˆ์•ก ์ž…๋ ฅ๋ฐ›์€๊ฑฐ ๊ฒ€์ฆ +- [ ] ๋‹น์ฒจ๋ฒˆํ˜ธ ์ž…๋ ฅ๋ฐ›์€๊ฑฐ ๊ฒ€์ฆ +- [ ] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ๋ฐ›์€๊ฑฐ ๊ฒ€์ฆ ### 2) ์ฃผ์š” ๊ธฐ๋Šฅ - [ ] Lottos ๋„๋ฉ”์ธ ๊ตฌํ˜„ diff --git a/src/main/java/planetlotto/Application.java b/src/main/java/planetlotto/Application.java index 27d0a8f96..9365b7444 100644 --- a/src/main/java/planetlotto/Application.java +++ b/src/main/java/planetlotto/Application.java @@ -1,7 +1,9 @@ package planetlotto; +import planetlotto.controller.MainController; + public class Application { public static void main(String[] args) { - // TODO: ํ”„๋กœ๊ทธ๋žจ ๊ตฌํ˜„ + new MainController().run(); } } diff --git a/src/main/java/planetlotto/controller/MainController.java b/src/main/java/planetlotto/controller/MainController.java new file mode 100644 index 000000000..5a76efba1 --- /dev/null +++ b/src/main/java/planetlotto/controller/MainController.java @@ -0,0 +1,14 @@ +package planetlotto.controller; + +import planetlotto.view.InputView; +import planetlotto.view.OutputView; + +public class MainController { + private final InputView inputView = new InputView(); + private final OutputView outputView = new OutputView(); + + + public void run() { + + } +} From a0e3b209bc8e4f3e2c80f2514855898aa6ce8fb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 13:54:17 +0900 Subject: [PATCH 03/36] =?UTF-8?q?feat(support):=20=EA=B5=AC=EC=9E=85?= =?UTF-8?q?=EA=B8=88=EC=95=A1=20=EC=9E=85=EB=A0=A5=EB=B0=9B=EC=9D=80?= =?UTF-8?q?=EA=B1=B0=20=EA=B2=80=EC=A6=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MainController.java | 5 +++-- .../validator/PurchaseAmountValidator.java | 21 +++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 src/main/java/planetlotto/support/validator/PurchaseAmountValidator.java diff --git a/src/main/java/planetlotto/controller/MainController.java b/src/main/java/planetlotto/controller/MainController.java index 5a76efba1..360719c3d 100644 --- a/src/main/java/planetlotto/controller/MainController.java +++ b/src/main/java/planetlotto/controller/MainController.java @@ -1,14 +1,15 @@ package planetlotto.controller; +import planetlotto.support.validator.PurchaseAmountValidator; import planetlotto.view.InputView; import planetlotto.view.OutputView; public class MainController { - private final InputView inputView = new InputView(); - private final OutputView outputView = new OutputView(); public void run() { + int purchaseAmount = InputView.askAmount(); + PurchaseAmountValidator.validate(purchaseAmount); } } diff --git a/src/main/java/planetlotto/support/validator/PurchaseAmountValidator.java b/src/main/java/planetlotto/support/validator/PurchaseAmountValidator.java new file mode 100644 index 000000000..5d842b276 --- /dev/null +++ b/src/main/java/planetlotto/support/validator/PurchaseAmountValidator.java @@ -0,0 +1,21 @@ +package planetlotto.support.validator; + +public class PurchaseAmountValidator { + public static void validate(int purchaseAmount){ + validateNegative(purchaseAmount); + validateFiveHundred(purchaseAmount); + } + + + private static void validateNegative(int amount) { + if (amount < 0) { + throw new IllegalArgumentException("[ERROR] ๊ตฌ์ž… ๊ธˆ์•ก์€ ์Œ์ˆ˜์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."); + } + } + + private static void validateFiveHundred(int amount) { + if (amount % 1000 != 0) { + throw new IllegalArgumentException("[ERROR] ๊ตฌ์ž…๊ธˆ์•ก์€ 500์› ๋‹จ์œ„๋กœ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."); + } + } +} From 5f0ea1eca4483ad08df9f474aabd68217ed31f77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 14:01:01 +0900 Subject: [PATCH 04/36] =?UTF-8?q?feat(support):=20=EB=8B=B9=EC=B2=A8?= =?UTF-8?q?=EB=B2=88=ED=98=B8=20=EC=9E=85=EB=A0=A5=EB=B0=9B=EC=9D=80?= =?UTF-8?q?=EA=B1=B0=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MainController.java | 11 +++--- ...ountValidator.java => PurchaseAmount.java} | 2 +- .../support/validator/WinningNumber.java | 35 +++++++++++++++++++ 3 files changed, 43 insertions(+), 5 deletions(-) rename src/main/java/planetlotto/support/validator/{PurchaseAmountValidator.java => PurchaseAmount.java} (94%) create mode 100644 src/main/java/planetlotto/support/validator/WinningNumber.java diff --git a/src/main/java/planetlotto/controller/MainController.java b/src/main/java/planetlotto/controller/MainController.java index 360719c3d..f733b47c8 100644 --- a/src/main/java/planetlotto/controller/MainController.java +++ b/src/main/java/planetlotto/controller/MainController.java @@ -1,15 +1,18 @@ package planetlotto.controller; -import planetlotto.support.validator.PurchaseAmountValidator; +import planetlotto.support.validator.PurchaseAmount; +import planetlotto.support.validator.WinningNumber; import planetlotto.view.InputView; -import planetlotto.view.OutputView; + +import java.util.List; public class MainController { public void run() { int purchaseAmount = InputView.askAmount(); - PurchaseAmountValidator.validate(purchaseAmount); - + PurchaseAmount.validate(purchaseAmount); //์ž…๋ ฅ ๊ฒ€์ฆ + List WinningNumbers = InputView.askWinningLotto(); + WinningNumber.validate(WinningNumbers); //์ž…๋ ฅ ๊ฒ€์ฆ } } diff --git a/src/main/java/planetlotto/support/validator/PurchaseAmountValidator.java b/src/main/java/planetlotto/support/validator/PurchaseAmount.java similarity index 94% rename from src/main/java/planetlotto/support/validator/PurchaseAmountValidator.java rename to src/main/java/planetlotto/support/validator/PurchaseAmount.java index 5d842b276..b4c8a549c 100644 --- a/src/main/java/planetlotto/support/validator/PurchaseAmountValidator.java +++ b/src/main/java/planetlotto/support/validator/PurchaseAmount.java @@ -1,6 +1,6 @@ package planetlotto.support.validator; -public class PurchaseAmountValidator { +public final class PurchaseAmount { public static void validate(int purchaseAmount){ validateNegative(purchaseAmount); validateFiveHundred(purchaseAmount); diff --git a/src/main/java/planetlotto/support/validator/WinningNumber.java b/src/main/java/planetlotto/support/validator/WinningNumber.java new file mode 100644 index 000000000..51c527c1b --- /dev/null +++ b/src/main/java/planetlotto/support/validator/WinningNumber.java @@ -0,0 +1,35 @@ +package planetlotto.support.validator; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public final class WinningNumber { + + public static void validate(List WinningNumbers){ + validateDuplicate(WinningNumbers); + validateSize(WinningNumbers); + validateRange(WinningNumbers); + } + + private static void validateDuplicate(List result) { + Set set = new HashSet<>(result); + if (set.size() != result.size()) { + throw new IllegalArgumentException("[ERROR] ๋‹น์ฒจ๋ฒˆํ˜ธ์— ์ค‘๋ณต๋˜๋Š” ์ˆซ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค."); + } + } + + private static void validateSize(List result) { + if (result.size() != 6) { + throw new IllegalArgumentException("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 5๊ฐœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } + } + + private static void validateRange(List result){ + for(int number:result) { + if (number < 1 || number > 30) { + throw new IllegalArgumentException("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ์˜ ์ˆซ์ž ๋ฒ”์œ„๋Š” 1~30๊นŒ์ง€์ž…๋‹ˆ๋‹ค."); + } + } + } +} From abdc6cec6f636d64da51e7f1095124037ad5a8bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 14:04:59 +0900 Subject: [PATCH 05/36] =?UTF-8?q?feat(support):=20=EB=B3=B4=EB=84=88?= =?UTF-8?q?=EC=8A=A4=20=EB=B2=88=ED=98=B8=20=EC=9E=85=EB=A0=A5=EB=B0=9B?= =?UTF-8?q?=EC=9D=80=EA=B1=B0=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/controller/MainController.java | 7 +++++-- .../java/planetlotto/support/validator/BonusNumber.java | 9 +++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 src/main/java/planetlotto/support/validator/BonusNumber.java diff --git a/src/main/java/planetlotto/controller/MainController.java b/src/main/java/planetlotto/controller/MainController.java index f733b47c8..3f4589191 100644 --- a/src/main/java/planetlotto/controller/MainController.java +++ b/src/main/java/planetlotto/controller/MainController.java @@ -1,5 +1,6 @@ package planetlotto.controller; +import planetlotto.support.validator.BonusNumber; import planetlotto.support.validator.PurchaseAmount; import planetlotto.support.validator.WinningNumber; import planetlotto.view.InputView; @@ -12,7 +13,9 @@ public class MainController { public void run() { int purchaseAmount = InputView.askAmount(); PurchaseAmount.validate(purchaseAmount); //์ž…๋ ฅ ๊ฒ€์ฆ - List WinningNumbers = InputView.askWinningLotto(); - WinningNumber.validate(WinningNumbers); //์ž…๋ ฅ ๊ฒ€์ฆ + List winningNumbers = InputView.askWinningLotto(); + WinningNumber.validate(winningNumbers); //์ž…๋ ฅ ๊ฒ€์ฆ + int bonusNumber = InputView.askBonusNumber(); + BonusNumber.validate(bonusNumber); //์ž…๋ ฅ ๊ฒ€์ฆ } } diff --git a/src/main/java/planetlotto/support/validator/BonusNumber.java b/src/main/java/planetlotto/support/validator/BonusNumber.java new file mode 100644 index 000000000..50b7c082a --- /dev/null +++ b/src/main/java/planetlotto/support/validator/BonusNumber.java @@ -0,0 +1,9 @@ +package planetlotto.support.validator; + +public final class BonusNumber { + public static void validate(int bonus){ + if (bonus < 1 || bonus > 30) { + throw new IllegalArgumentException("[ERROR] ๋ณด๋„ˆ์Šค ์ˆซ์ž๋Š” 1์—์„œ 30 ์‚ฌ์ด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } + } +} From 0df1a5293be35e0897940dfe332007d14f9c9926 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 14:09:33 +0900 Subject: [PATCH 06/36] =?UTF-8?q?feat(domain):=20Lotto=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=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 +- .../controller/MainController.java | 2 + src/main/java/planetlotto/domain/Lotto.java | 44 +++++++++++++++++++ 3 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 src/main/java/planetlotto/domain/Lotto.java diff --git a/README.md b/README.md index a05dcb8e2..fe685b674 100644 --- a/README.md +++ b/README.md @@ -56,9 +56,9 @@ Console์„ ์ด์šฉํ•˜์—ฌ ์šฐํ…Œ์ฝ” ๋กœ๋˜ ๋ฐœ๋งค๊ธฐ์ธ ํ–‰์„ฑ ๋กœ๋˜๋ฅผ ๊ตฌํ˜„ํ•œ - [ ] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ๋ฐ›์€๊ฑฐ ๊ฒ€์ฆ ### 2) ์ฃผ์š” ๊ธฐ๋Šฅ -- [ ] Lottos ๋„๋ฉ”์ธ ๊ตฌํ˜„ -- [ ] LottoGenerator ๊ตฌํ˜„ - [ ] Lotto ๋„๋ฉ”์ธ ๊ตฌํ˜„ +- [ ] Lottos ์ด์ฐจ์› Integer ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ›๊ธฐ +- [ ] LottoGenerator ๊ตฌํ˜„ - [ ] Rank(Enum) ๊ตฌํ˜„ - [ ] WinningNumbers ๋„๋ฉ”์ธ ๊ตฌํ˜„ - [ ] ๋กœ๋˜ ์ƒ์„ฑ ๊ธฐ๋Šฅ ๊ตฌํ˜„ diff --git a/src/main/java/planetlotto/controller/MainController.java b/src/main/java/planetlotto/controller/MainController.java index 3f4589191..fe0f9205a 100644 --- a/src/main/java/planetlotto/controller/MainController.java +++ b/src/main/java/planetlotto/controller/MainController.java @@ -17,5 +17,7 @@ public void run() { WinningNumber.validate(winningNumbers); //์ž…๋ ฅ ๊ฒ€์ฆ int bonusNumber = InputView.askBonusNumber(); BonusNumber.validate(bonusNumber); //์ž…๋ ฅ ๊ฒ€์ฆ + + } } diff --git a/src/main/java/planetlotto/domain/Lotto.java b/src/main/java/planetlotto/domain/Lotto.java new file mode 100644 index 000000000..b4dfe9ecd --- /dev/null +++ b/src/main/java/planetlotto/domain/Lotto.java @@ -0,0 +1,44 @@ +package planetlotto.domain; + +import java.util.*; + +public class Lotto { + private final List numbers; + + public Lotto(List numbers) { + validate(numbers); + this.numbers = toSortedUnmodifiable(numbers); + } + + private void validate(List numbers) { + if (numbers == null) { + throw new IllegalArgumentException("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ ๋ชฉ๋ก์ด null์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."); + } + + if (numbers.size() != 5) { + throw new IllegalArgumentException("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ์˜ ๊ฐœ์ˆ˜๋Š” 5๊ฐœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } + for (Integer n : numbers) { + if (n < 1 || n > 30) { + throw new IllegalArgumentException("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ์˜ ์ˆซ์ž ๋ฒ”์œ„๋Š” 1~30๊นŒ์ง€์ž…๋‹ˆ๋‹ค."); + } + } + + Set set = new HashSet<>(numbers); + if (set.size() != numbers.size()) { + throw new IllegalArgumentException("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” ์ค‘๋ณต๋  ์ˆ˜ ์—†๋‹ค."); + } + } + + + private List toSortedUnmodifiable(List numbers) { + List copy = new ArrayList<>(numbers); + Collections.sort(copy); + return Collections.unmodifiableList(copy); + } + + public List getNumbers() { + return numbers; + } + +} From 528c42de856b456be08be987b0338b204e3dd6a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 14:18:08 +0900 Subject: [PATCH 07/36] =?UTF-8?q?feat(domain):=20Lottos=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/domain/Lottos.java | 24 ++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/planetlotto/domain/Lottos.java diff --git a/src/main/java/planetlotto/domain/Lottos.java b/src/main/java/planetlotto/domain/Lottos.java new file mode 100644 index 000000000..852e3567b --- /dev/null +++ b/src/main/java/planetlotto/domain/Lottos.java @@ -0,0 +1,24 @@ +package planetlotto.domain; + +import java.util.List; +import java.util.stream.Collectors; + +public class Lottos { + + public List lottos; + + public Lottos(List lottos) { + this.lottos = lottos; + } + + + public int size() { + return lottos.size(); + } + + public List> getLottosAs2DList() { + return lottos.stream() + .map(Lotto::getNumbers) // Lotto ๊ฐ์ฒด์˜ getNumbers() ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ + .collect(Collectors.toList()); + } +} From 68e11091cd6ddc57701688939060373cd15d6470 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 14:18:28 +0900 Subject: [PATCH 08/36] =?UTF-8?q?feat(domain):=20LottoGenerator=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../planetlotto/domain/LottoGenerator.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/java/planetlotto/domain/LottoGenerator.java diff --git a/src/main/java/planetlotto/domain/LottoGenerator.java b/src/main/java/planetlotto/domain/LottoGenerator.java new file mode 100644 index 000000000..8563bbfed --- /dev/null +++ b/src/main/java/planetlotto/domain/LottoGenerator.java @@ -0,0 +1,18 @@ +package planetlotto.domain; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.List; + +public class LottoGenerator { + + public Lottos generate(long count) { + List lottos = new ArrayList<>(); + for (int i = 0; i < count; i++) { + List numbers = Randoms.pickUniqueNumbersInRange(1, 30, 5); + lottos.add(new Lotto(numbers)); + } + return new Lottos(lottos); + } +} From c0c5ad2e143bf3b46b45dcd3f79902553b4833da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 14:22:18 +0900 Subject: [PATCH 09/36] =?UTF-8?q?feat(domain):=20Rank(Enum)=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/domain/Rank.java | 52 ++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/main/java/planetlotto/domain/Rank.java diff --git a/src/main/java/planetlotto/domain/Rank.java b/src/main/java/planetlotto/domain/Rank.java new file mode 100644 index 000000000..ffe630029 --- /dev/null +++ b/src/main/java/planetlotto/domain/Rank.java @@ -0,0 +1,52 @@ +package planetlotto.domain; + +public enum Rank { + + FIRST(5, false, 100_000_000L), + SECOND(4, true, 10_000_000L), + THIRD(4, false, 1_500_000L), + FOURTH(3, true, 500_000L), + FIFTH(2, true, 5_000L), + NONE(0, false, 0L); + + final int matchCount; + final boolean isBonus; + final long prize; + + Rank(int matchCount, boolean isBonus, long prize) { + this.matchCount = matchCount; + this.isBonus = isBonus; + this.prize = prize; + } + + public int getMatchCount() { + return matchCount; + } + + public boolean getIsBonus() { + return isBonus; + } + + public long getPrize() { + return prize; + } + + public static Rank of(int matchCount, boolean isBonus) { + if (matchCount == 5) { + return FIRST; + } + if (matchCount == 4 && isBonus) { + return SECOND; + } + if (matchCount == 4) { + return THIRD; + } + if (matchCount == 3 && isBonus) { + return FOURTH; + } + if (matchCount == 2 && isBonus) { + return FIFTH; + } + return NONE; + } +} From b20bc547809be63b06511e9951fea3afe2e85b69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 14:23:38 +0900 Subject: [PATCH 10/36] =?UTF-8?q?feat(domain):=20WinningNumbers=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../planetlotto/domain/WinningNumbers.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/planetlotto/domain/WinningNumbers.java diff --git a/src/main/java/planetlotto/domain/WinningNumbers.java b/src/main/java/planetlotto/domain/WinningNumbers.java new file mode 100644 index 000000000..042ba0438 --- /dev/null +++ b/src/main/java/planetlotto/domain/WinningNumbers.java @@ -0,0 +1,22 @@ +package planetlotto.domain; + +import java.util.List; + +public class WinningNumbers { + + private final List numbers; + private final int bonusNum; + + public WinningNumbers(List numbers, int bonusNum) { + this.numbers = numbers; + this.bonusNum = bonusNum; + } + + public List getNumbers() { + return numbers; + } + + public int getBonusNum() { + return bonusNum; + } +} From 9629659cdadd6ae1e7d95830b4b821a785945813 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 14:31:53 +0900 Subject: [PATCH 11/36] =?UTF-8?q?feat(domain):=20WinCountCalculator=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84(=EB=A1=9C=EB=98=90=20=EB=8B=B9=EC=B2=A8=20?= =?UTF-8?q?=ED=9A=9F=EC=88=98=20=EA=B3=84=EC=82=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/WinCountCalculator.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/planetlotto/domain/WinCountCalculator.java diff --git a/src/main/java/planetlotto/domain/WinCountCalculator.java b/src/main/java/planetlotto/domain/WinCountCalculator.java new file mode 100644 index 000000000..0d851849c --- /dev/null +++ b/src/main/java/planetlotto/domain/WinCountCalculator.java @@ -0,0 +1,24 @@ +package planetlotto.domain; + +import java.util.*; + +public class WinCountCalculator { + + Map ranks; + + public Map calculate(Lottos lottos, WinningNumbers winningNumbers) { + List winning = winningNumbers.getNumbers(); + Map ranks = new EnumMap<>(Rank.class); + + for (Lotto lotto : lottos.getLottos()) { + List lott = lotto.getNumbers(); + Set intersection = new HashSet<>(winning); + intersection.retainAll(lott); + int matchCount = intersection.size(); + boolean isBonus = lott.contains(winningNumbers.getBonusNum()); + Rank rank = Rank.of(matchCount, isBonus); + ranks.put(rank, ranks.getOrDefault(rank, 0) + 1); + } + return ranks; + } +} From 3c7ae1c6ca98f8403fa7a88565cb22e34345b3af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 14:33:02 +0900 Subject: [PATCH 12/36] =?UTF-8?q?feat(controller):=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=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 --- src/main/java/planetlotto/controller/MainController.java | 8 ++++++++ src/main/java/planetlotto/domain/Lottos.java | 4 ++++ .../java/planetlotto/support/validator/WinningNumber.java | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/planetlotto/controller/MainController.java b/src/main/java/planetlotto/controller/MainController.java index fe0f9205a..482d215f0 100644 --- a/src/main/java/planetlotto/controller/MainController.java +++ b/src/main/java/planetlotto/controller/MainController.java @@ -1,18 +1,26 @@ package planetlotto.controller; +import planetlotto.domain.LottoGenerator; +import planetlotto.domain.Lottos; import planetlotto.support.validator.BonusNumber; import planetlotto.support.validator.PurchaseAmount; import planetlotto.support.validator.WinningNumber; import planetlotto.view.InputView; +import planetlotto.view.OutputView; import java.util.List; public class MainController { + private final LottoGenerator lottoGenerator = new LottoGenerator(); public void run() { int purchaseAmount = InputView.askAmount(); PurchaseAmount.validate(purchaseAmount); //์ž…๋ ฅ ๊ฒ€์ฆ + + Lottos lottos = lottoGenerator.generate(purchaseAmount / 500); + OutputView.printPurchasedLottos(lottos.getLottosAs2DList()); + List winningNumbers = InputView.askWinningLotto(); WinningNumber.validate(winningNumbers); //์ž…๋ ฅ ๊ฒ€์ฆ int bonusNumber = InputView.askBonusNumber(); diff --git a/src/main/java/planetlotto/domain/Lottos.java b/src/main/java/planetlotto/domain/Lottos.java index 852e3567b..24ce92060 100644 --- a/src/main/java/planetlotto/domain/Lottos.java +++ b/src/main/java/planetlotto/domain/Lottos.java @@ -21,4 +21,8 @@ public List> getLottosAs2DList() { .map(Lotto::getNumbers) // Lotto ๊ฐ์ฒด์˜ getNumbers() ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ .collect(Collectors.toList()); } + + public List getLottos() { + return lottos; + } } diff --git a/src/main/java/planetlotto/support/validator/WinningNumber.java b/src/main/java/planetlotto/support/validator/WinningNumber.java index 51c527c1b..759eaf03f 100644 --- a/src/main/java/planetlotto/support/validator/WinningNumber.java +++ b/src/main/java/planetlotto/support/validator/WinningNumber.java @@ -20,7 +20,7 @@ private static void validateDuplicate(List result) { } private static void validateSize(List result) { - if (result.size() != 6) { + if (result.size() != 5) { throw new IllegalArgumentException("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 5๊ฐœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); } } From 50266b6895cde505570239e0f01cd82ad927b803 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 14:47:13 +0900 Subject: [PATCH 13/36] =?UTF-8?q?feat(domain):=20WinningDetailsCalculator?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ๋กœ๋˜ ๋‹น์ฒจ ๋‚ด์—ญ ๊ธฐ๋Šฅ ๊ตฌํ˜„ --- .../domain/WinningDetailsCalculator.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/java/planetlotto/domain/WinningDetailsCalculator.java diff --git a/src/main/java/planetlotto/domain/WinningDetailsCalculator.java b/src/main/java/planetlotto/domain/WinningDetailsCalculator.java new file mode 100644 index 000000000..84101ca17 --- /dev/null +++ b/src/main/java/planetlotto/domain/WinningDetailsCalculator.java @@ -0,0 +1,18 @@ +package planetlotto.domain; + +import java.util.HashMap; +import java.util.Map; + +public class WinningDetailsCalculator { + + public Map calculate(Map ranks){ + Map countsByRank = new HashMap<>(); + countsByRank.put(1,ranks.getOrDefault(Rank.FIRST,0)); + countsByRank.put(2, ranks.getOrDefault(Rank.SECOND, 0)); + countsByRank.put(3, ranks.getOrDefault(Rank.THIRD, 0)); + countsByRank.put(4, ranks.getOrDefault(Rank.FOURTH, 0)); + countsByRank.put(5, ranks.getOrDefault(Rank.FIFTH, 0)); + + return countsByRank; + } +} From 515ea93c6071c26700c60a6284efa77be39630fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 14:58:37 +0900 Subject: [PATCH 14/36] =?UTF-8?q?fix(domain):=20WinningDetailsCalculator?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 0๊ฐœ๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋น ๋œจ๋ ค์„œ ์ˆ˜์ •ํ•จ. --- .../controller/MainController.java | 64 ++++++++++++++++--- .../domain/WinningDetailsCalculator.java | 1 + 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/src/main/java/planetlotto/controller/MainController.java b/src/main/java/planetlotto/controller/MainController.java index 482d215f0..19d360899 100644 --- a/src/main/java/planetlotto/controller/MainController.java +++ b/src/main/java/planetlotto/controller/MainController.java @@ -1,7 +1,6 @@ package planetlotto.controller; -import planetlotto.domain.LottoGenerator; -import planetlotto.domain.Lottos; +import planetlotto.domain.*; import planetlotto.support.validator.BonusNumber; import planetlotto.support.validator.PurchaseAmount; import planetlotto.support.validator.WinningNumber; @@ -9,23 +8,70 @@ import planetlotto.view.OutputView; import java.util.List; +import java.util.Map; public class MainController { private final LottoGenerator lottoGenerator = new LottoGenerator(); - + private final WinCountCalculator winCountCalculator = new WinCountCalculator(); + private final WinningDetailsCalculator winningDetailsCalculator = new WinningDetailsCalculator(); public void run() { - int purchaseAmount = InputView.askAmount(); - PurchaseAmount.validate(purchaseAmount); //์ž…๋ ฅ ๊ฒ€์ฆ + int purchaseAmount = readPurchaseAmountWithRetry(); Lottos lottos = lottoGenerator.generate(purchaseAmount / 500); OutputView.printPurchasedLottos(lottos.getLottosAs2DList()); - List winningNumbers = InputView.askWinningLotto(); - WinningNumber.validate(winningNumbers); //์ž…๋ ฅ ๊ฒ€์ฆ - int bonusNumber = InputView.askBonusNumber(); - BonusNumber.validate(bonusNumber); //์ž…๋ ฅ ๊ฒ€์ฆ + List winning = readWinningNumbersWithRetry(); + + int bonusNumber = readBonusNumberWithRetry(); + + WinningNumbers winningNumbers = new WinningNumbers(winning, bonusNumber); + + + Map ranks = winCountCalculator.calculate(lottos, winningNumbers); + + Map countsByrank = winningDetailsCalculator.calculate(ranks); + + OutputView.printResult(countsByrank); + + + } + + + private int readPurchaseAmountWithRetry() { + while (true) { + try { + int purchaseAmount = InputView.askAmount(); + PurchaseAmount.validate(purchaseAmount); + return purchaseAmount; + } catch (IllegalArgumentException e) { + OutputView.printErrorMessage(e.getMessage()); } + } + } + + private List readWinningNumbersWithRetry() { + while (true) { + try { + List winning = InputView.askWinningLotto(); + WinningNumber.validate(winning); //์ž…๋ ฅ ๊ฒ€์ฆ + + return winning; + } catch (IllegalArgumentException e) { + OutputView.printErrorMessage(e.getMessage()); + } + } + } + private int readBonusNumberWithRetry() { + while (true) { + try { + int bonusNumber = InputView.askBonusNumber(); + BonusNumber.validate(bonusNumber); //์ž…๋ ฅ ๊ฒ€์ฆ + return bonusNumber; + } catch (IllegalArgumentException e) { + OutputView.printErrorMessage(e.getMessage()); + } + } } } diff --git a/src/main/java/planetlotto/domain/WinningDetailsCalculator.java b/src/main/java/planetlotto/domain/WinningDetailsCalculator.java index 84101ca17..6cb3d0094 100644 --- a/src/main/java/planetlotto/domain/WinningDetailsCalculator.java +++ b/src/main/java/planetlotto/domain/WinningDetailsCalculator.java @@ -12,6 +12,7 @@ public Map calculate(Map ranks){ countsByRank.put(3, ranks.getOrDefault(Rank.THIRD, 0)); countsByRank.put(4, ranks.getOrDefault(Rank.FOURTH, 0)); countsByRank.put(5, ranks.getOrDefault(Rank.FIFTH, 0)); + countsByRank.put(0, ranks.getOrDefault(Rank.NONE, 0)); return countsByRank; } From bd5f1bc645804abcbb0d2d4c9e6508993ea50e9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 15:00:58 +0900 Subject: [PATCH 15/36] =?UTF-8?q?fix(support):=20validateFiveHundred=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 1000๋‹จ์œ„๋กœ ๊ฒ€์ฆํ•˜๋˜๊ฑฐ 500๋‹จ์œ„๋กœ ์ˆ˜์ • --- src/main/java/planetlotto/support/validator/PurchaseAmount.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/planetlotto/support/validator/PurchaseAmount.java b/src/main/java/planetlotto/support/validator/PurchaseAmount.java index b4c8a549c..11adc6e8b 100644 --- a/src/main/java/planetlotto/support/validator/PurchaseAmount.java +++ b/src/main/java/planetlotto/support/validator/PurchaseAmount.java @@ -14,7 +14,7 @@ private static void validateNegative(int amount) { } private static void validateFiveHundred(int amount) { - if (amount % 1000 != 0) { + if (amount % 500 != 0) { throw new IllegalArgumentException("[ERROR] ๊ตฌ์ž…๊ธˆ์•ก์€ 500์› ๋‹จ์œ„๋กœ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."); } } From 32a288fcd2c321e1cf2668a53bbc2c31f5bd1233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 15:15:35 +0900 Subject: [PATCH 16/36] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EA=B0=B1=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 55 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index fe685b674..f8bed232e 100644 --- a/README.md +++ b/README.md @@ -50,49 +50,50 @@ Console์„ ์ด์šฉํ•˜์—ฌ ์šฐํ…Œ์ฝ” ๋กœ๋˜ ๋ฐœ๋งค๊ธฐ์ธ ํ–‰์„ฑ ๋กœ๋˜๋ฅผ ๊ตฌํ˜„ํ•œ ### 1) ์ž…๋ ฅ ํ๋ฆ„ -- [ ] InputView, OutputView ์ž…์ถœ๋ ฅ ๊ตฌ์„ฑ๋ฐฉ์‹ ํ™•์ธ ๋ฐ ์ดˆ๊ธฐ ํŒจํ‚ค์ง€ ๊ตฌ์„ฑ -- [ ] ๊ตฌ์ž…๊ธˆ์•ก ์ž…๋ ฅ๋ฐ›์€๊ฑฐ ๊ฒ€์ฆ -- [ ] ๋‹น์ฒจ๋ฒˆํ˜ธ ์ž…๋ ฅ๋ฐ›์€๊ฑฐ ๊ฒ€์ฆ -- [ ] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ๋ฐ›์€๊ฑฐ ๊ฒ€์ฆ +- [x] InputView, OutputView ์ž…์ถœ๋ ฅ ๊ตฌ์„ฑ๋ฐฉ์‹ ํ™•์ธ ๋ฐ ์ดˆ๊ธฐ ํŒจํ‚ค์ง€ ๊ตฌ์„ฑ +- [x] ๊ตฌ์ž…๊ธˆ์•ก ์ž…๋ ฅ๋ฐ›์€๊ฑฐ ๊ฒ€์ฆ +- [x] ๋‹น์ฒจ๋ฒˆํ˜ธ ์ž…๋ ฅ๋ฐ›์€๊ฑฐ ๊ฒ€์ฆ +- [x] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ๋ฐ›์€๊ฑฐ ๊ฒ€์ฆ ### 2) ์ฃผ์š” ๊ธฐ๋Šฅ -- [ ] Lotto ๋„๋ฉ”์ธ ๊ตฌํ˜„ -- [ ] Lottos ์ด์ฐจ์› Integer ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ›๊ธฐ -- [ ] LottoGenerator ๊ตฌํ˜„ -- [ ] Rank(Enum) ๊ตฌํ˜„ -- [ ] WinningNumbers ๋„๋ฉ”์ธ ๊ตฌํ˜„ -- [ ] ๋กœ๋˜ ์ƒ์„ฑ ๊ธฐ๋Šฅ ๊ตฌํ˜„ -- [ ] WinCountCalculator ๊ตฌํ˜„(๋กœ๋˜ ๋‹น์ฒจ ํšŸ์ˆ˜ ๊ณ„์‚ฐ) -- [ ] ๋กœ๋˜ ๋‹น์ฒจ ๋‚ด์—ญ ๊ธฐ๋Šฅ ๊ตฌํ˜„ +- [x] Lotto ๋„๋ฉ”์ธ ๊ตฌํ˜„ +- [x] Lottos ๋„๋ฉ”์ธ ๊ตฌํ˜„ +- [x] LottoGenerator ๊ตฌํ˜„ +- [x] Rank(Enum) ๊ตฌํ˜„ +- [x] WinningNumbers ๋„๋ฉ”์ธ ๊ตฌํ˜„ +- [x] ๋กœ๋˜ ์ƒ์„ฑ ๊ธฐ๋Šฅ ๊ตฌํ˜„ +- [x] WinCountCalculator ๊ตฌํ˜„(๋กœ๋˜ ๋‹น์ฒจ ํšŸ์ˆ˜ ๊ณ„์‚ฐ) +- [x] ๋กœ๋˜ ๋‹น์ฒจ ๋‚ด์—ญ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ### 3) ์˜ˆ์™ธ ๋ฐ ์ฃผ์˜์‚ฌํ•ญ ์ฒดํฌ -- [ ] ๋กœ๋˜ ๋ฒˆํ˜ธ์˜ ์ˆซ์ž ๋ฒ”์œ„๋Š” 1~30๊นŒ์ง€์ด๋‹ค. -- [ ] 1๊ฐœ์˜ ๋กœ๋˜๋ฅผ ๋ฐœํ–‰ํ•  ๋•Œ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” 5๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋ฝ‘๋Š”๋‹ค. -- [ ] ๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก์„ ์ž…๋ ฅํ•˜๋ฉด ๊ตฌ์ž… ๊ธˆ์•ก์— ํ•ด๋‹นํ•˜๋Š” ๋งŒํผ ๋กœ๋˜๋ฅผ ๋ฐœํ–‰ํ•ด์•ผ ํ•œ๋‹ค. -- [ ] ๋กœ๋˜ 1์žฅ์˜ ๊ฐ€๊ฒฉ์€ 500์›์ด๋‹ค. -- [ ] ์‚ฌ์šฉ์ž๊ฐ€ ์ž˜๋ชป๋œ ๊ฐ’์„ ์ž…๋ ฅํ•  ๊ฒฝ์šฐ IllegalArgumentException๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ , "[ERROR]"๋กœ ์‹œ์ž‘ํ•˜๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅ ํ›„ ๊ทธ ๋ถ€๋ถ„๋ถ€ํ„ฐ ์ž…๋ ฅ์„ ๋‹ค์‹œ ๋ฐ›๋Š”๋‹ค. -- [ ] ๊ตฌ์ž… ๊ธˆ์•ก์€ 1,000์› ๋‹จ์œ„๋กœ ์ž…๋ ฅ ๋ฐ›์œผ๋ฉฐ 1,000์›์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•œ๋‹ค. -- [ ] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ๋ณด์—ฌ์ค€๋‹ค. -- [ ] ์—๋Ÿฌ ๋ฌธ๊ตฌ๋Š” "[ERROR]"๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค. +- [x] ๋กœ๋˜ ๋ฒˆํ˜ธ์˜ ์ˆซ์ž ๋ฒ”์œ„๋Š” 1~30๊นŒ์ง€์ด๋‹ค. +- [x] 1๊ฐœ์˜ ๋กœ๋˜๋ฅผ ๋ฐœํ–‰ํ•  ๋•Œ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” 5๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋ฝ‘๋Š”๋‹ค. +- [x] ๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก์„ ์ž…๋ ฅํ•˜๋ฉด ๊ตฌ์ž… ๊ธˆ์•ก์— ํ•ด๋‹นํ•˜๋Š” ๋งŒํผ ๋กœ๋˜๋ฅผ ๋ฐœํ–‰ํ•ด์•ผ ํ•œ๋‹ค. +- [x] ๋กœ๋˜ 1์žฅ์˜ ๊ฐ€๊ฒฉ์€ 500์›์ด๋‹ค. +- [x] ์‚ฌ์šฉ์ž๊ฐ€ ์ž˜๋ชป๋œ ๊ฐ’์„ ์ž…๋ ฅํ•  ๊ฒฝ์šฐ IllegalArgumentException๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ , "[ERROR]"๋กœ ์‹œ์ž‘ํ•˜๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅ ํ›„ ๊ทธ ๋ถ€๋ถ„๋ถ€ํ„ฐ ์ž…๋ ฅ์„ ๋‹ค์‹œ ๋ฐ›๋Š”๋‹ค. +- [x] ๊ตฌ์ž… ๊ธˆ์•ก์€ 500์› ๋‹จ์œ„๋กœ ์ž…๋ ฅ ๋ฐ›์œผ๋ฉฐ 500์›์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•œ๋‹ค. +- [x] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ๋ณด์—ฌ์ค€๋‹ค. +- [x] ์—๋Ÿฌ ๋ฌธ๊ตฌ๋Š” "[ERROR]"๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค. ### 4) ๋„์ „ ๊ณผ์ œ - ๊ธฐ๋ณธ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋ชจ๋‘ ์ถฉ์กฑํ•œ ํ›„, ์•„๋ž˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์—ฌ ๋„์ „ํ•˜์„ธ์š”. ๋‹จ, ๋„์ „ ๊ณผ์ œ ์ˆ˜ํ–‰ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์€ ๋ฐ˜๋“œ์‹œ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. - ๋„์ „ ๋ฐฉํ–ฅ -[ ] ๋ฆฌํŒฉํ„ฐ๋ง: ์ž‘๋™์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋†’์ด๋Š” ๋ฐฉํ–ฅ +### 6) ๋ฆฌํŒฉํ† ๋ง +- [ ] ์ฒดํฌ์™„๋ฃŒ ### 5) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ์‚ฌํ•ญ ์ฒดํฌ -- [ ] ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ ์‚ฌํ•ญ์—์„œ ๋‹ฌ๋ฆฌ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š” ํ•œ ํŒŒ์ผ, ํŒจํ‚ค์ง€ ์ด๋ฆ„์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ด๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. -- [ ] ์ž๋ฐ” ์ฝ”๋“œ ์ปจ๋ฒค์…˜์„ ์ง€ํ‚ค๋ฉด์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•œ๋‹ค. -- [ ] ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•ด์•ผ ํ•œ๋‹ค. +- [x] ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ ์‚ฌํ•ญ์—์„œ ๋‹ฌ๋ฆฌ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š” ํ•œ ํŒŒ์ผ, ํŒจํ‚ค์ง€ ์ด๋ฆ„์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ด๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. +- [x] ์ž๋ฐ” ์ฝ”๋“œ ์ปจ๋ฒค์…˜์„ ์ง€ํ‚ค๋ฉด์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•œ๋‹ค. +- [x] ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•ด์•ผ ํ•œ๋‹ค. + -### 6) ๋ฆฌํŒฉํ† ๋ง -- [ ] ์ฒดํฌ์™„๋ฃŒ ### 7) ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ๋ชฉ๋ก ์ฒดํฌ -- [ ] ๊ธฐ๋Šฅํ…Œ์ŠคํŠธ: ์ „์ฒด ๊ธฐ๋Šฅ ๊ตฌํ˜„: ("1000", "1,2,3,4,5", "6") ์ž…๋ ฅ ์‹œ ์‹คํ–‰์˜ˆ์‹œ์— ๋งž๊ฒŒ ์ถœ๋ ฅ -- [ ] ์˜ˆ์™ธํ…Œ์ŠคํŠธ: ๊ตฌ์ž…๊ธˆ์•ก("500j") ์ž…๋ ฅ ์‹œ ์—๋Ÿฌ๋ฐœ์ƒ +- [x] ๊ธฐ๋Šฅํ…Œ์ŠคํŠธ: ์ „์ฒด ๊ธฐ๋Šฅ ๊ตฌํ˜„: ("1000", "1,2,3,4,5", "6") ์ž…๋ ฅ ์‹œ ์‹คํ–‰์˜ˆ์‹œ์— ๋งž๊ฒŒ ์ถœ๋ ฅ +- [x] ์˜ˆ์™ธํ…Œ์ŠคํŠธ: ๊ตฌ์ž…๊ธˆ์•ก("500j") ์ž…๋ ฅ ์‹œ ์—๋Ÿฌ๋ฐœ์ƒ - [ ] ์—๋Ÿฌ ํ…Œ์ŠคํŠธ: ๋กœ๋˜ ๋ฒˆํ˜ธ์˜ ๊ฐœ์ˆ˜๊ฐ€ 5๊ฐœ๊ฐ€ ๋„˜์–ด๊ฐ€๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ - [ ] ์—๋Ÿฌ ํ…Œ์ŠคํŠธ: ๋กœ๋˜ ๋ฒˆํ˜ธ์— ์ค‘๋ณต๋œ ์ˆซ์ž๊ฐ€ ์žˆ์œผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ \ No newline at end of file From 1a317ee2e9498ac5c5c4a58578f223217606740e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 15:19:09 +0900 Subject: [PATCH 17/36] =?UTF-8?q?refactor(domain)=20:=20Lotto=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=EC=97=90=EC=84=9C=20validate=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=20=EB=A9=94=EC=84=9C=EB=93=9C=EB=A1=9C=20=EC=B6=94?= =?UTF-8?q?=EC=B6=9C=ED=95=98=EC=97=AC=20=EA=B0=80=EB=8F=85=EC=84=B1=20?= =?UTF-8?q?=ED=96=A5=EC=83=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - validateNull(numbers); - validateSize(numbers); - validateRange(numbers); - validateDuplicate(numbers); --- src/main/java/planetlotto/domain/Lotto.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/planetlotto/domain/Lotto.java b/src/main/java/planetlotto/domain/Lotto.java index b4dfe9ecd..67f48c417 100644 --- a/src/main/java/planetlotto/domain/Lotto.java +++ b/src/main/java/planetlotto/domain/Lotto.java @@ -11,19 +11,33 @@ public Lotto(List numbers) { } private void validate(List numbers) { + validateNull(numbers); + validateSize(numbers); + validateRange(numbers); + validateDuplicate(numbers); + } + private static void validateNull(List numbers) { if (numbers == null) { throw new IllegalArgumentException("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ ๋ชฉ๋ก์ด null์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."); } + } + + private static void validateSize(List numbers) { if (numbers.size() != 5) { throw new IllegalArgumentException("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ์˜ ๊ฐœ์ˆ˜๋Š” 5๊ฐœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); } + } + + private static void validateRange(List numbers) { for (Integer n : numbers) { if (n < 1 || n > 30) { throw new IllegalArgumentException("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ์˜ ์ˆซ์ž ๋ฒ”์œ„๋Š” 1~30๊นŒ์ง€์ž…๋‹ˆ๋‹ค."); } } + } + private static void validateDuplicate(List numbers) { Set set = new HashSet<>(numbers); if (set.size() != numbers.size()) { throw new IllegalArgumentException("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” ์ค‘๋ณต๋  ์ˆ˜ ์—†๋‹ค."); @@ -31,6 +45,7 @@ private void validate(List numbers) { } + private List toSortedUnmodifiable(List numbers) { List copy = new ArrayList<>(numbers); Collections.sort(copy); From 70df603873c1fa6e73e220f33b5eba6aacd22d69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 15:37:37 +0900 Subject: [PATCH 18/36] =?UTF-8?q?refactor(domain)=20:=20Lotto=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=EC=97=90=20=EC=83=81=EC=88=98=EB=A5=BC=20?= =?UTF-8?q?=EB=8F=84=EC=9E=85=ED=95=98=EC=97=AC=20=EB=A7=A4=EC=A7=81?= =?UTF-8?q?=EB=84=98=EB=B2=84=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - LOTTO_SIZE ๋„์ž… - MIN_NUMBER ๋„์ž… - MAX_NUMBER ๋„์ž… --- src/main/java/planetlotto/domain/Lotto.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/planetlotto/domain/Lotto.java b/src/main/java/planetlotto/domain/Lotto.java index 67f48c417..41c4aaa26 100644 --- a/src/main/java/planetlotto/domain/Lotto.java +++ b/src/main/java/planetlotto/domain/Lotto.java @@ -3,6 +3,11 @@ import java.util.*; public class Lotto { + // ์ƒ์ˆ˜ + private static final int LOTTO_SIZE = 5; + private static final int MIN_NUMBER = 1; + private static final int MAX_NUMBER = 30; + private final List numbers; public Lotto(List numbers) { @@ -24,15 +29,15 @@ private static void validateNull(List numbers) { private static void validateSize(List numbers) { - if (numbers.size() != 5) { - throw new IllegalArgumentException("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ์˜ ๊ฐœ์ˆ˜๋Š” 5๊ฐœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + if (numbers.size() != LOTTO_SIZE) { + throw new IllegalArgumentException("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” " + LOTTO_SIZE + "๊ฐœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); } } private static void validateRange(List numbers) { for (Integer n : numbers) { - if (n < 1 || n > 30) { - throw new IllegalArgumentException("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ์˜ ์ˆซ์ž ๋ฒ”์œ„๋Š” 1~30๊นŒ์ง€์ž…๋‹ˆ๋‹ค."); + if (n == null || n < MIN_NUMBER || n > MAX_NUMBER) { + throw new IllegalArgumentException("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” " + MIN_NUMBER + "๋ถ€ํ„ฐ " + MAX_NUMBER + " ์‚ฌ์ด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); } } } @@ -40,18 +45,19 @@ private static void validateRange(List numbers) { private static void validateDuplicate(List numbers) { Set set = new HashSet<>(numbers); if (set.size() != numbers.size()) { - throw new IllegalArgumentException("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” ์ค‘๋ณต๋  ์ˆ˜ ์—†๋‹ค."); + throw new IllegalArgumentException("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” ์ค‘๋ณต๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."); } } - + // --- ์ •๋ ฌ & ๋ถˆ๋ณ€ ๋ณด๊ด€ --- private List toSortedUnmodifiable(List numbers) { List copy = new ArrayList<>(numbers); Collections.sort(copy); return Collections.unmodifiableList(copy); } + public List getNumbers() { return numbers; } From 6afa4137c2eda67acefc2afe8d6e8f5fd4941b93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 15:47:23 +0900 Subject: [PATCH 19/36] =?UTF-8?q?refactor(domain)=20:=20WinningNumbers=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81(=EA=B0=80=EB=8F=85=EC=84=B1=20=ED=96=A5=EC=83=81=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B2=80=EC=A6=9D=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/Lotto.java | 2 +- .../planetlotto/domain/WinningNumbers.java | 66 ++++++++++++++++++- 2 files changed, 65 insertions(+), 3 deletions(-) diff --git a/src/main/java/planetlotto/domain/Lotto.java b/src/main/java/planetlotto/domain/Lotto.java index 41c4aaa26..622450ee4 100644 --- a/src/main/java/planetlotto/domain/Lotto.java +++ b/src/main/java/planetlotto/domain/Lotto.java @@ -8,7 +8,7 @@ public class Lotto { private static final int MIN_NUMBER = 1; private static final int MAX_NUMBER = 30; - private final List numbers; + private final List numbers; // ์˜ค๋ฆ„์ฐจ์ˆœ ๋ถˆ๋ณ€ ๋ฆฌ์ŠคํŠธ public Lotto(List numbers) { validate(numbers); diff --git a/src/main/java/planetlotto/domain/WinningNumbers.java b/src/main/java/planetlotto/domain/WinningNumbers.java index 042ba0438..aa3d18e72 100644 --- a/src/main/java/planetlotto/domain/WinningNumbers.java +++ b/src/main/java/planetlotto/domain/WinningNumbers.java @@ -1,17 +1,72 @@ package planetlotto.domain; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; import java.util.List; public class WinningNumbers { - private final List numbers; + // ์ƒ์ˆ˜ + private static final int REQUIRED_SIZE = 5; + private static final int MIN_NUMBER = 1; + private static final int MAX_NUMBER = 30; + + private final List numbers; // ์˜ค๋ฆ„์ฐจ์ˆœ ๋ถˆ๋ณ€ ๋ฆฌ์ŠคํŠธ private final int bonusNum; public WinningNumbers(List numbers, int bonusNum) { - this.numbers = numbers; + validateNotNull(numbers); + validateSize(numbers); + validateRange(numbers); + validateUnique(numbers); + validateBonusRange(bonusNum); + validateBonusNotDuplicated(numbers, bonusNum); + + this.numbers = toSortedUnmodifiable(numbers); this.bonusNum = bonusNum; } + + // --- ๊ฒ€์ฆ --- + private void validateNotNull(List numbers) { + if (numbers == null) { + throw new IllegalArgumentException("[ERROR] ๋‹น์ฒจ ๋ฒˆํ˜ธ ๋ชฉ๋ก์ด null์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."); + } + } + + private void validateSize(List numbers) { + if (numbers.size() != REQUIRED_SIZE) { + throw new IllegalArgumentException("[ERROR] ๋‹น์ฒจ ๋ฒˆํ˜ธ๋Š” " + REQUIRED_SIZE + "๊ฐœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } + } + + private void validateRange(List numbers) { + for (Integer n : numbers) { + if (n == null || n < MIN_NUMBER || n > MAX_NUMBER) { + throw new IllegalArgumentException("[ERROR] ๋‹น์ฒจ ๋ฒˆํ˜ธ๋Š” " + MIN_NUMBER + "๋ถ€ํ„ฐ " + MAX_NUMBER + " ์‚ฌ์ด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } + } + } + + private void validateUnique(List numbers) { + if (new HashSet<>(numbers).size() != numbers.size()) { + throw new IllegalArgumentException("[ERROR] ๋‹น์ฒจ ๋ฒˆํ˜ธ๋Š” ์ค‘๋ณต๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."); + } + } + + private void validateBonusRange(int bonus) { + if (bonus < MIN_NUMBER || bonus > MAX_NUMBER) { + throw new IllegalArgumentException("[ERROR] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋Š” " + MIN_NUMBER + "๋ถ€ํ„ฐ " + MAX_NUMBER + " ์‚ฌ์ด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } + } + + private void validateBonusNotDuplicated(List numbers, int bonus) { + if (numbers.contains(bonus)) { + throw new IllegalArgumentException("[ERROR] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋Š” ๋‹น์ฒจ ๋ฒˆํ˜ธ์™€ ์ค‘๋ณต๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."); + } + } + public List getNumbers() { return numbers; } @@ -19,4 +74,11 @@ public List getNumbers() { public int getBonusNum() { return bonusNum; } + + // --- ๋ณด๊ด€ --- + private List toSortedUnmodifiable(List numbers) { + List copy = new ArrayList<>(numbers); + Collections.sort(copy); + return Collections.unmodifiableList(copy); + } } From 69a38a6021b0ca0e4b9c1ed9ee849824bdb991c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 15:50:30 +0900 Subject: [PATCH 20/36] =?UTF-8?q?refactor(domain)=20:=20Rank(Enum)=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=ED=95=84=EB=93=9C=20=EB=B0=8F=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - matchCount,IsBonus,prize ํ•„๋“œ์— private ์ถ”๊ฐ€ํ•˜์—ฌ ๋ณด์•ˆ ๊ฐ•ํ™” - ์•ˆ์“ฐ๋Š” ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ --- src/main/java/planetlotto/domain/Rank.java | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/src/main/java/planetlotto/domain/Rank.java b/src/main/java/planetlotto/domain/Rank.java index ffe630029..4acee771a 100644 --- a/src/main/java/planetlotto/domain/Rank.java +++ b/src/main/java/planetlotto/domain/Rank.java @@ -9,9 +9,9 @@ public enum Rank { FIFTH(2, true, 5_000L), NONE(0, false, 0L); - final int matchCount; - final boolean isBonus; - final long prize; + private final int matchCount; + private final boolean isBonus; + private final long prize; Rank(int matchCount, boolean isBonus, long prize) { this.matchCount = matchCount; @@ -19,19 +19,10 @@ public enum Rank { this.prize = prize; } - public int getMatchCount() { - return matchCount; - } - - public boolean getIsBonus() { - return isBonus; - } - public long getPrize() { - return prize; - } public static Rank of(int matchCount, boolean isBonus) { + // ์กฐ๊ธฐ ๋ฐ˜ํ™˜์œผ๋กœ ๋ถ„๊ธฐ (else/switch/3ํ•ญ ๊ธˆ์ง€) if (matchCount == 5) { return FIRST; } From 2a71450706592bde6aa9759e2c2102872d5d085e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 15:56:23 +0900 Subject: [PATCH 21/36] =?UTF-8?q?refactor(domain)=20:=20WinningNumbers=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=EC=97=90=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 - WinCountCalculator์˜ ๊ธฐ๋Šฅ์„ ๊ฐ„์†Œํ™”ํ•˜๊ณ ์ž WinningNumbers ๋„๋ฉ”์ธ์— countMatches, isBounusMatched ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ --- .../java/planetlotto/domain/WinningNumbers.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/planetlotto/domain/WinningNumbers.java b/src/main/java/planetlotto/domain/WinningNumbers.java index aa3d18e72..ebb95aeeb 100644 --- a/src/main/java/planetlotto/domain/WinningNumbers.java +++ b/src/main/java/planetlotto/domain/WinningNumbers.java @@ -81,4 +81,20 @@ private List toSortedUnmodifiable(List numbers) { Collections.sort(copy); return Collections.unmodifiableList(copy); } + + + // --- ํŒ์ • ๋ณด์กฐ --- + public int countMatches(Lotto lotto) { + int count = 0; + for (Integer n : lotto.getNumbers()) { + if (numbers.contains(n)) { + count++; + } + } + return count; + } + + public boolean isBonusMatched(Lotto lotto) { + return lotto.getNumbers().contains(bonusNum); + } } From 2344523aec98ea1b1c53317dc25949e9840486a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 16:06:40 +0900 Subject: [PATCH 22/36] =?UTF-8?q?refactor(domain)=20:=20WinCountCalculator?= =?UTF-8?q?=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EA=B8=B0=EB=8A=A5=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - private ์ƒ์„ฑ์ž๋ฅผ ๋„์ž…ํ•˜์—ฌ ๊ฐ์ฒด ์ƒ์„ฑ ๊ธˆ์ง€์‹œํ‚ด - ๋กœ๋˜ ๋‹น์ฒจ์„ ์ง‘๊ณ„ํ•˜๋Š” ์ˆœ์ˆ˜ํ•œ ํ•จ์ˆ˜์ด๋ฏ€๋กœ, ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์ƒํƒœ์— ์˜์กดํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— static์œผ๋กœ ์„ ์–ธํ•˜์—ฌ ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐ์„ฑ๊ณผ ํšจ์œจ์„ฑ์„ ๋†’์ž„ - WinningNumbers์— ์ถ”๊ฐ€๋œ countMatches ๊ธฐ๋Šฅ๊ณผ isBonusMatched ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์„œ๋“œ ๋ณ€๊ฒฝ - WinCountCalculator -> ResultCalculator๋กœ ์ด๋ฆ„ ๋ณ€๊ฒฝ --- .../planetlotto/domain/ResultCalculator.java | 23 ++++++++++++++++++ .../domain/WinCountCalculator.java | 24 ------------------- 2 files changed, 23 insertions(+), 24 deletions(-) create mode 100644 src/main/java/planetlotto/domain/ResultCalculator.java delete mode 100644 src/main/java/planetlotto/domain/WinCountCalculator.java diff --git a/src/main/java/planetlotto/domain/ResultCalculator.java b/src/main/java/planetlotto/domain/ResultCalculator.java new file mode 100644 index 000000000..d4e4dca5a --- /dev/null +++ b/src/main/java/planetlotto/domain/ResultCalculator.java @@ -0,0 +1,23 @@ +package planetlotto.domain; + +import java.util.*; + +public final class ResultCalculator { + + private ResultCalculator(){} // ๊ฐ์ฒด ์ƒ์„ฑ ๊ธˆ์ง€์šฉ + + /** + * ๋ณด์œ ํ•œ ๋กœ๋˜๋“ค์„ ๋“ฑ์ˆ˜๋ณ„๋กœ ์ง‘๊ณ„ํ•œ๋‹ค. + */ + public static Map tallyRanks(Lottos lottos, WinningNumbers winning) { + Map tally = new EnumMap<>(Rank.class); + for (Lotto lotto : lottos.getLottos()) { + int matches = winning.countMatches(lotto); + boolean bonus = winning.isBonusMatched(lotto); + Rank rank = Rank.of(matches, bonus); + tally.put(rank, tally.getOrDefault(rank, 0) + 1); + } + return tally; + } + +} diff --git a/src/main/java/planetlotto/domain/WinCountCalculator.java b/src/main/java/planetlotto/domain/WinCountCalculator.java deleted file mode 100644 index 0d851849c..000000000 --- a/src/main/java/planetlotto/domain/WinCountCalculator.java +++ /dev/null @@ -1,24 +0,0 @@ -package planetlotto.domain; - -import java.util.*; - -public class WinCountCalculator { - - Map ranks; - - public Map calculate(Lottos lottos, WinningNumbers winningNumbers) { - List winning = winningNumbers.getNumbers(); - Map ranks = new EnumMap<>(Rank.class); - - for (Lotto lotto : lottos.getLottos()) { - List lott = lotto.getNumbers(); - Set intersection = new HashSet<>(winning); - intersection.retainAll(lott); - int matchCount = intersection.size(); - boolean isBonus = lott.contains(winningNumbers.getBonusNum()); - Rank rank = Rank.of(matchCount, isBonus); - ranks.put(rank, ranks.getOrDefault(rank, 0) + 1); - } - return ranks; - } -} From ea6f595aaef782b3a8eada7591a15a6ea6138941 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 16:11:26 +0900 Subject: [PATCH 23/36] =?UTF-8?q?fix(domain)=20:=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - WinningDetailsCalculator -> CountByRank๋กœ ์ด๋ฆ„ ์ˆ˜์ • --- .../domain/{WinningDetailsCalculator.java => CountByRank.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/planetlotto/domain/{WinningDetailsCalculator.java => CountByRank.java} (94%) diff --git a/src/main/java/planetlotto/domain/WinningDetailsCalculator.java b/src/main/java/planetlotto/domain/CountByRank.java similarity index 94% rename from src/main/java/planetlotto/domain/WinningDetailsCalculator.java rename to src/main/java/planetlotto/domain/CountByRank.java index 6cb3d0094..1b7ffaae7 100644 --- a/src/main/java/planetlotto/domain/WinningDetailsCalculator.java +++ b/src/main/java/planetlotto/domain/CountByRank.java @@ -3,7 +3,7 @@ import java.util.HashMap; import java.util.Map; -public class WinningDetailsCalculator { +public class CountByRank { public Map calculate(Map ranks){ Map countsByRank = new HashMap<>(); From 089a75c3c05cd0874079ce9cc3e2455a5ccdda2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 16:15:51 +0900 Subject: [PATCH 24/36] =?UTF-8?q?refactor(support)=20:=20BonusNumber=20?= =?UTF-8?q?=EB=A7=A4=EC=A7=81=20=EB=84=98=EB=B2=84=20=EC=A0=9C=EA=B1=B0(?= =?UTF-8?q?=EC=83=81=EC=88=98=20=EB=8F=84=EC=9E=85)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 - src/main/java/planetlotto/controller/MainController.java | 8 +++----- src/main/java/planetlotto/domain/CountByRank.java | 1 + .../java/planetlotto/support/validator/BonusNumber.java | 9 +++++++-- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index f8bed232e..638ff5b8a 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,6 @@ Console์„ ์ด์šฉํ•˜์—ฌ ์šฐํ…Œ์ฝ” ๋กœ๋˜ ๋ฐœ๋งค๊ธฐ์ธ ํ–‰์„ฑ ๋กœ๋˜๋ฅผ ๊ตฌํ˜„ํ•œ ## **๐Ÿ“ฅ ์ž…์ถœ๋ ฅ ๋ช…์„ธ** ### โ–ซ ์ž…๋ ฅ - 1. ๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก์„ ์ž…๋ ฅ ๋ฐ›๋Š”๋‹ค. 2. ๋‹น์ฒจ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ ๋ฐ›๋Š”๋‹ค. ๋ฒˆํ˜ธ๋Š” ์‰ผํ‘œ(,)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค. 3. ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ ๋ฐ›๋Š”๋‹ค. diff --git a/src/main/java/planetlotto/controller/MainController.java b/src/main/java/planetlotto/controller/MainController.java index 19d360899..2309e6e05 100644 --- a/src/main/java/planetlotto/controller/MainController.java +++ b/src/main/java/planetlotto/controller/MainController.java @@ -12,8 +12,7 @@ public class MainController { private final LottoGenerator lottoGenerator = new LottoGenerator(); - private final WinCountCalculator winCountCalculator = new WinCountCalculator(); - private final WinningDetailsCalculator winningDetailsCalculator = new WinningDetailsCalculator(); + private final CountByRank countByRank = new CountByRank(); public void run() { int purchaseAmount = readPurchaseAmountWithRetry(); @@ -27,10 +26,9 @@ public void run() { WinningNumbers winningNumbers = new WinningNumbers(winning, bonusNumber); + Map ranks = ResultCalculator.tallyRanks(lottos, winningNumbers); - Map ranks = winCountCalculator.calculate(lottos, winningNumbers); - - Map countsByrank = winningDetailsCalculator.calculate(ranks); + Map countsByrank = countByRank.calculate(ranks); OutputView.printResult(countsByrank); diff --git a/src/main/java/planetlotto/domain/CountByRank.java b/src/main/java/planetlotto/domain/CountByRank.java index 1b7ffaae7..0d6726b92 100644 --- a/src/main/java/planetlotto/domain/CountByRank.java +++ b/src/main/java/planetlotto/domain/CountByRank.java @@ -7,6 +7,7 @@ public class CountByRank { public Map calculate(Map ranks){ Map countsByRank = new HashMap<>(); + countsByRank.put(1,ranks.getOrDefault(Rank.FIRST,0)); countsByRank.put(2, ranks.getOrDefault(Rank.SECOND, 0)); countsByRank.put(3, ranks.getOrDefault(Rank.THIRD, 0)); diff --git a/src/main/java/planetlotto/support/validator/BonusNumber.java b/src/main/java/planetlotto/support/validator/BonusNumber.java index 50b7c082a..221f24715 100644 --- a/src/main/java/planetlotto/support/validator/BonusNumber.java +++ b/src/main/java/planetlotto/support/validator/BonusNumber.java @@ -1,9 +1,14 @@ package planetlotto.support.validator; public final class BonusNumber { + + // ์ƒ์ˆ˜ + private static final int MIN_NUMBER = 1; + private static final int MAX_NUMBER = 30; + public static void validate(int bonus){ - if (bonus < 1 || bonus > 30) { - throw new IllegalArgumentException("[ERROR] ๋ณด๋„ˆ์Šค ์ˆซ์ž๋Š” 1์—์„œ 30 ์‚ฌ์ด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + if (bonus < MIN_NUMBER || bonus > MAX_NUMBER) { + throw new IllegalArgumentException("๋ณด๋„ˆ์Šค ์ˆซ์ž๋Š” " + MIN_NUMBER + "๋ถ€ํ„ฐ " + MAX_NUMBER + " ์‚ฌ์ด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); } } } From 8c6b792d104fd5e67df0147903f4c8f4a0a08178 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 16:18:50 +0900 Subject: [PATCH 25/36] =?UTF-8?q?refactor(support)=20:=20WinningNumber=20?= =?UTF-8?q?=EB=A7=A4=EC=A7=81=EB=84=98=EB=B2=84=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/validator/WinningNumber.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/planetlotto/support/validator/WinningNumber.java b/src/main/java/planetlotto/support/validator/WinningNumber.java index 759eaf03f..0136c2088 100644 --- a/src/main/java/planetlotto/support/validator/WinningNumber.java +++ b/src/main/java/planetlotto/support/validator/WinningNumber.java @@ -6,6 +6,11 @@ public final class WinningNumber { + // ์ƒ์ˆ˜ + private static final int LOTTO_SIZE = 5; + private static final int MIN_NUMBER = 1; + private static final int MAX_NUMBER = 30; + public static void validate(List WinningNumbers){ validateDuplicate(WinningNumbers); validateSize(WinningNumbers); @@ -15,20 +20,20 @@ public static void validate(List WinningNumbers){ private static void validateDuplicate(List result) { Set set = new HashSet<>(result); if (set.size() != result.size()) { - throw new IllegalArgumentException("[ERROR] ๋‹น์ฒจ๋ฒˆํ˜ธ์— ์ค‘๋ณต๋˜๋Š” ์ˆซ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค."); + throw new IllegalArgumentException("๋‹น์ฒจ๋ฒˆํ˜ธ์— ์ค‘๋ณต๋˜๋Š” ์ˆซ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค."); } } private static void validateSize(List result) { - if (result.size() != 5) { - throw new IllegalArgumentException("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 5๊ฐœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + if (result.size() != LOTTO_SIZE) { + throw new IllegalArgumentException("๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” " + LOTTO_SIZE + "๊ฐœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); } } private static void validateRange(List result){ for(int number:result) { - if (number < 1 || number > 30) { - throw new IllegalArgumentException("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ์˜ ์ˆซ์ž ๋ฒ”์œ„๋Š” 1~30๊นŒ์ง€์ž…๋‹ˆ๋‹ค."); + if (number < MIN_NUMBER || number > MAX_NUMBER) { + throw new IllegalArgumentException("๋กœ๋˜ ๋ฒˆํ˜ธ์˜ ์ˆซ์ž ๋ฒ”์œ„๋Š” 1~30๊นŒ์ง€์ž…๋‹ˆ๋‹ค."); } } } From 1eb2f1c8728dd9e6655f64ca128cd79d7099202b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 16:20:49 +0900 Subject: [PATCH 26/36] =?UTF-8?q?fix(support)=20:=20validator=EC=97=90?= =?UTF-8?q?=EC=84=9C=20[ERROR]=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - OutputView์— ์žˆ๋Š” printErrorMessage๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด validator์—์„œ [ERROR] ๋ฉ”์‹œ์ง€ ์ œ๊ฑฐ --- .../java/planetlotto/support/validator/PurchaseAmount.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/planetlotto/support/validator/PurchaseAmount.java b/src/main/java/planetlotto/support/validator/PurchaseAmount.java index 11adc6e8b..6002104ff 100644 --- a/src/main/java/planetlotto/support/validator/PurchaseAmount.java +++ b/src/main/java/planetlotto/support/validator/PurchaseAmount.java @@ -9,13 +9,13 @@ public static void validate(int purchaseAmount){ private static void validateNegative(int amount) { if (amount < 0) { - throw new IllegalArgumentException("[ERROR] ๊ตฌ์ž… ๊ธˆ์•ก์€ ์Œ์ˆ˜์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."); + throw new IllegalArgumentException("๊ตฌ์ž… ๊ธˆ์•ก์€ ์Œ์ˆ˜์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."); } } private static void validateFiveHundred(int amount) { if (amount % 500 != 0) { - throw new IllegalArgumentException("[ERROR] ๊ตฌ์ž…๊ธˆ์•ก์€ 500์› ๋‹จ์œ„๋กœ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."); + throw new IllegalArgumentException("๊ตฌ์ž…๊ธˆ์•ก์€ 500์› ๋‹จ์œ„๋กœ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."); } } } From b9926b30fd2362da67dfa8d057658499a53f838a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 16:22:38 +0900 Subject: [PATCH 27/36] =?UTF-8?q?fix(controller)=20:=20MainController=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -์ฃผ์ œ์— ๋งž๊ฒŒ LottoController๋กœ ์ด๋ฆ„ ๋ณ€๊ฒฝ --- src/main/java/planetlotto/Application.java | 4 ++-- .../controller/{MainController.java => LottoController.java} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/main/java/planetlotto/controller/{MainController.java => LottoController.java} (98%) diff --git a/src/main/java/planetlotto/Application.java b/src/main/java/planetlotto/Application.java index 9365b7444..f77ad05db 100644 --- a/src/main/java/planetlotto/Application.java +++ b/src/main/java/planetlotto/Application.java @@ -1,9 +1,9 @@ package planetlotto; -import planetlotto.controller.MainController; +import planetlotto.controller.LottoController; public class Application { public static void main(String[] args) { - new MainController().run(); + new LottoController().run(); } } diff --git a/src/main/java/planetlotto/controller/MainController.java b/src/main/java/planetlotto/controller/LottoController.java similarity index 98% rename from src/main/java/planetlotto/controller/MainController.java rename to src/main/java/planetlotto/controller/LottoController.java index 2309e6e05..950dfde18 100644 --- a/src/main/java/planetlotto/controller/MainController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -10,7 +10,7 @@ import java.util.List; import java.util.Map; -public class MainController { +public class LottoController { private final LottoGenerator lottoGenerator = new LottoGenerator(); private final CountByRank countByRank = new CountByRank(); From d086e54b480f7310f0815772a16a3af3752ac407 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 16:25:03 +0900 Subject: [PATCH 28/36] =?UTF-8?q?refactor(all)=20:=20=EB=AA=A8=EB=93=A0=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=A0=95=EB=A0=AC(ctrl+alt+l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/controller/LottoController.java | 5 +++-- src/main/java/planetlotto/domain/CountByRank.java | 6 +++--- src/main/java/planetlotto/domain/Lotto.java | 1 + src/main/java/planetlotto/domain/Rank.java | 1 - src/main/java/planetlotto/domain/ResultCalculator.java | 3 ++- .../java/planetlotto/support/validator/BonusNumber.java | 2 +- .../java/planetlotto/support/validator/PurchaseAmount.java | 2 +- .../java/planetlotto/support/validator/WinningNumber.java | 6 +++--- 8 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index 950dfde18..1a992493e 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -28,7 +28,7 @@ public void run() { Map ranks = ResultCalculator.tallyRanks(lottos, winningNumbers); - Map countsByrank = countByRank.calculate(ranks); + Map countsByrank = countByRank.calculate(ranks); OutputView.printResult(countsByrank); @@ -43,7 +43,8 @@ private int readPurchaseAmountWithRetry() { PurchaseAmount.validate(purchaseAmount); return purchaseAmount; } catch (IllegalArgumentException e) { - OutputView.printErrorMessage(e.getMessage()); } + OutputView.printErrorMessage(e.getMessage()); + } } } diff --git a/src/main/java/planetlotto/domain/CountByRank.java b/src/main/java/planetlotto/domain/CountByRank.java index 0d6726b92..2693a9eaf 100644 --- a/src/main/java/planetlotto/domain/CountByRank.java +++ b/src/main/java/planetlotto/domain/CountByRank.java @@ -5,10 +5,10 @@ public class CountByRank { - public Map calculate(Map ranks){ - Map countsByRank = new HashMap<>(); + public Map calculate(Map ranks) { + Map countsByRank = new HashMap<>(); - countsByRank.put(1,ranks.getOrDefault(Rank.FIRST,0)); + countsByRank.put(1, ranks.getOrDefault(Rank.FIRST, 0)); countsByRank.put(2, ranks.getOrDefault(Rank.SECOND, 0)); countsByRank.put(3, ranks.getOrDefault(Rank.THIRD, 0)); countsByRank.put(4, ranks.getOrDefault(Rank.FOURTH, 0)); diff --git a/src/main/java/planetlotto/domain/Lotto.java b/src/main/java/planetlotto/domain/Lotto.java index 622450ee4..8173a8fe4 100644 --- a/src/main/java/planetlotto/domain/Lotto.java +++ b/src/main/java/planetlotto/domain/Lotto.java @@ -21,6 +21,7 @@ private void validate(List numbers) { validateRange(numbers); validateDuplicate(numbers); } + private static void validateNull(List numbers) { if (numbers == null) { throw new IllegalArgumentException("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ ๋ชฉ๋ก์ด null์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."); diff --git a/src/main/java/planetlotto/domain/Rank.java b/src/main/java/planetlotto/domain/Rank.java index 4acee771a..4e7f1f34e 100644 --- a/src/main/java/planetlotto/domain/Rank.java +++ b/src/main/java/planetlotto/domain/Rank.java @@ -20,7 +20,6 @@ public enum Rank { } - public static Rank of(int matchCount, boolean isBonus) { // ์กฐ๊ธฐ ๋ฐ˜ํ™˜์œผ๋กœ ๋ถ„๊ธฐ (else/switch/3ํ•ญ ๊ธˆ์ง€) if (matchCount == 5) { diff --git a/src/main/java/planetlotto/domain/ResultCalculator.java b/src/main/java/planetlotto/domain/ResultCalculator.java index d4e4dca5a..1e3f53cba 100644 --- a/src/main/java/planetlotto/domain/ResultCalculator.java +++ b/src/main/java/planetlotto/domain/ResultCalculator.java @@ -4,7 +4,8 @@ public final class ResultCalculator { - private ResultCalculator(){} // ๊ฐ์ฒด ์ƒ์„ฑ ๊ธˆ์ง€์šฉ + private ResultCalculator() { + } // ๊ฐ์ฒด ์ƒ์„ฑ ๊ธˆ์ง€์šฉ /** * ๋ณด์œ ํ•œ ๋กœ๋˜๋“ค์„ ๋“ฑ์ˆ˜๋ณ„๋กœ ์ง‘๊ณ„ํ•œ๋‹ค. diff --git a/src/main/java/planetlotto/support/validator/BonusNumber.java b/src/main/java/planetlotto/support/validator/BonusNumber.java index 221f24715..6946c00b8 100644 --- a/src/main/java/planetlotto/support/validator/BonusNumber.java +++ b/src/main/java/planetlotto/support/validator/BonusNumber.java @@ -6,7 +6,7 @@ public final class BonusNumber { private static final int MIN_NUMBER = 1; private static final int MAX_NUMBER = 30; - public static void validate(int bonus){ + public static void validate(int bonus) { if (bonus < MIN_NUMBER || bonus > MAX_NUMBER) { throw new IllegalArgumentException("๋ณด๋„ˆ์Šค ์ˆซ์ž๋Š” " + MIN_NUMBER + "๋ถ€ํ„ฐ " + MAX_NUMBER + " ์‚ฌ์ด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); } diff --git a/src/main/java/planetlotto/support/validator/PurchaseAmount.java b/src/main/java/planetlotto/support/validator/PurchaseAmount.java index 6002104ff..49f695041 100644 --- a/src/main/java/planetlotto/support/validator/PurchaseAmount.java +++ b/src/main/java/planetlotto/support/validator/PurchaseAmount.java @@ -1,7 +1,7 @@ package planetlotto.support.validator; public final class PurchaseAmount { - public static void validate(int purchaseAmount){ + public static void validate(int purchaseAmount) { validateNegative(purchaseAmount); validateFiveHundred(purchaseAmount); } diff --git a/src/main/java/planetlotto/support/validator/WinningNumber.java b/src/main/java/planetlotto/support/validator/WinningNumber.java index 0136c2088..6b03ed3cd 100644 --- a/src/main/java/planetlotto/support/validator/WinningNumber.java +++ b/src/main/java/planetlotto/support/validator/WinningNumber.java @@ -11,7 +11,7 @@ public final class WinningNumber { private static final int MIN_NUMBER = 1; private static final int MAX_NUMBER = 30; - public static void validate(List WinningNumbers){ + public static void validate(List WinningNumbers) { validateDuplicate(WinningNumbers); validateSize(WinningNumbers); validateRange(WinningNumbers); @@ -30,8 +30,8 @@ private static void validateSize(List result) { } } - private static void validateRange(List result){ - for(int number:result) { + private static void validateRange(List result) { + for (int number : result) { if (number < MIN_NUMBER || number > MAX_NUMBER) { throw new IllegalArgumentException("๋กœ๋˜ ๋ฒˆํ˜ธ์˜ ์ˆซ์ž ๋ฒ”์œ„๋Š” 1~30๊นŒ์ง€์ž…๋‹ˆ๋‹ค."); } From 9398a86b38af6c911b1f0983c29998672e6df0c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 16:32:40 +0900 Subject: [PATCH 29/36] =?UTF-8?q?test=20:=20Rank=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/domain/Rank.java | 8 +++ .../java/planetlotto/domain/RankTest.java | 57 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 src/test/java/planetlotto/domain/RankTest.java diff --git a/src/main/java/planetlotto/domain/Rank.java b/src/main/java/planetlotto/domain/Rank.java index 4e7f1f34e..0b3a7cb6d 100644 --- a/src/main/java/planetlotto/domain/Rank.java +++ b/src/main/java/planetlotto/domain/Rank.java @@ -39,4 +39,12 @@ public static Rank of(int matchCount, boolean isBonus) { } return NONE; } + + public long getPrize(){ + return prize; + } + + public int getMatchCount(){ + return matchCount; + } } diff --git a/src/test/java/planetlotto/domain/RankTest.java b/src/test/java/planetlotto/domain/RankTest.java new file mode 100644 index 000000000..3e7fb367c --- /dev/null +++ b/src/test/java/planetlotto/domain/RankTest.java @@ -0,0 +1,57 @@ +package planetlotto.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + +class RankTest { + + @Test + @DisplayName("์ผ์น˜ 5๊ฐœ๋ฉด 1๋“ฑ์ด๋ฉฐ ์ƒ๊ธˆ์€ 100_000_000์›") + void firstPrize() { + Rank rank = Rank.of(5, false); + assertThat(rank).isEqualTo(Rank.FIRST); + assertThat(rank.getPrize()).isEqualTo(100_000_000L); + assertThat(rank.getMatchCount()).isEqualTo(5); + } + + @Test + @DisplayName("์ผ์น˜ 4๊ฐœ+๋ณด๋„ˆ์Šค๋ฉด 2๋“ฑ์ด๋ฉฐ ์ƒ๊ธˆ์€ 10_000_000์›") + void secondPrize() { + Rank rank = Rank.of(4, true); + assertThat(rank).isEqualTo(Rank.SECOND); + assertThat(rank.getPrize()).isEqualTo(10_000_000L); + assertThat(rank.getMatchCount()).isEqualTo(4); + } + + @Test + @DisplayName("์ผ์น˜ 4๊ฐœ(๋ณด๋„ˆ์ŠคX)๋Š” 3๋“ฑ์ด๋ฉฐ ์ƒ๊ธˆ์€ 1_500_000์›") + void thirdPrize() { + Rank rank = Rank.of(4, false); + assertThat(rank).isEqualTo(Rank.THIRD); + assertThat(rank.getPrize()).isEqualTo(1_500_000L); + assertThat(rank.getMatchCount()).isEqualTo(4); + } + + @Test + @DisplayName("์ผ์น˜ 3๊ฐœ(๋ณด๋„ˆ์Šคo)๋Š” 4๋“ฑ(500_000์›), 2๊ฐœ(๋ณด๋„ˆ์Šคo)๋Š” 5๋“ฑ(5_000์›)") + void fourthAndFifthPrize() { + assertThat(Rank.of(3, true)).isEqualTo(Rank.FOURTH); + assertThat(Rank.of(3, true).getPrize()).isEqualTo(500_000L); + + assertThat(Rank.of(2, true)).isEqualTo(Rank.FIFTH); + assertThat(Rank.of(2, true).getPrize()).isEqualTo(5_000L); + } + + @Test + @DisplayName("๊ทธ ์™ธ์˜ ์กฐํ•ฉ์€ NONE(0์›)") + void nonePrize() { + assertThat(Rank.of(2, false)).isEqualTo(Rank.NONE); + assertThat(Rank.of(0, false)).isEqualTo(Rank.NONE); + assertThat(Rank.of(1, true)).isEqualTo(Rank.NONE); + assertThat(Rank.of(2, false)).isEqualTo(Rank.NONE); + assertThat(Rank.NONE.getPrize()).isEqualTo(0L); + assertThat(Rank.NONE.getMatchCount()).isEqualTo(0); + } +} \ No newline at end of file From 3cbc67675df2438b6a9897011f7e9011cc7fbae8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 16:40:16 +0900 Subject: [PATCH 30/36] =?UTF-8?q?test=20:=20WinningNumbers=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/WinningNumbersTest.java | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 src/test/java/planetlotto/domain/WinningNumbersTest.java diff --git a/src/test/java/planetlotto/domain/WinningNumbersTest.java b/src/test/java/planetlotto/domain/WinningNumbersTest.java new file mode 100644 index 000000000..4dec38c2b --- /dev/null +++ b/src/test/java/planetlotto/domain/WinningNumbersTest.java @@ -0,0 +1,85 @@ +package planetlotto.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.*; + +class WinningNumbersTest { + + @Test + @DisplayName("๋‹น์ฒจ ๋ฒˆํ˜ธ๋Š” ์ •ํ™•ํžˆ 5๊ฐœ๊ฐ€ ์•„๋‹ˆ๋ฉด ์˜ˆ์™ธ") + void sizeMustBeFive() { + assertThatThrownBy(() -> new WinningNumbers(List.of(1,2,3,4,5,6), 7)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageStartingWith("[ERROR]"); + + assertThatThrownBy(() -> new WinningNumbers(List.of(1,2,3,4,5,6,7), 8)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageStartingWith("[ERROR]"); + } + + @Test + @DisplayName("๋‹น์ฒจ ๋ฒˆํ˜ธ ๊ฐ ์ˆซ์ž๋Š” 1~30 ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์˜ˆ์™ธ") + void winningNumbersMustBeInRange() { + assertThatThrownBy(() -> new WinningNumbers(List.of(0,2,3,4,5), 7)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageStartingWith("[ERROR]"); + + assertThatThrownBy(() -> new WinningNumbers(List.of(2,3,4,5,31), 7)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageStartingWith("[ERROR]"); + } + + @Test + @DisplayName("๋‹น์ฒจ ๋ฒˆํ˜ธ์— ์ค‘๋ณต์ด ์žˆ์œผ๋ฉด ์˜ˆ์™ธ") + void winningNumbersMustBeUnique() { + assertThatThrownBy(() -> new WinningNumbers(List.of(1,1,3,4,5), 7)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageStartingWith("[ERROR]"); + } + + @Test + @DisplayName("๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋Š” 1~30 ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์˜ˆ์™ธ") + void bonusMustBeInRange() { + assertThatThrownBy(() -> new WinningNumbers(List.of(1,2,3,4,6), 0)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageStartingWith("[ERROR]"); + + assertThatThrownBy(() -> new WinningNumbers(List.of(1,2,3,4,5), 31)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageStartingWith("[ERROR]"); + } + + @Test + @DisplayName("๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๊ฐ€ ๋‹น์ฒจ ๋ฒˆํ˜ธ์™€ ์ค‘๋ณต์ด๋ฉด ์˜ˆ์™ธ") + void bonusMustNotDuplicateWinningNumbers() { + assertThatThrownBy(() -> new WinningNumbers(List.of(1,2,3,4,5), 5)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageStartingWith("[ERROR]"); + } + + @Test + @DisplayName("๋‚ด๋ถ€ ๋‹น์ฒจ ๋ฒˆํ˜ธ๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋ณด๊ด€๋˜๋ฉฐ ๋ถˆ๋ณ€์ด๋‹ค") + void internalNumbersAreSortedAndUnmodifiable() { + WinningNumbers w = new WinningNumbers(List.of(1,30,10,3,7), 8); + assertThat(w.getNumbers()).containsExactly(1,3,7,10,30); + assertThatThrownBy(() -> w.getNumbers().add(99)) + .isInstanceOf(UnsupportedOperationException.class); + } + + @Test + @DisplayName("์ผ์น˜ ๊ฐœ์ˆ˜์™€ ๋ณด๋„ˆ์Šค ์ผ์น˜ ์—ฌ๋ถ€๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค") + void canCountMatchesAndBonus() { + WinningNumbers w = new WinningNumbers(List.of(1,2,3,4,5), 7); + Lotto lotto1 = new Lotto(List.of(1,2,3,10,11)); // 3๊ฐœ ์ผ์น˜ + Lotto lotto2 = new Lotto(List.of(2,3,4,5,7)); // 5๊ฐœ + ๋ณด๋„ˆ์Šค + + assertThat(w.countMatches(lotto1)).isEqualTo(3); + assertThat(w.countMatches(lotto2)).isEqualTo(4); + assertThat(w.isBonusMatched(lotto2)).isTrue(); + + } +} \ No newline at end of file From 2fecc15429eb9b63b28f21fdc4c0f5bd73b805a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 16:42:53 +0900 Subject: [PATCH 31/36] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EA=B0=B1=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 638ff5b8a..ef71f1d6d 100644 --- a/README.md +++ b/README.md @@ -78,12 +78,12 @@ Console์„ ์ด์šฉํ•˜์—ฌ ์šฐํ…Œ์ฝ” ๋กœ๋˜ ๋ฐœ๋งค๊ธฐ์ธ ํ–‰์„ฑ ๋กœ๋˜๋ฅผ ๊ตฌํ˜„ํ•œ ### 4) ๋„์ „ ๊ณผ์ œ - ๊ธฐ๋ณธ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋ชจ๋‘ ์ถฉ์กฑํ•œ ํ›„, ์•„๋ž˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์—ฌ ๋„์ „ํ•˜์„ธ์š”. ๋‹จ, ๋„์ „ ๊ณผ์ œ ์ˆ˜ํ–‰ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์€ ๋ฐ˜๋“œ์‹œ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. - ๋„์ „ ๋ฐฉํ–ฅ - -[ ] ๋ฆฌํŒฉํ„ฐ๋ง: ์ž‘๋™์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋†’์ด๋Š” ๋ฐฉํ–ฅ + -[x] ๋ฆฌํŒฉํ„ฐ๋ง: ์ž‘๋™์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋†’์ด๋Š” ๋ฐฉํ–ฅ -### 6) ๋ฆฌํŒฉํ† ๋ง -- [ ] ์ฒดํฌ์™„๋ฃŒ +### 5) ๋ฆฌํŒฉํ† ๋ง +- [x] ์ฒดํฌ์™„๋ฃŒ ( ์ž์„ธํ•œ๊ฑด ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ฐธ๊ณ ) -### 5) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ์‚ฌํ•ญ ์ฒดํฌ +### 6) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ์‚ฌํ•ญ ์ฒดํฌ - [x] ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ ์‚ฌํ•ญ์—์„œ ๋‹ฌ๋ฆฌ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š” ํ•œ ํŒŒ์ผ, ํŒจํ‚ค์ง€ ์ด๋ฆ„์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ด๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. - [x] ์ž๋ฐ” ์ฝ”๋“œ ์ปจ๋ฒค์…˜์„ ์ง€ํ‚ค๋ฉด์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•œ๋‹ค. - [x] ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•ด์•ผ ํ•œ๋‹ค. @@ -94,5 +94,7 @@ Console์„ ์ด์šฉํ•˜์—ฌ ์šฐํ…Œ์ฝ” ๋กœ๋˜ ๋ฐœ๋งค๊ธฐ์ธ ํ–‰์„ฑ ๋กœ๋˜๋ฅผ ๊ตฌํ˜„ํ•œ ### 7) ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ๋ชฉ๋ก ์ฒดํฌ - [x] ๊ธฐ๋Šฅํ…Œ์ŠคํŠธ: ์ „์ฒด ๊ธฐ๋Šฅ ๊ตฌํ˜„: ("1000", "1,2,3,4,5", "6") ์ž…๋ ฅ ์‹œ ์‹คํ–‰์˜ˆ์‹œ์— ๋งž๊ฒŒ ์ถœ๋ ฅ - [x] ์˜ˆ์™ธํ…Œ์ŠคํŠธ: ๊ตฌ์ž…๊ธˆ์•ก("500j") ์ž…๋ ฅ ์‹œ ์—๋Ÿฌ๋ฐœ์ƒ -- [ ] ์—๋Ÿฌ ํ…Œ์ŠคํŠธ: ๋กœ๋˜ ๋ฒˆํ˜ธ์˜ ๊ฐœ์ˆ˜๊ฐ€ 5๊ฐœ๊ฐ€ ๋„˜์–ด๊ฐ€๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ -- [ ] ์—๋Ÿฌ ํ…Œ์ŠคํŠธ: ๋กœ๋˜ ๋ฒˆํ˜ธ์— ์ค‘๋ณต๋œ ์ˆซ์ž๊ฐ€ ์žˆ์œผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ \ No newline at end of file +- [x] ์—๋Ÿฌ ํ…Œ์ŠคํŠธ: ๋กœ๋˜ ๋ฒˆํ˜ธ์˜ ๊ฐœ์ˆ˜๊ฐ€ 5๊ฐœ๊ฐ€ ๋„˜์–ด๊ฐ€๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ +- [x] ์—๋Ÿฌ ํ…Œ์ŠคํŠธ: ๋กœ๋˜ ๋ฒˆํ˜ธ์— ์ค‘๋ณต๋œ ์ˆซ์ž๊ฐ€ ์žˆ์œผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ +- [x] Rank ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ +- [x] WinningNumbers ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ \ No newline at end of file From 9b26bb6efccc3883c80bddc788893718f0f0eb68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 16:49:08 +0900 Subject: [PATCH 32/36] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EA=B5=AC=ED=98=84=20=EA=B0=B1=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index ef71f1d6d..b2ec18c45 100644 --- a/README.md +++ b/README.md @@ -77,21 +77,25 @@ Console์„ ์ด์šฉํ•˜์—ฌ ์šฐํ…Œ์ฝ” ๋กœ๋˜ ๋ฐœ๋งค๊ธฐ์ธ ํ–‰์„ฑ ๋กœ๋˜๋ฅผ ๊ตฌํ˜„ํ•œ ### 4) ๋„์ „ ๊ณผ์ œ - ๊ธฐ๋ณธ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋ชจ๋‘ ์ถฉ์กฑํ•œ ํ›„, ์•„๋ž˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์—ฌ ๋„์ „ํ•˜์„ธ์š”. ๋‹จ, ๋„์ „ ๊ณผ์ œ ์ˆ˜ํ–‰ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์€ ๋ฐ˜๋“œ์‹œ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. -- ๋„์ „ ๋ฐฉํ–ฅ - -[x] ๋ฆฌํŒฉํ„ฐ๋ง: ์ž‘๋™์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋†’์ด๋Š” ๋ฐฉํ–ฅ - -### 5) ๋ฆฌํŒฉํ† ๋ง -- [x] ์ฒดํฌ์™„๋ฃŒ ( ์ž์„ธํ•œ๊ฑด ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ฐธ๊ณ ) - -### 6) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ์‚ฌํ•ญ ์ฒดํฌ +- ๋„์ „ ๋ฐฉํ–ฅ: + -[x] ๋ฆฌํŒฉํ„ฐ๋ง: ์ž‘๋™์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋†’์ด๋Š” ๋ฐฉํ–ฅ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. +- ์ƒ์„ธ ๊ตฌํ˜„ ๋ชฉํ‘œ: + -[x] ๋งค์ง ๋„˜๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. + -[x] ๋„๋ฉ”์ธ์—์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋ฉด ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•œ๋‹ค. + -[x] private, static ์˜๋ฏธ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ + -[x] ์ด์ค‘ ๊ฒ€์ฆ(validate) ๊ตฌํ˜„ + -[x] ๋ชจ๋“  ์ฝ”๋“œ ์ •๋ ฌ + - ์ƒ์„ธ ๊ณผ์ •์€ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•˜์„ธ์š”. + + +### 5) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ์‚ฌํ•ญ ์ฒดํฌ - [x] ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ ์‚ฌํ•ญ์—์„œ ๋‹ฌ๋ฆฌ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š” ํ•œ ํŒŒ์ผ, ํŒจํ‚ค์ง€ ์ด๋ฆ„์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ด๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. - [x] ์ž๋ฐ” ์ฝ”๋“œ ์ปจ๋ฒค์…˜์„ ์ง€ํ‚ค๋ฉด์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•œ๋‹ค. - [x] ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•ด์•ผ ํ•œ๋‹ค. - -### 7) ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ๋ชฉ๋ก ์ฒดํฌ +### 6) ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ๋ชฉ๋ก ์ฒดํฌ - [x] ๊ธฐ๋Šฅํ…Œ์ŠคํŠธ: ์ „์ฒด ๊ธฐ๋Šฅ ๊ตฌํ˜„: ("1000", "1,2,3,4,5", "6") ์ž…๋ ฅ ์‹œ ์‹คํ–‰์˜ˆ์‹œ์— ๋งž๊ฒŒ ์ถœ๋ ฅ - [x] ์˜ˆ์™ธํ…Œ์ŠคํŠธ: ๊ตฌ์ž…๊ธˆ์•ก("500j") ์ž…๋ ฅ ์‹œ ์—๋Ÿฌ๋ฐœ์ƒ - [x] ์—๋Ÿฌ ํ…Œ์ŠคํŠธ: ๋กœ๋˜ ๋ฒˆํ˜ธ์˜ ๊ฐœ์ˆ˜๊ฐ€ 5๊ฐœ๊ฐ€ ๋„˜์–ด๊ฐ€๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ From 3711281e78d114a371923de1f7162423c4721548 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 16:50:10 +0900 Subject: [PATCH 33/36] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EA=B5=AC=ED=98=84=20=EA=B0=B1=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b2ec18c45..581462b5b 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,7 @@ Console์„ ์ด์šฉํ•˜์—ฌ ์šฐํ…Œ์ฝ” ๋กœ๋˜ ๋ฐœ๋งค๊ธฐ์ธ ํ–‰์„ฑ ๋กœ๋˜๋ฅผ ๊ตฌํ˜„ํ•œ - [x] ๊ตฌ์ž… ๊ธˆ์•ก์€ 500์› ๋‹จ์œ„๋กœ ์ž…๋ ฅ ๋ฐ›์œผ๋ฉฐ 500์›์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•œ๋‹ค. - [x] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ๋ณด์—ฌ์ค€๋‹ค. - [x] ์—๋Ÿฌ ๋ฌธ๊ตฌ๋Š” "[ERROR]"๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค. +- [x] OutputView์— ์žˆ๋Š” printErrorMessage ์‚ฌ์šฉํ•˜๊ธฐ ### 4) ๋„์ „ ๊ณผ์ œ - ๊ธฐ๋ณธ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋ชจ๋‘ ์ถฉ์กฑํ•œ ํ›„, ์•„๋ž˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์—ฌ ๋„์ „ํ•˜์„ธ์š”. ๋‹จ, ๋„์ „ ๊ณผ์ œ ์ˆ˜ํ–‰ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์€ ๋ฐ˜๋“œ์‹œ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. From 82ce9e5ed49e5ceaf1a6e938c059e8b90b5720f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 16:51:14 +0900 Subject: [PATCH 34/36] =?UTF-8?q?docs:=20=EB=8F=84=EC=A0=84=20=EA=B3=BC?= =?UTF-8?q?=EC=A0=9C=20->=20=EB=8F=84=EC=A0=84=20=EB=AA=A9=ED=91=9C?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 581462b5b..69f745e68 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ Console์„ ์ด์šฉํ•˜์—ฌ ์šฐํ…Œ์ฝ” ๋กœ๋˜ ๋ฐœ๋งค๊ธฐ์ธ ํ–‰์„ฑ ๋กœ๋˜๋ฅผ ๊ตฌํ˜„ํ•œ - [x] ์—๋Ÿฌ ๋ฌธ๊ตฌ๋Š” "[ERROR]"๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค. - [x] OutputView์— ์žˆ๋Š” printErrorMessage ์‚ฌ์šฉํ•˜๊ธฐ -### 4) ๋„์ „ ๊ณผ์ œ +### 4) ๋„์ „ ๋ชฉํ‘œ - ๊ธฐ๋ณธ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋ชจ๋‘ ์ถฉ์กฑํ•œ ํ›„, ์•„๋ž˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์—ฌ ๋„์ „ํ•˜์„ธ์š”. ๋‹จ, ๋„์ „ ๊ณผ์ œ ์ˆ˜ํ–‰ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์€ ๋ฐ˜๋“œ์‹œ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. - ๋„์ „ ๋ฐฉํ–ฅ: -[x] ๋ฆฌํŒฉํ„ฐ๋ง: ์ž‘๋™์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋†’์ด๋Š” ๋ฐฉํ–ฅ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. From 33ea6ccf4dd35738ecd1a5ba5909f0bc84cda17b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 16:52:04 +0900 Subject: [PATCH 35/36] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EA=B0=B1=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 69f745e68..c45d5e2aa 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,7 @@ Console์„ ์ด์šฉํ•˜์—ฌ ์šฐํ…Œ์ฝ” ๋กœ๋˜ ๋ฐœ๋งค๊ธฐ์ธ ํ–‰์„ฑ ๋กœ๋˜๋ฅผ ๊ตฌํ˜„ํ•œ - [x] ๊ตฌ์ž… ๊ธˆ์•ก์€ 500์› ๋‹จ์œ„๋กœ ์ž…๋ ฅ ๋ฐ›์œผ๋ฉฐ 500์›์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•œ๋‹ค. - [x] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ๋ณด์—ฌ์ค€๋‹ค. - [x] ์—๋Ÿฌ ๋ฌธ๊ตฌ๋Š” "[ERROR]"๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค. +- [x] ์ž…๋ ฅ/์ถœ๋ ฅ ์—ญํ• ์€ ์ œ๊ณต๋œ InputView, OutputView์—์„œ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๊ธฐ์กด ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜์ •, ์‚ญ์ œํ•  ์ˆ˜ ์—†๋‹ค. - [x] OutputView์— ์žˆ๋Š” printErrorMessage ์‚ฌ์šฉํ•˜๊ธฐ ### 4) ๋„์ „ ๋ชฉํ‘œ From aa1de421103cc0f94b3494c9768a2a7bfcc310f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sat, 10 Jan 2026 16:56:01 +0900 Subject: [PATCH 36/36] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EA=B0=B1=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index c45d5e2aa..694f4632d 100644 --- a/README.md +++ b/README.md @@ -80,13 +80,13 @@ Console์„ ์ด์šฉํ•˜์—ฌ ์šฐํ…Œ์ฝ” ๋กœ๋˜ ๋ฐœ๋งค๊ธฐ์ธ ํ–‰์„ฑ ๋กœ๋˜๋ฅผ ๊ตฌํ˜„ํ•œ ### 4) ๋„์ „ ๋ชฉํ‘œ - ๊ธฐ๋ณธ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋ชจ๋‘ ์ถฉ์กฑํ•œ ํ›„, ์•„๋ž˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์—ฌ ๋„์ „ํ•˜์„ธ์š”. ๋‹จ, ๋„์ „ ๊ณผ์ œ ์ˆ˜ํ–‰ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์€ ๋ฐ˜๋“œ์‹œ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. - ๋„์ „ ๋ฐฉํ–ฅ: - -[x] ๋ฆฌํŒฉํ„ฐ๋ง: ์ž‘๋™์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋†’์ด๋Š” ๋ฐฉํ–ฅ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. + - [x] ๋ฆฌํŒฉํ„ฐ๋ง: ์ž‘๋™์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋†’์ด๋Š” ๋ฐฉํ–ฅ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. - ์ƒ์„ธ ๊ตฌํ˜„ ๋ชฉํ‘œ: - -[x] ๋งค์ง ๋„˜๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. - -[x] ๋„๋ฉ”์ธ์—์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋ฉด ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•œ๋‹ค. - -[x] private, static ์˜๋ฏธ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ - -[x] ์ด์ค‘ ๊ฒ€์ฆ(validate) ๊ตฌํ˜„ - -[x] ๋ชจ๋“  ์ฝ”๋“œ ์ •๋ ฌ + - [x] ๋งค์ง ๋„˜๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. + - [x] ๋„๋ฉ”์ธ์—์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋ฉด ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•œ๋‹ค. + - [x] private, static ์˜๋ฏธ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ + - [x] ์ด์ค‘ ๊ฒ€์ฆ(validate) ๊ตฌํ˜„ + - [x] ๋ชจ๋“  ์ฝ”๋“œ ์ •๋ ฌ - ์ƒ์„ธ ๊ณผ์ •์€ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•˜์„ธ์š”.