From 0a48381e79ca88d1924fd2c3283f944a6e4c9b3a Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Sun, 26 Oct 2025 00:01:02 +0900 Subject: [PATCH 01/27] =?UTF-8?q?docs:=20README=EC=97=90=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d0286c859f..466d0d7856 100644 --- a/README.md +++ b/README.md @@ -1 +1,52 @@ -# java-racingcar-precourse +# ๐Ÿš— ์ž๋™์ฐจ ๊ฒฝ์ฃผ โ€“ ๊ธฐ๋Šฅ ์š”๊ตฌ ์‚ฌํ•ญ (์ปค๋ฐ‹ ๋‹จ์œ„) + +## 1. ์ž…๋ ฅ ์ฒ˜๋ฆฌ +- [ ] ์ž๋™์ฐจ ์ด๋ฆ„ ์ž…๋ ฅ๋ฐ›๊ธฐ + - [ ] ์ฝ˜์†”์—์„œ ํ•œ ์ค„ ์ž…๋ ฅ์œผ๋กœ ์ด๋ฆ„ ๋ชฉ๋ก์„ ๋ฐ›๋Š”๋‹ค (์˜ˆ: `pobi,woni,jun`). + - [ ] ์ด๋ฆ„ ๊ตฌ๋ถ„์ž๋Š” ์‰ผํ‘œ(,)๋งŒ ํ—ˆ์šฉํ•œ๋‹ค. + - [ ] ๊ฐ ์ด๋ฆ„์€ 5์ž ์ดํ•˜์—ฌ์•ผ ํ•œ๋‹ค โ†’ ์•„๋‹ˆ๋ฉด `IllegalArgumentException`. + - [ ] ๋นˆ ์ด๋ฆ„(์˜ˆ: `pobi,,jun`) ๋˜๋Š” ๊ณต๋ฐฑ๋งŒ ์ž…๋ ฅ๋œ ์ด๋ฆ„์ด ์žˆ์œผ๋ฉด `IllegalArgumentException`. +- [ ] ์ด๋™ ํšŸ์ˆ˜ ์ž…๋ ฅ๋ฐ›๊ธฐ + - [ ] ์ฝ˜์†”์—์„œ ํ•œ ์ค„ ์ž…๋ ฅ์œผ๋กœ ์ •์ˆ˜๋ฅผ ๋ฐ›๋Š”๋‹ค (์˜ˆ: `5`). + - [ ] ์ •์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฐ’์ด๋ฉด `IllegalArgumentException`. + - [ ] ์Œ์ˆ˜/0 ๋“ฑ ์œ ํšจํ•˜์ง€ ์•Š์€ ์‹œ๋„ ํšŸ์ˆ˜๋ฉด `IllegalArgumentException`. + +--- + +## 2. ์ž๋™์ฐจ ์ƒํƒœ ์ดˆ๊ธฐํ™” +- [ ] ์ž…๋ ฅ๋œ ์ด๋ฆ„๋“ค๋กœ ์ž๋™์ฐจ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. +- [ ] ๊ฐ ์ž๋™์ฐจ์˜ ์ดˆ๊ธฐ ์ด๋™๊ฑฐ๋ฆฌ = 0 ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. + +--- + +## 3. ๋ผ์šด๋“œ ์ง„ํ–‰ (์‹œ๋„ ํšŸ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต) +- [ ] ๋งค ๋ผ์šด๋“œ์—์„œ ๋ชจ๋“  ์ž๋™์ฐจ์— ๋Œ€ํ•ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. + - [ ] ๋ฌด์ž‘์œ„ ์ •์ˆ˜ 0~9 ํ•˜๋‚˜๋ฅผ ๋ฝ‘๋Š”๋‹ค (`Randoms.pickNumberInRange(0, 9)` ์‚ฌ์šฉ). + - [ ] ๊ฐ’์ด 4 ์ด์ƒ์ด๋ฉด ํ•ด๋‹น ์ž๋™์ฐจ์˜ ์ด๋™๊ฑฐ๋ฆฌ๋ฅผ +1 ํ•œ๋‹ค. + - [ ] ๊ฐ’์ด 3 ์ดํ•˜๋ฉด ์ด๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. +- [ ] ๋ผ์šด๋“œ ์ข…๋ฃŒ ์‹œ ๊ฒฐ๊ณผ ์ถœ๋ ฅ + - [ ] ๊ฐ ์ž๋™์ฐจ์— ๋Œ€ํ•ด `์ด๋ฆ„ : ----` ํ˜•์‹์œผ๋กœ ํ˜„์žฌ๊นŒ์ง€์˜ ์ด๋™๊ฑฐ๋ฆฌ๋ฅผ ๋ง‰๋Œ€(`-`)๋กœ ์ถœ๋ ฅํ•œ๋‹ค. + - [ ] ์ถœ๋ ฅ์€ ์ž๋™์ฐจ ์ž…๋ ฅ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. + - [ ] ๋งค ๋ผ์šด๋“œ ์ถœ๋ ฅ ์‚ฌ์ด์— ๋นˆ ์ค„ ์—†์ด ์˜ˆ์‹œ์™€ ๋™์ผํ•œ ํ˜•์‹์œผ๋กœ ๋ˆ„์  ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. + - ์˜ˆ) + ``` + pobi : -- + woni : --- + jun : - + ``` + +--- + +## 4. ์šฐ์Šน์ž ํŒ๋ณ„ ๋ฐ ์ถœ๋ ฅ +- [ ] ๋ชจ๋“  ๋ผ์šด๋“œ ์ข…๋ฃŒ ํ›„ ์ตœ๋Œ€ ์ด๋™๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ๋‹ค. +- [ ] ์ตœ๋Œ€ ์ด๋™๊ฑฐ๋ฆฌ์™€ ๊ฐ™์•„์ง„ ์ž๋™์ฐจ๋“ค์„ ์šฐ์Šน์ž ๋ชฉ๋ก์œผ๋กœ ๋งŒ๋“ ๋‹ค. +- [ ] ์šฐ์Šน์ž๊ฐ€ ์—ฌ๋Ÿฌ ๋ช…์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฆ„์„ ์‰ผํ‘œ(,) ๋กœ ์—ฐ๊ฒฐํ•ด ์ถœ๋ ฅํ•œ๋‹ค. +- [ ] ์ถœ๋ ฅ ํ˜•์‹์€ ์ •ํ™•ํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. + - [ ] ๋‹จ๋… ์šฐ์Šน: `์ตœ์ข… ์šฐ์Šน์ž : pobi` + - [ ] ๊ณต๋™ ์šฐ์Šน: `์ตœ์ข… ์šฐ์Šน์ž : pobi, jun` + +--- + +## 5. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ +- [ ] ์ž…๋ ฅ ํ˜•์‹์ด ์ž˜๋ชป๋œ ๊ฒฝ์šฐ ์ฆ‰์‹œ `IllegalArgumentException` ๋ฐœ์ƒ. +- [ ] ์˜ˆ์™ธ ๋ฐœ์ƒ ํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ข…๋ฃŒํ•œ๋‹ค. From f406be65572a553c1829acbb6cc15ba1647bab93 Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Sun, 26 Oct 2025 14:55:41 +0900 Subject: [PATCH 02/27] =?UTF-8?q?feat:=20=EA=B8=B0=EB=B3=B8=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EA=B5=AC=EC=84=B1=20=EB=B0=8F=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=20=EA=B5=AC=EC=A1=B0=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Application ์ง„์ž…์ (main)๊ณผ RacingController ์‹คํ–‰ ํ๋ฆ„์„ ๊ตฌ์„ฑํ–ˆ๋‹ค. domain, controller, view, util ํŒจํ‚ค์ง€์™€ ํ•„์š”ํ•œ ๊ธฐ๋ณธ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด ๊ณ„์ธต๋ณ„ ๊ตฌ์กฐ๋ฅผ ๊ฐ–์ถ”๊ณ  ์ดํ›„ ๊ธฐ๋Šฅ ํ™•์žฅ ๊ธฐ๋ฐ˜์„ ๋งˆ๋ จํ•จ. --- src/main/java/racingcar/Application.java | 5 ++++- src/main/java/racingcar/controller/RacingController.java | 6 ++++++ src/main/java/racingcar/domain/Car.java | 4 ++++ src/main/java/racingcar/domain/Cars.java | 4 ++++ src/main/java/racingcar/util/RandomNumberGenerator.java | 4 ++++ src/main/java/racingcar/util/Validator.java | 4 ++++ src/main/java/racingcar/view/InputView.java | 4 ++++ src/main/java/racingcar/view/OutputView.java | 5 +++++ 8 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 src/main/java/racingcar/controller/RacingController.java create mode 100644 src/main/java/racingcar/domain/Car.java create mode 100644 src/main/java/racingcar/domain/Cars.java create mode 100644 src/main/java/racingcar/util/RandomNumberGenerator.java create mode 100644 src/main/java/racingcar/util/Validator.java create mode 100644 src/main/java/racingcar/view/InputView.java create mode 100644 src/main/java/racingcar/view/OutputView.java diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e724..3a853e0280 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,10 @@ package racingcar; +import racingcar.controller.RacingController; + public class Application { public static void main(String[] args) { - // TODO: ํ”„๋กœ๊ทธ๋žจ ๊ตฌํ˜„ + RacingController racingController = new RacingController(); + racingController.start(); } } diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java new file mode 100644 index 0000000000..a54201c932 --- /dev/null +++ b/src/main/java/racingcar/controller/RacingController.java @@ -0,0 +1,6 @@ +package racingcar.controller; + +public class RacingController { + public void start(){ + } +} diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java new file mode 100644 index 0000000000..a4523d1a65 --- /dev/null +++ b/src/main/java/racingcar/domain/Car.java @@ -0,0 +1,4 @@ +package racingcar.domain; + +public class Car { +} diff --git a/src/main/java/racingcar/domain/Cars.java b/src/main/java/racingcar/domain/Cars.java new file mode 100644 index 0000000000..1303b05b66 --- /dev/null +++ b/src/main/java/racingcar/domain/Cars.java @@ -0,0 +1,4 @@ +package racingcar.domain; + +public class Cars { +} diff --git a/src/main/java/racingcar/util/RandomNumberGenerator.java b/src/main/java/racingcar/util/RandomNumberGenerator.java new file mode 100644 index 0000000000..a388d22b1d --- /dev/null +++ b/src/main/java/racingcar/util/RandomNumberGenerator.java @@ -0,0 +1,4 @@ +package racingcar.util; + +public class RandomNumberGenerator { +} diff --git a/src/main/java/racingcar/util/Validator.java b/src/main/java/racingcar/util/Validator.java new file mode 100644 index 0000000000..23a7e9dc85 --- /dev/null +++ b/src/main/java/racingcar/util/Validator.java @@ -0,0 +1,4 @@ +package racingcar.util; + +public class Validator { +} diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java new file mode 100644 index 0000000000..2361ba2f5a --- /dev/null +++ b/src/main/java/racingcar/view/InputView.java @@ -0,0 +1,4 @@ +package racingcar.view; + +public class InputView { +} diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java new file mode 100644 index 0000000000..47586ad638 --- /dev/null +++ b/src/main/java/racingcar/view/OutputView.java @@ -0,0 +1,5 @@ +package racingcar.view; + +public class OutputView { + +} From 1b5db61cefb7078a361363deae3814b18ad4344a Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Sun, 26 Oct 2025 15:14:07 +0900 Subject: [PATCH 03/27] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=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 RacingController์—์„œ InputView.readInput์„ ํ˜ธ์ถœํ•ด ์ž…๋ ฅ ํ๋ฆ„์„ ์—ฐ๊ฒฐํ•จ. ์ฝ˜์†”์—์„œ ์ž๋™์ฐจ ์ด๋ฆ„์„ ์ž…๋ ฅ๋ฐ›์•„ ์‰ผํ‘œ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ๊ฐ ์ด๋ฆ„์˜ ์•ž๋’ค ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•ด ๋ชฉ๋ก ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๊ตฌํ˜„ํ•จ. --- .../java/racingcar/controller/RacingController.java | 5 +++++ src/main/java/racingcar/view/InputView.java | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index a54201c932..048535815c 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -1,6 +1,11 @@ package racingcar.controller; +import racingcar.view.InputView; + public class RacingController { + InputView inputView = new InputView(); + public void start(){ + String[] carNames = inputView.readInput(); } } diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java index 2361ba2f5a..f67972a9f5 100644 --- a/src/main/java/racingcar/view/InputView.java +++ b/src/main/java/racingcar/view/InputView.java @@ -1,4 +1,17 @@ package racingcar.view; +import camp.nextstep.edu.missionutils.Console; + public class InputView { + public String[] readInput(){ + System.out.println("๊ฒฝ์ฃผํ•  ์ž๋™์ฐจ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.(์ด๋ฆ„์€ ์‰ผํ‘œ(,) ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„)"); + String input = Console.readLine(); + String[] carNames = input.split(","); + + for(int i=0;i Date: Sun, 26 Oct 2025 15:31:45 +0900 Subject: [PATCH 04/27] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80?= =?UTF-8?q?=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 ์ž๋™์ฐจ ์ด๋ฆ„์ด 5์ž๋ฅผ ์ดˆ๊ณผํ•˜๊ฑฐ๋‚˜ ๋นˆ ๋ฌธ์ž์—ด, ๊ณต๋ฐฑ๋งŒ ํฌํ•จ๋œ ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋„๋ก ๊ฒ€์ฆ์„ ์ ์šฉํ•จ. ๊ธฐ์กด Validator์—์„œ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•ด ๊ฐ ์ด๋ฆ„ ์ž…๋ ฅ ์‹œ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•จ. --- src/main/java/racingcar/util/Validator.java | 12 +++++++++++- src/main/java/racingcar/view/InputView.java | 2 ++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/racingcar/util/Validator.java b/src/main/java/racingcar/util/Validator.java index 23a7e9dc85..18cd73b6e0 100644 --- a/src/main/java/racingcar/util/Validator.java +++ b/src/main/java/racingcar/util/Validator.java @@ -1,4 +1,14 @@ package racingcar.util; -public class Validator { +public final class Validator { + private Validator() {} + + public static void validateCarName(String name) { + if (name.isBlank()) { + throw new IllegalArgumentException("์ž๋™์ฐจ ์ด๋ฆ„์€ ๊ณต๋ฐฑ์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."); + } + if (name.length() > 5) { + throw new IllegalArgumentException("์ž๋™์ฐจ ์ด๋ฆ„์€ 5์ž ์ดํ•˜๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค."); + } + } } diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java index f67972a9f5..07f41c16ad 100644 --- a/src/main/java/racingcar/view/InputView.java +++ b/src/main/java/racingcar/view/InputView.java @@ -1,6 +1,7 @@ package racingcar.view; import camp.nextstep.edu.missionutils.Console; +import racingcar.util.Validator; public class InputView { public String[] readInput(){ @@ -10,6 +11,7 @@ public String[] readInput(){ for(int i=0;i Date: Sun, 26 Oct 2025 15:39:05 +0900 Subject: [PATCH 05/27] =?UTF-8?q?feat:=20=EC=8B=9C=EB=8F=84=20=ED=9A=9F?= =?UTF-8?q?=EC=88=98=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=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 ์ฝ˜์†”์—์„œ ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค. InputView์— readAttemptCount ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ์œผ๋ฉฐ, ๊ธฐ์กด readInput ๋ฉ”์„œ๋“œ๋Š” ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด readCarNames๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ–ˆ๋‹ค. --- src/main/java/racingcar/controller/RacingController.java | 3 ++- src/main/java/racingcar/view/InputView.java | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index 048535815c..d6432fba39 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -6,6 +6,7 @@ public class RacingController { InputView inputView = new InputView(); public void start(){ - String[] carNames = inputView.readInput(); + String[] carNames = inputView.readCarNames(); + int attemptCount = inputView.readAttemptCount(); } } diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java index 07f41c16ad..d7200ac7f8 100644 --- a/src/main/java/racingcar/view/InputView.java +++ b/src/main/java/racingcar/view/InputView.java @@ -4,7 +4,7 @@ import racingcar.util.Validator; public class InputView { - public String[] readInput(){ + public String[] readCarNames(){ System.out.println("๊ฒฝ์ฃผํ•  ์ž๋™์ฐจ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.(์ด๋ฆ„์€ ์‰ผํ‘œ(,) ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„)"); String input = Console.readLine(); String[] carNames = input.split(","); @@ -16,4 +16,11 @@ public String[] readInput(){ return carNames; } + + public int readAttemptCount(){ + System.out.println("์‹œ๋„ํ•  ํšŸ์ˆ˜๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”."); + String input = Console.readLine(); + int attemptCount = Integer.parseInt(input); + return attemptCount; + } } From a2bcc918c6d6036a16a9981e62b93e894df1d956 Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Sun, 26 Oct 2025 15:49:45 +0900 Subject: [PATCH 06/27] =?UTF-8?q?feat:=20=EC=8B=9C=EB=8F=84=20=ED=9A=9F?= =?UTF-8?q?=EC=88=98=20=EC=9E=85=EB=A0=A5=EA=B0=92=20=EA=B2=80=EC=A6=9D=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 ์‹œ๋„ ํšŸ์ˆ˜๊ฐ€ 1 ์ดํ•˜์ผ ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ , ์ •์ˆ˜๊ฐ€ ์•„๋‹Œ ์ž…๋ ฅ์— ๋Œ€ํ•ด NumberFormatException์„ IllegalArgumentException์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋„๋ก ์ฒ˜๋ฆฌํ–ˆ๋‹ค. Validator ํด๋ž˜์Šค์— validateAttemptCount ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ž…๋ ฅ๊ฐ’ ๊ฒ€์ฆ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ–ˆ๋‹ค. --- src/main/java/racingcar/util/Validator.java | 6 ++++++ src/main/java/racingcar/view/InputView.java | 10 ++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/racingcar/util/Validator.java b/src/main/java/racingcar/util/Validator.java index 18cd73b6e0..93df705258 100644 --- a/src/main/java/racingcar/util/Validator.java +++ b/src/main/java/racingcar/util/Validator.java @@ -11,4 +11,10 @@ public static void validateCarName(String name) { throw new IllegalArgumentException("์ž๋™์ฐจ ์ด๋ฆ„์€ 5์ž ์ดํ•˜๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค."); } } + + public static void validateAttemptCount(int count) { + if (count <= 0) { + throw new IllegalArgumentException("์‹œ๋„ ํšŸ์ˆ˜๋Š” 1ํšŒ ์ด์ƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } + } } diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java index d7200ac7f8..ff8823f2a7 100644 --- a/src/main/java/racingcar/view/InputView.java +++ b/src/main/java/racingcar/view/InputView.java @@ -20,7 +20,13 @@ public String[] readCarNames(){ public int readAttemptCount(){ System.out.println("์‹œ๋„ํ•  ํšŸ์ˆ˜๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”."); String input = Console.readLine(); - int attemptCount = Integer.parseInt(input); - return attemptCount; + + try { + int attemptCount = Integer.parseInt(input); + Validator.validateAttemptCount(attemptCount); + return attemptCount; + } catch (NumberFormatException e) { + throw new IllegalArgumentException("์‹œ๋„ ํšŸ์ˆ˜๋Š” ์ •์ˆ˜๋งŒ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."); + } } } From 26cb5a160d35693d478d1943a5bc92cc74615107 Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Mon, 27 Oct 2025 14:17:49 +0900 Subject: [PATCH 07/27] =?UTF-8?q?feat:=20Car=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=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 ์ž๋™์ฐจ์˜ ์ด๋ฆ„๊ณผ ์œ„์น˜๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ๋‚œ์ˆ˜ ๊ฐ’์ด 4 ์ด์ƒ์ผ ๋•Œ ์ „์ง„ํ•˜๋Š” move ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค. ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด getName๊ณผ getPosition ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•จ. --- src/main/java/racingcar/domain/Car.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java index a4523d1a65..b4cbc7a002 100644 --- a/src/main/java/racingcar/domain/Car.java +++ b/src/main/java/racingcar/domain/Car.java @@ -1,4 +1,17 @@ package racingcar.domain; public class Car { + private final String name; + private int position = 0; + + public Car(String name) { + this.name = name; + } + + public void move(int randomNumber) { + if (randomNumber >= 4) position++; + } + + public String getName() { return name; } + public int getPosition() { return position; } } From 99cea7ef41565cc3c5ea71ba1521c017cb829b84 Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Mon, 27 Oct 2025 16:47:46 +0900 Subject: [PATCH 08/27] =?UTF-8?q?feat:=20RandomNumberGenerator=20=EC=9C=A0?= =?UTF-8?q?=ED=8B=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ํ”„๋กœ์ ํŠธ ์ „๋ฐ˜์—์„œ ์ผ๊ด€๋œ ๋žœ๋ค ์ •์ˆ˜ ์ƒ์„ฑ์„ ์œ„ํ•ด ๋ฒ”์œ„ ๊ธฐ๋ฐ˜ ๋žœ๋ค ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•จ. final ํด๋ž˜์Šค์™€ private ์ƒ์„ฑ์ž๋ฅผ ์ ์šฉํ•ด ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋ฐฉ์ง€ํ•จ. --- .../java/racingcar/util/RandomNumberGenerator.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/racingcar/util/RandomNumberGenerator.java b/src/main/java/racingcar/util/RandomNumberGenerator.java index a388d22b1d..6bc74b8304 100644 --- a/src/main/java/racingcar/util/RandomNumberGenerator.java +++ b/src/main/java/racingcar/util/RandomNumberGenerator.java @@ -1,4 +1,11 @@ package racingcar.util; -public class RandomNumberGenerator { -} +import camp.nextstep.edu.missionutils.Randoms; + +public final class RandomNumberGenerator { + private RandomNumberGenerator() {} + + public static int generateInRange(int start, int end) { + return Randoms.pickNumberInRange(start, end); + } +} \ No newline at end of file From a669b7fd9a0b2bcdf22aeab674a7b441ea5a58a6 Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Mon, 27 Oct 2025 17:13:23 +0900 Subject: [PATCH 09/27] =?UTF-8?q?feat:=20Cars=20=EC=9D=BC=EA=B8=89=20?= =?UTF-8?q?=EC=BB=AC=EB=A0=89=EC=85=98=20=EA=B5=AC=ED=98=84=20=EB=B0=8F=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ์ž๋™์ฐจ ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ Cars ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•จ. List.copyOf()๋กœ ์™ธ๋ถ€ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ถˆ๋ณ€ ๋ณต์‚ฌํ•˜์—ฌ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ๋ณดํ˜ธํ•จ. moveAll() ๋ฉ”์„œ๋“œ๋กœ ๋ชจ๋“  ์ž๋™์ฐจ๋ฅผ ์ผ๊ด„ ์ด๋™์‹œํ‚ค๊ณ , RandomNumberGenerator๋ฅผ ํ™œ์šฉํ•ด ๋žœ๋ค ๊ฐ’ ์ƒ์„ฑ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•จ. --- src/main/java/racingcar/domain/Cars.java | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/main/java/racingcar/domain/Cars.java b/src/main/java/racingcar/domain/Cars.java index 1303b05b66..2a110f7500 100644 --- a/src/main/java/racingcar/domain/Cars.java +++ b/src/main/java/racingcar/domain/Cars.java @@ -1,4 +1,28 @@ package racingcar.domain; +import racingcar.util.RandomNumberGenerator; + +import java.util.Collections; +import java.util.List; + public class Cars { + private static final int RANDOM_MIN = 0; + private static final int RANDOM_MAX = 9; + + private final List cars; + + public Cars(List cars) { + this.cars = List.copyOf(cars); + } + + public void moveAll() { + for (Car car : cars) { + int random = RandomNumberGenerator.generateInRange(RANDOM_MIN, RANDOM_MAX); + car.move(random); + } + } + + public List getCars() { + return Collections.unmodifiableList(cars); + } } From ac90e8c334c7e56edc4b4a57061790fdcfd01710 Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Mon, 27 Oct 2025 17:25:00 +0900 Subject: [PATCH 10/27] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EC=9C=BC=EB=A1=9C=20=EC=9E=90=EB=8F=99?= =?UTF-8?q?=EC=B0=A8=20=EB=AA=A9=EB=A1=9D=20=EC=B4=88=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit InputView์—์„œ ์ž…๋ ฅ๋ฐ›์€ ์ž๋™์ฐจ ์ด๋ฆ„ ๋ฐฐ์—ด์„ Car ๊ฐ์ฒด ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Cars ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ฒฝ์ฃผ ์ค€๋น„ ๋‹จ๊ณ„์˜ ์ดˆ๊ธฐํ™”๋ฅผ ์™„๋ฃŒํ•จ. --- .../java/racingcar/controller/RacingController.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index d6432fba39..2065773d1a 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -1,12 +1,24 @@ package racingcar.controller; +import racingcar.domain.Car; +import racingcar.domain.Cars; import racingcar.view.InputView; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + public class RacingController { InputView inputView = new InputView(); public void start(){ String[] carNames = inputView.readCarNames(); int attemptCount = inputView.readAttemptCount(); + + List carList = Arrays.stream(carNames) + .map(Car::new) + .collect(Collectors.toList()); + + Cars cars = new Cars(carList); } } From 9c65ce393c996c7076ff49a5bce1c95e1557e45c Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Mon, 27 Oct 2025 17:50:51 +0900 Subject: [PATCH 11/27] =?UTF-8?q?refactor:=20=EC=9E=90=EB=8F=99=EC=B0=A8?= =?UTF-8?q?=20=EC=9D=B4=EB=A6=84=20=EC=9E=85=EB=A0=A5=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=20=ED=83=80=EC=9E=85=EC=9D=84=20List=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit readCarNames()์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ String[]์—์„œ List์œผ๋กœ ๋ณ€๊ฒฝํ•จ. ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ๊ณผ์ •์„ ๋‹จ์ˆœํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๊ณ  ์ฝ”๋“œ ํ๋ฆ„์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ฆ. --- .../racingcar/controller/RacingController.java | 8 +++----- src/main/java/racingcar/view/InputView.java | 16 ++++++++-------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index 2065773d1a..d848e13217 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -4,20 +4,18 @@ import racingcar.domain.Cars; import racingcar.view.InputView; -import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; public class RacingController { InputView inputView = new InputView(); public void start(){ - String[] carNames = inputView.readCarNames(); + List carNames = inputView.readCarNames(); int attemptCount = inputView.readAttemptCount(); - List carList = Arrays.stream(carNames) + List carList = carNames.stream() .map(Car::new) - .collect(Collectors.toList()); + .toList(); Cars cars = new Cars(carList); } diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java index ff8823f2a7..af93ba7e7b 100644 --- a/src/main/java/racingcar/view/InputView.java +++ b/src/main/java/racingcar/view/InputView.java @@ -3,18 +3,18 @@ import camp.nextstep.edu.missionutils.Console; import racingcar.util.Validator; +import java.util.Arrays; +import java.util.List; + public class InputView { - public String[] readCarNames(){ + public List readCarNames(){ System.out.println("๊ฒฝ์ฃผํ•  ์ž๋™์ฐจ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.(์ด๋ฆ„์€ ์‰ผํ‘œ(,) ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„)"); String input = Console.readLine(); - String[] carNames = input.split(","); - - for(int i=0;i Date: Mon, 27 Oct 2025 17:54:08 +0900 Subject: [PATCH 12/27] =?UTF-8?q?refactor:=20RacingController=EC=97=90=20f?= =?UTF-8?q?inal=20=ED=95=84=EB=93=9C=20=EC=A0=81=EC=9A=A9=20=EB=B0=8F=20Ou?= =?UTF-8?q?tputView=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit InputView๋ฅผ final ํ•„๋“œ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ฐธ์กฐ์˜ ์žฌํ• ๋‹น์„ ๋ฐฉ์ง€ํ•˜๊ณ , ๊ฒฐ๊ณผ ์ถœ๋ ฅ์„ ์œ„ํ•œ OutputView ํ•„๋“œ๋ฅผ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•จ. --- src/main/java/racingcar/controller/RacingController.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index d848e13217..95f33fbb12 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -3,11 +3,13 @@ import racingcar.domain.Car; import racingcar.domain.Cars; import racingcar.view.InputView; +import racingcar.view.OutputView; import java.util.List; public class RacingController { - InputView inputView = new InputView(); + private final InputView inputView = new InputView(); + private final OutputView outputView = new OutputView(); public void start(){ List carNames = inputView.readCarNames(); @@ -18,5 +20,6 @@ public void start(){ .toList(); Cars cars = new Cars(carList); + } } From f4d9fa9b84c1edf5fa3f63a1045f76ace26262d2 Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Mon, 27 Oct 2025 18:20:15 +0900 Subject: [PATCH 13/27] =?UTF-8?q?feat:=20=EC=9D=B4=EB=8F=99=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=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 OutputView์—์„œ ๊ฐ ์ž๋™์ฐจ์˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ "์ด๋ฆ„ : ---" ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅํ•˜๋„๋ก ๊ตฌํ˜„ํ•จ. ์ถœ๋ ฅ ํ˜•์‹ ๋ฐ ๋™์ž‘ ๊ฒ€์ฆ์„ ์œ„ํ•ด ์ž„์‹œ๋กœ Cars.moveAll() ํ˜ธ์ถœ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•จ. --- .../java/racingcar/controller/RacingController.java | 2 ++ src/main/java/racingcar/view/OutputView.java | 10 +++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index 95f33fbb12..094c10d05a 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -20,6 +20,8 @@ public void start(){ .toList(); Cars cars = new Cars(carList); + cars.moveAll(); + outputView.printRoundResult(cars); } } diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java index 47586ad638..12a1ef35a8 100644 --- a/src/main/java/racingcar/view/OutputView.java +++ b/src/main/java/racingcar/view/OutputView.java @@ -1,5 +1,13 @@ package racingcar.view; -public class OutputView { +import racingcar.domain.Car; +import racingcar.domain.Cars; +public class OutputView { + public void printRoundResult(Cars cars) { + for (Car car : cars.getCars()) { + System.out.println(car.getName() + " : " + "-".repeat(car.getPosition())); + } + System.out.println(); + } } From cd0a0d78b1d8764cab494a13881076361b1470c6 Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Mon, 27 Oct 2025 18:32:53 +0900 Subject: [PATCH 14/27] =?UTF-8?q?feat:=20=EC=A0=84=EC=B2=B4=20=EC=8B=9C?= =?UTF-8?q?=EB=8F=84=20=ED=9A=9F=EC=88=98=EB=A7=8C=ED=81=BC=20=EB=9D=BC?= =?UTF-8?q?=EC=9A=B4=EB=93=9C=20=EB=B0=98=EB=B3=B5=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 ์ž…๋ ฅ๋ฐ›์€ ์‹œ๋„ ํšŸ์ˆ˜(attemptCount)๋งŒํผ ์ž๋™์ฐจ ์ด๋™๊ณผ ๊ฒฐ๊ณผ ์ถœ๋ ฅ์„ ๋ฐ˜๋ณต ์‹คํ–‰ํ•˜๋„๋ก ๊ตฌํ˜„ํ•จ. ๊ฒฝ์ฃผ๊ฐ€ ์—ฌ๋Ÿฌ ๋ผ์šด๋“œ์— ๊ฑธ์ณ ์ง„ํ–‰๋˜๋„๋ก ํ•˜์—ฌ ์‹ค์ œ ๊ฒŒ์ž„ ํ๋ฆ„์„ ์™„์„ฑํ•จ. --- src/main/java/racingcar/controller/RacingController.java | 7 +++++-- src/main/java/racingcar/view/OutputView.java | 4 ++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index 094c10d05a..951973f4b6 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -20,8 +20,11 @@ public void start(){ .toList(); Cars cars = new Cars(carList); - cars.moveAll(); - outputView.printRoundResult(cars); + outputView.printStartMessage(); + for (int i = 0; i < attemptCount; i++) { + cars.moveAll(); + outputView.printRoundResult(cars); + } } } diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java index 12a1ef35a8..d482e510e7 100644 --- a/src/main/java/racingcar/view/OutputView.java +++ b/src/main/java/racingcar/view/OutputView.java @@ -4,6 +4,10 @@ import racingcar.domain.Cars; public class OutputView { + public void printStartMessage() { + System.out.println("\n์‹คํ–‰ ๊ฒฐ๊ณผ"); + } + public void printRoundResult(Cars cars) { for (Car car : cars.getCars()) { System.out.println(car.getName() + " : " + "-".repeat(car.getPosition())); From 4df4983c46ebbac8d0cda3ff5a558197e4021f13 Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Mon, 27 Oct 2025 19:13:10 +0900 Subject: [PATCH 15/27] =?UTF-8?q?feat:=20=EC=B5=9C=EC=A2=85=20=EC=9A=B0?= =?UTF-8?q?=EC=8A=B9=EC=9E=90=20=ED=8C=90=EB=B3=84=20=EB=A1=9C=EC=A7=81=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 ๋ชจ๋“  ์ž๋™์ฐจ ์ค‘ ๊ฐ€์žฅ ๋ฉ€๋ฆฌ ์ด๋™ํ•œ ์ž๋™์ฐจ๋ฅผ ์ฐพ์•„ ์šฐ์Šน์ž๋กœ ์„ ์ •ํ•˜๋Š” ๋กœ์ง์„ Cars์— ์ถ”๊ฐ€ํ•จ. ์ตœ๋Œ€ position ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๋™์ ์ž๋„ ํ•จ๊ป˜ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด ๊ณต๋™ ์šฐ์Šน ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•จ. --- src/main/java/racingcar/domain/Cars.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/racingcar/domain/Cars.java b/src/main/java/racingcar/domain/Cars.java index 2a110f7500..4ea1537f4c 100644 --- a/src/main/java/racingcar/domain/Cars.java +++ b/src/main/java/racingcar/domain/Cars.java @@ -4,6 +4,7 @@ import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; public class Cars { private static final int RANDOM_MIN = 0; @@ -25,4 +26,15 @@ public void moveAll() { public List getCars() { return Collections.unmodifiableList(cars); } + + public List getWinners() { + int maxPosition = cars.stream() + .mapToInt(Car::getPosition) + .max() + .orElse(0); + + return cars.stream() + .filter(car -> car.getPosition() == maxPosition) + .collect(Collectors.toList()); + } } From a6f80f485baf910f8d9780b33a988ce738c9aa38 Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Mon, 27 Oct 2025 19:45:04 +0900 Subject: [PATCH 16/27] =?UTF-8?q?feat:=20=EC=B5=9C=EC=A2=85=20=EC=9A=B0?= =?UTF-8?q?=EC=8A=B9=EC=9E=90=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=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 ๊ฒฝ์ฃผ ์ข…๋ฃŒ ํ›„ Cars.getWinners()๋กœ ๊ณ„์‚ฐ๋œ ์šฐ์Šน์ž ๋ชฉ๋ก์„ OutputView์—์„œ "์ตœ์ข… ์šฐ์Šน์ž : pobi, jun" ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅํ•˜๋„๋ก ๊ตฌํ˜„ํ•จ. ๋ณต์ˆ˜ ์šฐ์Šน์ž๋„ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•ด ํ‘œ์‹œํ•˜๋ฉฐ, ๊ฒฝ์ฃผ์˜ ๊ฒฐ๊ณผ ํ๋ฆ„์„ ์™„์„ฑํ•จ. --- .../java/racingcar/controller/RacingController.java | 1 + src/main/java/racingcar/view/OutputView.java | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index 951973f4b6..acb114c497 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -26,5 +26,6 @@ public void start(){ cars.moveAll(); outputView.printRoundResult(cars); } + outputView.printWinners(cars.getWinners()); } } diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java index d482e510e7..058583427d 100644 --- a/src/main/java/racingcar/view/OutputView.java +++ b/src/main/java/racingcar/view/OutputView.java @@ -3,6 +3,9 @@ import racingcar.domain.Car; import racingcar.domain.Cars; +import java.util.List; +import java.util.stream.Collectors; + public class OutputView { public void printStartMessage() { System.out.println("\n์‹คํ–‰ ๊ฒฐ๊ณผ"); @@ -14,4 +17,11 @@ public void printRoundResult(Cars cars) { } System.out.println(); } + + public void printWinners(List winners) { + String winnerNames = winners.stream() + .map(Car::getName) + .collect(Collectors.joining(", ")); + System.out.println("์ตœ์ข… ์šฐ์Šน์ž : " + winnerNames); + } } From 947235b841cdd5c47fd0f80f89b31ae18daaad74 Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Mon, 27 Oct 2025 20:07:02 +0900 Subject: [PATCH 17/27] =?UTF-8?q?refactor:=20=EC=9E=90=EB=8F=99=EC=B0=A8?= =?UTF-8?q?=20=EC=83=81=ED=83=9C=20=EB=AC=B8=EC=9E=90=EC=97=B4=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EC=9D=84=20Car=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OutputView์—์„œ ์ง์ ‘ ๋ฌธ์ž์—ด์„ ์กฐํ•ฉํ•˜๋˜ ๋กœ์ง์„ Car.status()๋กœ ์œ„์ž„ํ•จ. View๋Š” ์ถœ๋ ฅ๋งŒ ๋‹ด๋‹นํ•˜๊ณ , Car๋Š” ์ž์‹ ์˜ ์ƒํƒœ๋ฅผ ์Šค์Šค๋กœ ํ‘œํ˜„ํ•˜๋„๋ก ๊ตฌ์กฐ ๊ฐœ์„ . ๋“ค์—ฌ์“ฐ๊ธฐ depth๋ฅผ ์ค„์ด๊ณ  ์‘์ง‘๋„๋ฅผ ๋†’์ž„. --- src/main/java/racingcar/domain/Car.java | 5 +++++ src/main/java/racingcar/view/OutputView.java | 4 +--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java index b4cbc7a002..df4864182b 100644 --- a/src/main/java/racingcar/domain/Car.java +++ b/src/main/java/racingcar/domain/Car.java @@ -13,5 +13,10 @@ public void move(int randomNumber) { } public String getName() { return name; } + public int getPosition() { return position; } + + public String status() { + return name + " : " + "-".repeat(position); + } } diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java index 058583427d..d701e8d536 100644 --- a/src/main/java/racingcar/view/OutputView.java +++ b/src/main/java/racingcar/view/OutputView.java @@ -12,9 +12,7 @@ public void printStartMessage() { } public void printRoundResult(Cars cars) { - for (Car car : cars.getCars()) { - System.out.println(car.getName() + " : " + "-".repeat(car.getPosition())); - } + cars.getCars().forEach(car -> System.out.println(car.status())); System.out.println(); } From 3a7eb771e1efc95e0af9584f2d233e9c9ca17e03 Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Mon, 27 Oct 2025 20:44:11 +0900 Subject: [PATCH 18/27] =?UTF-8?q?test:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EA=B2=BD=EC=A3=BC=20=EC=9E=85=EB=A0=A5=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EB=B0=8F=20=EC=A0=95=EC=83=81=20=ED=9D=90=EB=A6=84=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ์„ฑ๊ณผ ๊ฒŒ์ž„ ์ง„ํ–‰ ํ๋ฆ„์ด ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋™์ž‘ํ•จ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•จ - ์ •์ƒ ์ž…๋ ฅ ์‹œ ์‹คํ–‰ ๊ฒฐ๊ณผ ๋ฐ ์šฐ์Šน์ž ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ํ•จ - ์ด๋ฆ„ ๊ธธ์ด ์ดˆ๊ณผ ์ž…๋ ฅ์— ๋Œ€ํ•œ ์˜ˆ์™ธ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ํ•จ - ๊ณต๋ฐฑ ํฌํ•จ ์ž…๋ ฅ์— ๋Œ€ํ•œ ์˜ˆ์™ธ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ํ•จ - ๋นˆ ์ด๋ฆ„ ์ž…๋ ฅ์— ๋Œ€ํ•œ ์˜ˆ์™ธ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ํ•จ - ์ค‘๋ณต ์ด๋ฆ„ ์ž…๋ ฅ์— ๋Œ€ํ•œ ์˜ˆ์™ธ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ํ•จ - ์Œ์ˆ˜ ๋ฐ ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ์ž…๋ ฅ์— ๋Œ€ํ•œ ์˜ˆ์™ธ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ํ•จ - ๊ณต๋™ ์šฐ์Šน์ž ์ถœ๋ ฅ ํ˜•์‹ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ํ•จ --- src/test/java/racingcar/ApplicationTest.java | 84 +++++++++++++++++--- 1 file changed, 75 insertions(+), 9 deletions(-) diff --git a/src/test/java/racingcar/ApplicationTest.java b/src/test/java/racingcar/ApplicationTest.java index 1d35fc33fe..c354adfc2e 100644 --- a/src/test/java/racingcar/ApplicationTest.java +++ b/src/test/java/racingcar/ApplicationTest.java @@ -1,6 +1,7 @@ package racingcar; import camp.nextstep.edu.missionutils.test.NsTest; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static camp.nextstep.edu.missionutils.test.Assertions.assertRandomNumberInRangeTest; @@ -12,22 +13,87 @@ class ApplicationTest extends NsTest { private static final int MOVING_FORWARD = 4; private static final int STOP = 3; + @DisplayName("์ •์ƒ ์ž…๋ ฅ ์‹œ, ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์šฐ์Šน์ž๋ฅผ ์•ˆ๋‚ดํ•œ๋‹ค") @Test - void ๊ธฐ๋Šฅ_ํ…Œ์ŠคํŠธ() { + void ์ •์ƒ_ํ”Œ๋กœ์šฐ_ํ…Œ์ŠคํŠธ() { assertRandomNumberInRangeTest( - () -> { - run("pobi,woni", "1"); - assertThat(output()).contains("pobi : -", "woni : ", "์ตœ์ข… ์šฐ์Šน์ž : pobi"); - }, - MOVING_FORWARD, STOP + () -> { + run("pobi,woni", "1"); + assertThat(output()) + .contains("์‹คํ–‰ ๊ฒฐ๊ณผ") + .contains("pobi : -") + .contains("woni : ") + .contains("์ตœ์ข… ์šฐ์Šน์ž : pobi"); + }, + MOVING_FORWARD, STOP ); } + @DisplayName("์ž๋™์ฐจ ์ด๋ฆ„์ด 5์ž ์ดˆ๊ณผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค") @Test - void ์˜ˆ์™ธ_ํ…Œ์ŠคํŠธ() { + void ์ด๋ฆ„_๊ธธ์ด_์ดˆ๊ณผ_์˜ˆ์™ธ() { assertSimpleTest(() -> - assertThatThrownBy(() -> runException("pobi,javaji", "1")) - .isInstanceOf(IllegalArgumentException.class) + assertThatThrownBy(() -> runException("pobi,javaji", "1")) + .isInstanceOf(IllegalArgumentException.class) + ); + } + + @DisplayName("์ž๋™์ฐจ ์ด๋ฆ„์— ๊ณต๋ฐฑ๋งŒ ์กด์žฌํ•˜๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ") + @Test + void ์ด๋ฆ„_๊ณต๋ฐฑ_์˜ˆ์™ธ() { + assertSimpleTest(() -> + assertThatThrownBy(() -> runException("pobi, ,jun", "2")) + .isInstanceOf(IllegalArgumentException.class) + ); + } + + @DisplayName("๋นˆ ์ด๋ฆ„ ์ž…๋ ฅ ์‹œ ์˜ˆ์™ธ ๋ฐœ์ƒ") + @Test + void ๋นˆ_์ด๋ฆ„_์˜ˆ์™ธ() { + assertSimpleTest(() -> + assertThatThrownBy(() -> runException(",,", "5")) + .isInstanceOf(IllegalArgumentException.class) + ); + } + + @DisplayName("์ค‘๋ณต๋œ ์ž๋™์ฐจ ์ด๋ฆ„ ์ž…๋ ฅ ์‹œ ์˜ˆ์™ธ ๋ฐœ์ƒ") + @Test + void ์ค‘๋ณต_์ด๋ฆ„_์˜ˆ์™ธ() { + assertSimpleTest(() -> + assertThatThrownBy(() -> runException("pobi,pobi,jun", "3")) + .isInstanceOf(IllegalArgumentException.class) + ); + } + + @DisplayName("์‹œ๋„ ํšŸ์ˆ˜๊ฐ€ ์Œ์ˆ˜๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ") + @Test + void ์Œ์ˆ˜_์‹œ๋„ํšŸ์ˆ˜_์˜ˆ์™ธ() { + assertSimpleTest(() -> + assertThatThrownBy(() -> runException("pobi,woni", "-1")) + .isInstanceOf(IllegalArgumentException.class) + ); + } + + @DisplayName("์‹œ๋„ ํšŸ์ˆ˜๊ฐ€ ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ") + @Test + void ์ˆซ์ž์•„๋‹Œ_์ž…๋ ฅ_์˜ˆ์™ธ() { + assertSimpleTest(() -> + assertThatThrownBy(() -> runException("pobi,woni", "abc")) + .isInstanceOf(IllegalArgumentException.class) + ); + } + + @DisplayName("์šฐ์Šน์ž๊ฐ€ ์—ฌ๋Ÿฌ ๋ช…์ผ ๊ฒฝ์šฐ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์•ˆ๋‚ดํ•œ๋‹ค") + @Test + void ๊ณต๋™_์šฐ์Šน์ž_ํ…Œ์ŠคํŠธ() { + assertRandomNumberInRangeTest( + () -> { + run("pobi,woni", "1"); + String output = output(); + assertThat(output) + .contains("์ตœ์ข… ์šฐ์Šน์ž :"); // ๊ณต๋™ ์—ฌ๋ถ€๋Š” ๊ฐ’์— ๋”ฐ๋ผ ๋งค๋ฒˆ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์–ด ํ˜•์‹๋งŒ ํ™•์ธ + }, + MOVING_FORWARD, MOVING_FORWARD ); } From 86efdb4be29b6c802462df7f3605ee786e35dea1 Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Mon, 27 Oct 2025 21:59:35 +0900 Subject: [PATCH 19/27] =?UTF-8?q?refactor:=20=EC=9A=B0=EC=8A=B9=EC=9E=90?= =?UTF-8?q?=20=ED=8C=90=EB=B3=84=20=EB=A1=9C=EC=A7=81=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EB=B6=84=EB=A6=AC=EB=A1=9C=20=EA=B0=80=EB=8F=85?= =?UTF-8?q?=EC=84=B1=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cars.getWinners() ๋‚ด๋ถ€์˜ ์ตœ๋Œ€ ์ด๋™๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ๊ณผ ์šฐ์Šน์ž ํ•„ํ„ฐ๋ง ๋กœ์ง์„ findMaxPosition(), findCarsWithPosition()์œผ๋กœ ๋ถ„๋ฆฌํ•จ. ๋ฉ”์„œ๋“œ์˜ ๋‹จ์ผ ์ฑ…์ž„์„ ๋ช…ํ™•ํžˆ ํ•˜๊ณ  ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฆฌํŒฉํ† ๋งํ•จ. --- src/main/java/racingcar/domain/Cars.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/racingcar/domain/Cars.java b/src/main/java/racingcar/domain/Cars.java index 4ea1537f4c..a6cbcfbc4e 100644 --- a/src/main/java/racingcar/domain/Cars.java +++ b/src/main/java/racingcar/domain/Cars.java @@ -28,13 +28,20 @@ public List getCars() { } public List getWinners() { - int maxPosition = cars.stream() + int maxPosition = findMaxPosition(); + return findCarsWithPosition(maxPosition); + } + + private int findMaxPosition() { + return cars.stream() .mapToInt(Car::getPosition) .max() .orElse(0); + } + private List findCarsWithPosition(int position) { return cars.stream() - .filter(car -> car.getPosition() == maxPosition) - .collect(Collectors.toList()); + .filter(car -> car.getPosition() == position) + .toList(); } } From efc8369cb4c9539feb117136d5cbbd1361bad01d Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Mon, 27 Oct 2025 22:14:20 +0900 Subject: [PATCH 20/27] =?UTF-8?q?fix:=20=EB=B9=88=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=EB=A7=8C=20=EC=9E=85=EB=A0=A5=EB=90=9C=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ๊ตฌ๋ถ„์ž๋งŒ ์ž…๋ ฅ๋˜์–ด ์œ ํšจํ•œ ์ž๋™์ฐจ ์ด๋ฆ„์ด ํ•˜๋‚˜๋„ ์—†๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ฒ€์ถœํ•˜๋„๋ก ๋ณด์™„ํ•จ - split ์ดํ›„ ์œ ํšจ ์ด๋ฆ„ ๊ฐœ์ˆ˜ ํ™•์ธํ•˜์—ฌ 0๊ฐœ์ผ ๋•Œ IllegalArgumentException ๋ฐœ์ƒ์‹œํ‚ค๋„๋ก ์ฒ˜๋ฆฌํ•จ - ์ž˜๋ชป๋œ ์ž…๋ ฅ์„ ์กฐ๊ธฐ์— ์ฐจ๋‹จํ•˜์—ฌ ์ดํ›„ ๋กœ์ง ์ง„ํ–‰์„ ๋ฐฉ์ง€ํ•จ --- src/main/java/racingcar/view/InputView.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java index af93ba7e7b..6c1be71b21 100644 --- a/src/main/java/racingcar/view/InputView.java +++ b/src/main/java/racingcar/view/InputView.java @@ -11,10 +11,19 @@ public List readCarNames(){ System.out.println("๊ฒฝ์ฃผํ•  ์ž๋™์ฐจ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.(์ด๋ฆ„์€ ์‰ผํ‘œ(,) ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„)"); String input = Console.readLine(); - return Arrays.stream(input.split(",")) + List carNames = Arrays.stream(input.split(",")) .map(String::trim) - .peek(Validator::validateCarName) + .map(name -> { + Validator.validateCarName(name); + return name; + }) .toList(); + + if (carNames.isEmpty()) { + throw new IllegalArgumentException("๊ฒฝ์ฃผํ•  ์ž๋™์ฐจ ์ด๋ฆ„์€ ์ตœ์†Œ ํ•œ ๊ฐœ ์ด์ƒ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } + + return carNames; } public int readAttemptCount(){ From c4b3375472d7828a612f129f27c589738e825af2 Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Mon, 27 Oct 2025 22:47:11 +0900 Subject: [PATCH 21/27] =?UTF-8?q?refactor:=20Validator=EB=A5=BC=20util?= =?UTF-8?q?=EC=97=90=EC=84=9C=20domain=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ๊ฒ€์ฆ ๋กœ์ง์ด ๋„๋ฉ”์ธ ๊ทœ์น™์— ํ•ด๋‹นํ•˜๋ฏ€๋กœ domain ํŒจํ‚ค์ง€๋กœ ์œ„์น˜๋ฅผ ์กฐ์ •ํ•จ --- src/main/java/racingcar/{util => domain}/Validator.java | 2 +- src/main/java/racingcar/view/InputView.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/main/java/racingcar/{util => domain}/Validator.java (95%) diff --git a/src/main/java/racingcar/util/Validator.java b/src/main/java/racingcar/domain/Validator.java similarity index 95% rename from src/main/java/racingcar/util/Validator.java rename to src/main/java/racingcar/domain/Validator.java index 93df705258..4e3794ff13 100644 --- a/src/main/java/racingcar/util/Validator.java +++ b/src/main/java/racingcar/domain/Validator.java @@ -1,4 +1,4 @@ -package racingcar.util; +package racingcar.domain; public final class Validator { private Validator() {} diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java index 6c1be71b21..807f79ecc2 100644 --- a/src/main/java/racingcar/view/InputView.java +++ b/src/main/java/racingcar/view/InputView.java @@ -1,7 +1,7 @@ package racingcar.view; import camp.nextstep.edu.missionutils.Console; -import racingcar.util.Validator; +import racingcar.domain.Validator; import java.util.Arrays; import java.util.List; From 117d6f5494c6e1ceae6d90028eefb6078ef26bfd Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Mon, 27 Oct 2025 22:49:52 +0900 Subject: [PATCH 22/27] =?UTF-8?q?refactor:=20Car=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EC=97=90=EC=84=9C=20=EC=9D=B4=EB=A6=84=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=EB=82=B4=EB=B6=80=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Car ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ์ž์ฒด์ ์œผ๋กœ ์ด๋ฆ„์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•˜๋„๋ก ๋ณ€๊ฒฝํ•จ. ๋˜ํ•œ ์ด๋ฆ„ ๊ธธ์ด ์ œํ•œ๊ณผ ์ด๋™ ๊ธฐ์ค€๊ฐ’์„ ์ƒ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•ด ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ฐœ์„ ํ•จ. --- src/main/java/racingcar/domain/Car.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java index df4864182b..39b24f8fd8 100644 --- a/src/main/java/racingcar/domain/Car.java +++ b/src/main/java/racingcar/domain/Car.java @@ -1,15 +1,28 @@ package racingcar.domain; public class Car { + private static final int MAX_NAME_LENGTH = 5; + private static final int FORWARD_THRESHOLD = 4; + private final String name; private int position = 0; public Car(String name) { + validateName(name); this.name = name; } + private void validateName(String name) { + if (name == null || name.isBlank()) { + throw new IllegalArgumentException("์ž๋™์ฐจ ์ด๋ฆ„์€ ๊ณต๋ฐฑ์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."); + } + if (name.length() > MAX_NAME_LENGTH) { + throw new IllegalArgumentException("์ž๋™์ฐจ ์ด๋ฆ„์€ 5์ž ์ดํ•˜๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค."); + } + } + public void move(int randomNumber) { - if (randomNumber >= 4) position++; + if (randomNumber >= FORWARD_THRESHOLD) position++; } public String getName() { return name; } From 1ec5cd8545935cd9dd535e8b0098f5cc912e6949 Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Mon, 27 Oct 2025 23:22:04 +0900 Subject: [PATCH 23/27] =?UTF-8?q?feat:=20Cars=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EC=97=90=20=EC=A4=91=EB=B3=B5=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=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/racingcar/domain/Cars.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/racingcar/domain/Cars.java b/src/main/java/racingcar/domain/Cars.java index a6cbcfbc4e..dd09701644 100644 --- a/src/main/java/racingcar/domain/Cars.java +++ b/src/main/java/racingcar/domain/Cars.java @@ -13,9 +13,21 @@ public class Cars { private final List cars; public Cars(List cars) { + validateNoDuplicateNames(cars); this.cars = List.copyOf(cars); } + private void validateNoDuplicateNames(List cars) { + long uniqueNameCount = cars.stream() + .map(Car::getName) + .distinct() + .count(); + + if (uniqueNameCount != cars.size()) { + throw new IllegalArgumentException("์ž๋™์ฐจ ์ด๋ฆ„์€ ์ค‘๋ณต๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."); + } + } + public void moveAll() { for (Car car : cars) { int random = RandomNumberGenerator.generateInRange(RANDOM_MIN, RANDOM_MAX); From fe3f342f17130c23a8a63cfbd8d4df4240b55811 Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Mon, 27 Oct 2025 23:24:20 +0900 Subject: [PATCH 24/27] =?UTF-8?q?refactor:=20InputView=EC=97=90=20?= =?UTF-8?q?=EA=B8=B0=EB=B3=B8=20=EC=9E=85=EB=A0=A5=20=ED=98=95=EC=8B=9D=20?= =?UTF-8?q?=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/racingcar/view/InputView.java | 22 +++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java index 807f79ecc2..a63edaa5c1 100644 --- a/src/main/java/racingcar/view/InputView.java +++ b/src/main/java/racingcar/view/InputView.java @@ -13,27 +13,29 @@ public List readCarNames(){ List carNames = Arrays.stream(input.split(",")) .map(String::trim) - .map(name -> { - Validator.validateCarName(name); - return name; - }) .toList(); + validateNotEmpty(carNames); + + return carNames; + } + + private void validateNotEmpty(List carNames) { if (carNames.isEmpty()) { - throw new IllegalArgumentException("๊ฒฝ์ฃผํ•  ์ž๋™์ฐจ ์ด๋ฆ„์€ ์ตœ์†Œ ํ•œ ๊ฐœ ์ด์ƒ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + throw new IllegalArgumentException("์ž๋™์ฐจ ์ด๋ฆ„์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."); } - return carNames; + if (carNames.stream().allMatch(String::isEmpty)) { + throw new IllegalArgumentException("์ž๋™์ฐจ ์ด๋ฆ„์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."); + } } public int readAttemptCount(){ - System.out.println("์‹œ๋„ํ•  ํšŸ์ˆ˜๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”."); + System.out.println("์‹œ๋„ํ•  ํšŸ์ˆ˜๋Š” ๋ช‡ ํšŒ์ธ๊ฐ€์š”?"); String input = Console.readLine(); try { - int attemptCount = Integer.parseInt(input); - Validator.validateAttemptCount(attemptCount); - return attemptCount; + return Integer.parseInt(input); } catch (NumberFormatException e) { throw new IllegalArgumentException("์‹œ๋„ ํšŸ์ˆ˜๋Š” ์ •์ˆ˜๋งŒ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."); } From 72ee058e908adae5c67fd266eea42950e739ca6b Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Mon, 27 Oct 2025 23:30:39 +0900 Subject: [PATCH 25/27] =?UTF-8?q?refactor:=20=EC=8B=9C=EB=8F=84=20?= =?UTF-8?q?=ED=9A=9F=EC=88=98=EB=A5=BC=20=EA=B0=92=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=EB=A1=9C=20=EC=BA=A1=EC=8A=90=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AttemptCount ๊ฐ’์„ ๋ณ„๋„ ๊ฐ์ฒด๋กœ ๋ถ„๋ฆฌํ•ด ์‹œ๋„ ํšŸ์ˆ˜ ๊ฒ€์ฆ์„ ๋„๋ฉ”์ธ ๋‚ด๋ถ€์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋ณ€๊ฒฝํ•จ --- .../java/racingcar/domain/AttemptCount.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/racingcar/domain/AttemptCount.java diff --git a/src/main/java/racingcar/domain/AttemptCount.java b/src/main/java/racingcar/domain/AttemptCount.java new file mode 100644 index 0000000000..b2de347251 --- /dev/null +++ b/src/main/java/racingcar/domain/AttemptCount.java @@ -0,0 +1,22 @@ +package racingcar.domain; + +public class AttemptCount { + private static final int MIN_COUNT = 1; + + private final int value; + + public AttemptCount(int value) { + validateCount(value); + this.value = value; + } + + private void validateCount(int count) { + if (count < MIN_COUNT) { + throw new IllegalArgumentException("์‹œ๋„ ํšŸ์ˆ˜๋Š” 1 ์ด์ƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } + } + + public int getValue() { + return value; + } +} \ No newline at end of file From 7c8c3cd1c656a22f455d855d0eebb0108c2418e6 Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Mon, 27 Oct 2025 23:32:54 +0900 Subject: [PATCH 26/27] =?UTF-8?q?refactor:=20Controller=EB=A5=BC=20?= =?UTF-8?q?=ED=9D=90=EB=A6=84=20=EC=A0=9C=EC=96=B4=EC=97=90=EB=A7=8C=20?= =?UTF-8?q?=EC=A7=91=EC=A4=91=ED=95=98=EB=8F=84=EB=A1=9D=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AttemptCount ๊ฐ’ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ์‹œ๋„ ํšŸ์ˆ˜ ๊ฒ€์ฆ์„ ๋„๋ฉ”์ธ์œผ๋กœ ์œ„์ž„ํ•˜๊ณ , Controller๋Š” ์ž…๋ ฅ๊ณผ ์‹คํ–‰ ํ๋ฆ„ ์ œ์–ด์—๋งŒ ์ง‘์ค‘ํ•˜๋„๋ก ์—ญํ• ์„ ์ •๋ฆฌํ•จ --- src/main/java/racingcar/controller/RacingController.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index acb114c497..464887fcae 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -1,5 +1,6 @@ package racingcar.controller; +import racingcar.domain.AttemptCount; import racingcar.domain.Car; import racingcar.domain.Cars; import racingcar.view.InputView; @@ -13,7 +14,9 @@ public class RacingController { public void start(){ List carNames = inputView.readCarNames(); - int attemptCount = inputView.readAttemptCount(); + int attemptCountInput = inputView.readAttemptCount(); + + AttemptCount attemptCount = new AttemptCount(attemptCountInput); List carList = carNames.stream() .map(Car::new) @@ -22,7 +25,7 @@ public void start(){ Cars cars = new Cars(carList); outputView.printStartMessage(); - for (int i = 0; i < attemptCount; i++) { + for (int i = 0; i < attemptCount.getValue(); i++) { cars.moveAll(); outputView.printRoundResult(cars); } From 4ab1ec67237a53e5d81bc864729324f8c73d9ed3 Mon Sep 17 00:00:00 2001 From: Eunbi Kim <2271240@hansung.ac.kr> Date: Mon, 27 Oct 2025 23:33:18 +0900 Subject: [PATCH 27/27] =?UTF-8?q?remove:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20Validator=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ๊ฒ€์ฆ ๋กœ์ง์ด ๋„๋ฉ”์ธ ๊ฐ์ฒด๋กœ ์ด๋™ํ•ด Validator ํด๋ž˜์Šค๊ฐ€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์•„ ์‚ญ์ œํ•จ --- src/main/java/racingcar/domain/Validator.java | 20 ------------------- src/main/java/racingcar/view/InputView.java | 1 - 2 files changed, 21 deletions(-) delete mode 100644 src/main/java/racingcar/domain/Validator.java diff --git a/src/main/java/racingcar/domain/Validator.java b/src/main/java/racingcar/domain/Validator.java deleted file mode 100644 index 4e3794ff13..0000000000 --- a/src/main/java/racingcar/domain/Validator.java +++ /dev/null @@ -1,20 +0,0 @@ -package racingcar.domain; - -public final class Validator { - private Validator() {} - - public static void validateCarName(String name) { - if (name.isBlank()) { - throw new IllegalArgumentException("์ž๋™์ฐจ ์ด๋ฆ„์€ ๊ณต๋ฐฑ์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."); - } - if (name.length() > 5) { - throw new IllegalArgumentException("์ž๋™์ฐจ ์ด๋ฆ„์€ 5์ž ์ดํ•˜๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค."); - } - } - - public static void validateAttemptCount(int count) { - if (count <= 0) { - throw new IllegalArgumentException("์‹œ๋„ ํšŸ์ˆ˜๋Š” 1ํšŒ ์ด์ƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."); - } - } -} diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java index a63edaa5c1..9fcd17d5e5 100644 --- a/src/main/java/racingcar/view/InputView.java +++ b/src/main/java/racingcar/view/InputView.java @@ -1,7 +1,6 @@ package racingcar.view; import camp.nextstep.edu.missionutils.Console; -import racingcar.domain.Validator; import java.util.Arrays; import java.util.List;