From ffe6f571cdae2589649a49ae3f21b5a236159c67 Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Tue, 27 Jan 2026 17:45:52 +0900 Subject: [PATCH 01/24] doc: design feature --- README.md | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8d7e8aee..ef0eec32 100644 --- a/README.md +++ b/README.md @@ -1 +1,29 @@ -# java-baseball-precourse \ No newline at end of file +# java-baseball-precourse + +## 기능 목록 +### Model +#### AnswerNumberModel +1. 현재 게임의 정답이 되는 숫자 배열의 관리 +2. 초기화 시 정답으로 입력된 숫자의 validation +#### GameResultModel +1. 사용자가 입력한 숫자에 대한 결과의 관리 +2. 결과 출력을 위한 객체의 stringify +3. 승리 여부 판별 +### View +#### InputView +1. Scanner를 통해 사용자로부터 입력을 받아들이기 +2. 적절한 숫자인지 Validation +3. 적절한 명령인지 Validation +#### OutputView +1. 사용자가 입력한 숫자에 대한 결과 출력 +2. 사용자가 정답 입력 시 게임 지속에 대한 질문 출력 +### Controller +1 숫자 입력 / 지속 여부 입력 상태 관리 +2. 입력받은 숫자를 Judgement를 통해 결과 확인 및 출력 +3. 정답 입력 시 게임 지속 질문 출력 +4. 입력받은 답에 대해 프로그램 종료 혹은 2로 돌아감 +### Service +#### AnswerNumberGenerator +1. 게임의 정답으로 사용할 숫자의 생성 +#### Judgement +1. 입력된 숫자와 정답을 통해 GameResultModel 생성 \ No newline at end of file From 4c2dfda11622b786b8a7f5f65beee9d010f8a179 Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Tue, 27 Jan 2026 17:51:33 +0900 Subject: [PATCH 02/24] feat: AnswerNumberModel --- src/main/java/model/AnswerNumberModel.java | 31 ++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/main/java/model/AnswerNumberModel.java diff --git a/src/main/java/model/AnswerNumberModel.java b/src/main/java/model/AnswerNumberModel.java new file mode 100644 index 00000000..4598075c --- /dev/null +++ b/src/main/java/model/AnswerNumberModel.java @@ -0,0 +1,31 @@ +package model; + +import java.util.Arrays; + +public class AnswerNumberModel { + private static final int ANSWER_NUMBER_LENGTH = 3; + private int[] answerNumber; + + public AnswerNumberModel(int[] answerNumber) { + if (!validate(answerNumber)) { + throw new IllegalArgumentException("Invalid answer number"); + } + this.answerNumber = answerNumber; + } + + public Boolean validate(int[] answerNumber) { + return isLengthValid(answerNumber) && isAllDistinct(answerNumber); + } + + private Boolean isLengthValid(int[] answerNumber) { + return answerNumber.length == ANSWER_NUMBER_LENGTH; + } + + private Boolean isAllDistinct(int[] answerNumber) { + return Arrays.stream(answerNumber).distinct().count() == ANSWER_NUMBER_LENGTH; + } + + public int[] getAnswerNumber() { + return answerNumber; + } +} From ff964642586704a7ff3adc15d29f4dc94a3acd72 Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Tue, 27 Jan 2026 17:55:12 +0900 Subject: [PATCH 03/24] feat: GameResultModel --- src/main/java/model/AnswerNumberModel.java | 2 +- src/main/java/model/GameResultModel.java | 36 ++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 src/main/java/model/GameResultModel.java diff --git a/src/main/java/model/AnswerNumberModel.java b/src/main/java/model/AnswerNumberModel.java index 4598075c..9591575c 100644 --- a/src/main/java/model/AnswerNumberModel.java +++ b/src/main/java/model/AnswerNumberModel.java @@ -3,7 +3,7 @@ import java.util.Arrays; public class AnswerNumberModel { - private static final int ANSWER_NUMBER_LENGTH = 3; + public static final int ANSWER_NUMBER_LENGTH = 3; private int[] answerNumber; public AnswerNumberModel(int[] answerNumber) { diff --git a/src/main/java/model/GameResultModel.java b/src/main/java/model/GameResultModel.java new file mode 100644 index 00000000..6ceafce3 --- /dev/null +++ b/src/main/java/model/GameResultModel.java @@ -0,0 +1,36 @@ +package model; + +public class GameResultModel { + private int strike; + private int ball; + + public GameResultModel(int strike, int ball) { + this.strike = strike; + this.ball = ball; + } + + public int getStrike() { + return strike; + } + + public int getBall() { + return ball; + } + + public Boolean isWin() { + return strike == AnswerNumberModel.ANSWER_NUMBER_LENGTH; + } + + public String toString() { + if (strike == 0 && ball == 0) { + return "낫싱"; + } + if (strike == 0) { + return ball + "볼"; + } + if (ball == 0) { + return strike + "스트라이크"; + } + return strike + "스트라이크 " + ball + "볼"; + } +} From 450fff0bb964a5452a3e32e49d2b856827d030d0 Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Wed, 28 Jan 2026 15:48:12 +0900 Subject: [PATCH 04/24] feat: InputView --- src/main/java/view/InputView.java | 46 +++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/main/java/view/InputView.java diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 00000000..a30c18e5 --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,46 @@ +package view; + +import java.util.Arrays; +import java.util.Scanner; + +public class InputView { + private Scanner scanner; + + public InputView() { + this.scanner = new Scanner(System.in); + } + + public int[] readNumberInput() { + System.out.println("숫자를 입력해주세요."); + String input = scanner.nextLine(); + if (!validateNumberInput(input)) { + throw new IllegalArgumentException("[Error] Invalid number input"); + } + return parseNumberInput(input); + } + + private boolean validateNumberInput(String input) { + return input.matches("^[1-9]{3}$"); + } + + private int[] parseNumberInput(String input) { + return Arrays.stream(input.split("")).mapToInt(Integer::parseInt).toArray(); + } + + public int readCommandInput() { + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + String input = scanner.nextLine(); + if (!validateCommandInput(input)) { + throw new IllegalArgumentException("[Error] Invalid command input"); + } + return parseCommandInput(input); + } + + public Boolean validateCommandInput(String input) { + return input.matches("^[1-2]$"); + } + + public int parseCommandInput(String input) { + return Integer.parseInt(input); + } +} From 9f69a1b0202fdd4b1ac45069c9034c6069fa4f0e Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Wed, 28 Jan 2026 15:50:22 +0900 Subject: [PATCH 05/24] feat: OutputView --- src/main/java/view/OutputView.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/view/OutputView.java diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 00000000..926d2f93 --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,13 @@ +package view; + +import model.GameResultModel; + +public class OutputView { + public void printResult(GameResultModel gameResult) { + System.out.println(gameResult.toString()); + } + + public void printContinueQuestion() { + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + } +} From edd15a8eb59045b5021504574b4d459075eafb03 Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Wed, 28 Jan 2026 15:55:31 +0900 Subject: [PATCH 06/24] AnswerNumberGenerator --- .../java/service/AnswerNumberGenerator.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/java/service/AnswerNumberGenerator.java diff --git a/src/main/java/service/AnswerNumberGenerator.java b/src/main/java/service/AnswerNumberGenerator.java new file mode 100644 index 00000000..3481795f --- /dev/null +++ b/src/main/java/service/AnswerNumberGenerator.java @@ -0,0 +1,17 @@ +package service; + +import java.util.Arrays; +import java.util.Collections; + +import model.AnswerNumberModel; + +public class AnswerNumberGenerator { + public int[] generateAnswerNumber() { + int[] numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + Collections.shuffle(Arrays.asList(numbers)); + int[] answerNumber = Arrays.copyOfRange( + numbers, 0, AnswerNumberModel.ANSWER_NUMBER_LENGTH + ); + return answerNumber; + } +} From 737dacba7340a0379a501a3f4010f091c2aafb33 Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Wed, 28 Jan 2026 15:57:41 +0900 Subject: [PATCH 07/24] feat: Judgement --- src/main/java/service/Judgement.java | 33 ++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/main/java/service/Judgement.java diff --git a/src/main/java/service/Judgement.java b/src/main/java/service/Judgement.java new file mode 100644 index 00000000..6cd49a6e --- /dev/null +++ b/src/main/java/service/Judgement.java @@ -0,0 +1,33 @@ +package service; + +import model.GameResultModel; + +public class Judgement { + public GameResultModel judge(int[] answerNumber, int[] inputNumber) { + int strike = countStrike(answerNumber, inputNumber); + int ball = countBall(answerNumber, inputNumber); + return new GameResultModel(strike, ball); + } + + private int countStrike(int[] answerNumber, int[] inputNumber) { + int strike = 0; + for (int i = 0; i < answerNumber.length; i++) { + if (answerNumber[i] == inputNumber[i]) { + strike++; + } + } + return strike; + } + + private int countBall(int[] answerNumber, int[] inputNumber) { + int ball = 0; + for (int i = 0; i < answerNumber.length; i++) { + for (int j = 0; j < inputNumber.length; j++) { + if (answerNumber[i] == inputNumber[j] && i != j) { + ball++; + } + } + } + return ball; + } +} From 8895911b6e22304a2448bb6c94a285876120d8da Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Wed, 28 Jan 2026 16:04:54 +0900 Subject: [PATCH 08/24] feat: Controller --- src/main/java/controller/Controller.java | 44 ++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/main/java/controller/Controller.java diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java new file mode 100644 index 00000000..3687c1ce --- /dev/null +++ b/src/main/java/controller/Controller.java @@ -0,0 +1,44 @@ +package controller; + +import view.*; +import service.*; +import model.*; + +public class Controller { + private InputView inputView; + private OutputView outputView; + private AnswerNumberGenerator answerNumberGenerator; + private Judgement judgement; + + public Controller() { + this.inputView = new InputView(); + this.outputView = new OutputView(); + this.answerNumberGenerator = new AnswerNumberGenerator(); + this.judgement = new Judgement(); + } + + public void run() { + while (true) { + int[] answerNumber = answerNumberGenerator.generateAnswerNumber(); + if (playGame(answerNumber)) { + break; + } + } + } + + private boolean playGame(int[] answerNumber) { + while (true) { + int[] inputNumber = inputView.readNumberInput(); + GameResultModel gameResult = judgement.judge(answerNumber, inputNumber); + outputView.printResult(gameResult); + if (gameResult.isWin()) { + break; + } + } + int inputCommand = inputView.readCommandInput(); + if (inputCommand == 1) { + return true; + } + return false; + } +} From c1c2b8e61eae0476806bf0806acc924fb0ea1e39 Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Wed, 28 Jan 2026 16:08:43 +0900 Subject: [PATCH 09/24] feat: App --- src/main/java/App.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/java/App.java diff --git a/src/main/java/App.java b/src/main/java/App.java new file mode 100644 index 00000000..7b539dbc --- /dev/null +++ b/src/main/java/App.java @@ -0,0 +1,8 @@ +import controller.Controller; + +public class App { + public static void main(String[] args) { + Controller controller = new Controller(); + controller.run(); + } +} From bc5ac0d2134fa1c7c772c1e8d6d11d6c8a840015 Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Wed, 28 Jan 2026 16:49:06 +0900 Subject: [PATCH 10/24] style: correct err msg --- src/main/java/model/AnswerNumberModel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/model/AnswerNumberModel.java b/src/main/java/model/AnswerNumberModel.java index 9591575c..56ef1b42 100644 --- a/src/main/java/model/AnswerNumberModel.java +++ b/src/main/java/model/AnswerNumberModel.java @@ -8,7 +8,7 @@ public class AnswerNumberModel { public AnswerNumberModel(int[] answerNumber) { if (!validate(answerNumber)) { - throw new IllegalArgumentException("Invalid answer number"); + throw new IllegalArgumentException("[Error] Invalid answer number"); } this.answerNumber = answerNumber; } From 8c8bce28a46c2f8e92b71340d19ee69cd87a3569 Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Wed, 28 Jan 2026 17:26:12 +0900 Subject: [PATCH 11/24] test: add tests --- .../java/model/AnswerNumberModelTest.java | 34 +++++++++++ src/test/java/model/GameResultModelTest.java | 50 +++++++++++++++++ .../service/AnswerNumberGeneratorTest.java | 16 ++++++ src/test/java/service/JudgementTest.java | 56 +++++++++++++++++++ 4 files changed, 156 insertions(+) create mode 100644 src/test/java/model/AnswerNumberModelTest.java create mode 100644 src/test/java/model/GameResultModelTest.java create mode 100644 src/test/java/service/AnswerNumberGeneratorTest.java create mode 100644 src/test/java/service/JudgementTest.java diff --git a/src/test/java/model/AnswerNumberModelTest.java b/src/test/java/model/AnswerNumberModelTest.java new file mode 100644 index 00000000..9fe98833 --- /dev/null +++ b/src/test/java/model/AnswerNumberModelTest.java @@ -0,0 +1,34 @@ +package model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class AnswerNumberModelTest { + @Test + @DisplayName("AnswerNumberModel 생성 테스트") + public void testConstructor() { + int[] answerNumber = {1, 2, 3}; + AnswerNumberModel answerNumberModel = new AnswerNumberModel(answerNumber); + assertThat(answerNumberModel.getAnswerNumber()).containsExactly(1, 2, 3); + } + + @Test + @DisplayName("AnswerNumberModel 길이 검증 테스트") + public void testLengthValidation() { + int[] answerNumber = {1, 2}; + assertThatThrownBy(() -> new AnswerNumberModel(answerNumber)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("[Error] Invalid answer number"); + } + + @Test + @DisplayName("AnswerNumberModel 중복 숫자 검증 테스트") + public void testDistinctValidation() { + int[] answerNumber = {1, 1, 2}; + assertThatThrownBy(() -> new AnswerNumberModel(answerNumber)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("[Error] Invalid answer number"); + } +} diff --git a/src/test/java/model/GameResultModelTest.java b/src/test/java/model/GameResultModelTest.java new file mode 100644 index 00000000..98138b3b --- /dev/null +++ b/src/test/java/model/GameResultModelTest.java @@ -0,0 +1,50 @@ +package model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; + +public class GameResultModelTest { + @Test + @DisplayName("GameResultModel 생성 테스트") + public void testConstructor() { + GameResultModel gameResultModel = new GameResultModel(1, 2); + assertThat(gameResultModel.getStrike()).isEqualTo(1); + assertThat(gameResultModel.getBall()).isEqualTo(2); + } + + @Test + @DisplayName("GameResultModel 승리 여부 검증 테스트") + public void testIsWin() { + GameResultModel gameResultModel = new GameResultModel(3, 0); + assertThat(gameResultModel.isWin()).isTrue(); + } + + @Test + @DisplayName("GameResultModel 낫싱 출력 검증 테스트") + public void testToStringWhenNothing() { + GameResultModel gameResultModel = new GameResultModel(0, 0); + assertThat(gameResultModel.toString()).isEqualTo("낫싱"); + } + + @Test + @DisplayName("GameResultModel 볼 출력 검증 테스트") + public void testToStringWhenBall() { + GameResultModel gameResultModel = new GameResultModel(0, 1); + assertThat(gameResultModel.toString()).isEqualTo("1볼"); + } + + @Test + @DisplayName("GameResultModel 스트라이크 출력 검증 테스트") + public void testToStringWhenStrike() { + GameResultModel gameResultModel = new GameResultModel(1, 0); + assertThat(gameResultModel.toString()).isEqualTo("1스트라이크"); + } + + @Test + @DisplayName("GameResultModel 볼과 스트라이크 출력 검증 테스트") + public void testToStringWhenBallAndStrike() { + GameResultModel gameResultModel = new GameResultModel(1, 1); + assertThat(gameResultModel.toString()).isEqualTo("1스트라이크 1볼"); + } +} diff --git a/src/test/java/service/AnswerNumberGeneratorTest.java b/src/test/java/service/AnswerNumberGeneratorTest.java new file mode 100644 index 00000000..8f8b2ae0 --- /dev/null +++ b/src/test/java/service/AnswerNumberGeneratorTest.java @@ -0,0 +1,16 @@ +package service; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; + +public class AnswerNumberGeneratorTest { + @Test + @DisplayName("AnswerNumberGenerator 생성 테스트") + public void testGenerateAnswerNumber() { + AnswerNumberGenerator answerNumberGenerator = new AnswerNumberGenerator(); + int[] answerNumber = answerNumberGenerator.generateAnswerNumber(); + assertThat(answerNumber).hasSize(3); + assertThat(answerNumber).doesNotHaveDuplicates(); + } +} diff --git a/src/test/java/service/JudgementTest.java b/src/test/java/service/JudgementTest.java new file mode 100644 index 00000000..9c063109 --- /dev/null +++ b/src/test/java/service/JudgementTest.java @@ -0,0 +1,56 @@ +package service; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import model.GameResultModel; + +import static org.assertj.core.api.Assertions.assertThat; + +public class JudgementTest { + @Test + @DisplayName("Judgement 생성 테스트") + public void testConstructor() { + Judgement judgement = new Judgement(); + assertThat(judgement).isNotNull(); + } + + @Test + @DisplayName("Judgement 스트라이크, 볼 카운트 검증 테스트") + public void testCountStrikeAndBall() { + Judgement judgement = new Judgement(); + int[] answerNumber; + int[] inputNumber; + GameResultModel gameResult; + + answerNumber = new int[] {1, 2, 3}; + inputNumber = new int[] {1, 2, 4}; + gameResult = judgement.judge(answerNumber, inputNumber); + assertThat(gameResult.getStrike()).isEqualTo(2); + assertThat(gameResult.getBall()).isEqualTo(0); + + answerNumber = new int[] {1, 2, 3}; + inputNumber = new int[] {3, 1, 4}; + gameResult = judgement.judge(answerNumber, inputNumber); + assertThat(gameResult.getStrike()).isEqualTo(0); + assertThat(gameResult.getBall()).isEqualTo(2); + + answerNumber = new int[] {1, 2, 3}; + inputNumber = new int[] {4, 5, 6}; + gameResult = judgement.judge(answerNumber, inputNumber); + assertThat(gameResult.getStrike()).isEqualTo(0); + assertThat(gameResult.getBall()).isEqualTo(0); + + answerNumber = new int[] {1, 2, 3}; + inputNumber = new int[] {1, 2, 3}; + gameResult = judgement.judge(answerNumber, inputNumber); + assertThat(gameResult.getStrike()).isEqualTo(3); + assertThat(gameResult.getBall()).isEqualTo(0); + + answerNumber = new int[] {1, 2, 3}; + inputNumber = new int[] {2, 3, 1}; + gameResult = judgement.judge(answerNumber, inputNumber); + assertThat(gameResult.getStrike()).isEqualTo(0); + assertThat(gameResult.getBall()).isEqualTo(3); + } +} From 3fc53d1d201ad263b7420df1c706ed33edb7aab1 Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Wed, 28 Jan 2026 17:27:02 +0900 Subject: [PATCH 12/24] fix: correct answer number range --- src/main/java/service/AnswerNumberGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/service/AnswerNumberGenerator.java b/src/main/java/service/AnswerNumberGenerator.java index 3481795f..f0d5fa4b 100644 --- a/src/main/java/service/AnswerNumberGenerator.java +++ b/src/main/java/service/AnswerNumberGenerator.java @@ -7,7 +7,7 @@ public class AnswerNumberGenerator { public int[] generateAnswerNumber() { - int[] numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9}; Collections.shuffle(Arrays.asList(numbers)); int[] answerNumber = Arrays.copyOfRange( numbers, 0, AnswerNumberModel.ANSWER_NUMBER_LENGTH From 0b8684902c4563548fa16e65fcaea31494e176aa Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Wed, 28 Jan 2026 17:41:16 +0900 Subject: [PATCH 13/24] feat: add InputView err handling --- src/main/java/controller/Controller.java | 28 +++++++++++++++--------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java index 3687c1ce..5357a370 100644 --- a/src/main/java/controller/Controller.java +++ b/src/main/java/controller/Controller.java @@ -27,18 +27,26 @@ public void run() { } private boolean playGame(int[] answerNumber) { - while (true) { - int[] inputNumber = inputView.readNumberInput(); - GameResultModel gameResult = judgement.judge(answerNumber, inputNumber); - outputView.printResult(gameResult); - if (gameResult.isWin()) { - break; + boolean isWin = false; + while (!isWin) { + try { + int[] inputNumber = inputView.readNumberInput(); + GameResultModel gameResult = judgement.judge(answerNumber, inputNumber); + outputView.printResult(gameResult); + isWin = gameResult.isWin(); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + continue; } } - int inputCommand = inputView.readCommandInput(); - if (inputCommand == 1) { - return true; + while (true) { + try { + int inputCommand = inputView.readCommandInput(); + return inputCommand == 1; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + continue; + } } - return false; } } From 2091c81b67dd949812cfbba099ac52b112b4e8bb Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Wed, 28 Jan 2026 17:43:38 +0900 Subject: [PATCH 14/24] refac: delete unnecessary class, AnswerNumberModel --- README.md | 3 -- src/main/java/model/AnswerNumberModel.java | 31 ----------------- src/main/java/model/GameResultModel.java | 4 ++- .../java/service/AnswerNumberGenerator.java | 5 ++- .../java/model/AnswerNumberModelTest.java | 34 ------------------- 5 files changed, 5 insertions(+), 72 deletions(-) delete mode 100644 src/main/java/model/AnswerNumberModel.java delete mode 100644 src/test/java/model/AnswerNumberModelTest.java diff --git a/README.md b/README.md index ef0eec32..0a2c951c 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,6 @@ ## 기능 목록 ### Model -#### AnswerNumberModel -1. 현재 게임의 정답이 되는 숫자 배열의 관리 -2. 초기화 시 정답으로 입력된 숫자의 validation #### GameResultModel 1. 사용자가 입력한 숫자에 대한 결과의 관리 2. 결과 출력을 위한 객체의 stringify diff --git a/src/main/java/model/AnswerNumberModel.java b/src/main/java/model/AnswerNumberModel.java deleted file mode 100644 index 56ef1b42..00000000 --- a/src/main/java/model/AnswerNumberModel.java +++ /dev/null @@ -1,31 +0,0 @@ -package model; - -import java.util.Arrays; - -public class AnswerNumberModel { - public static final int ANSWER_NUMBER_LENGTH = 3; - private int[] answerNumber; - - public AnswerNumberModel(int[] answerNumber) { - if (!validate(answerNumber)) { - throw new IllegalArgumentException("[Error] Invalid answer number"); - } - this.answerNumber = answerNumber; - } - - public Boolean validate(int[] answerNumber) { - return isLengthValid(answerNumber) && isAllDistinct(answerNumber); - } - - private Boolean isLengthValid(int[] answerNumber) { - return answerNumber.length == ANSWER_NUMBER_LENGTH; - } - - private Boolean isAllDistinct(int[] answerNumber) { - return Arrays.stream(answerNumber).distinct().count() == ANSWER_NUMBER_LENGTH; - } - - public int[] getAnswerNumber() { - return answerNumber; - } -} diff --git a/src/main/java/model/GameResultModel.java b/src/main/java/model/GameResultModel.java index 6ceafce3..a77b0694 100644 --- a/src/main/java/model/GameResultModel.java +++ b/src/main/java/model/GameResultModel.java @@ -1,5 +1,7 @@ package model; +import service.AnswerNumberGenerator; + public class GameResultModel { private int strike; private int ball; @@ -18,7 +20,7 @@ public int getBall() { } public Boolean isWin() { - return strike == AnswerNumberModel.ANSWER_NUMBER_LENGTH; + return strike == AnswerNumberGenerator.ANSWER_NUMBER_LENGTH; } public String toString() { diff --git a/src/main/java/service/AnswerNumberGenerator.java b/src/main/java/service/AnswerNumberGenerator.java index f0d5fa4b..b54b43f1 100644 --- a/src/main/java/service/AnswerNumberGenerator.java +++ b/src/main/java/service/AnswerNumberGenerator.java @@ -3,14 +3,13 @@ import java.util.Arrays; import java.util.Collections; -import model.AnswerNumberModel; - public class AnswerNumberGenerator { + public static final int ANSWER_NUMBER_LENGTH = 3; public int[] generateAnswerNumber() { int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9}; Collections.shuffle(Arrays.asList(numbers)); int[] answerNumber = Arrays.copyOfRange( - numbers, 0, AnswerNumberModel.ANSWER_NUMBER_LENGTH + numbers, 0, ANSWER_NUMBER_LENGTH ); return answerNumber; } diff --git a/src/test/java/model/AnswerNumberModelTest.java b/src/test/java/model/AnswerNumberModelTest.java deleted file mode 100644 index 9fe98833..00000000 --- a/src/test/java/model/AnswerNumberModelTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package model; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -public class AnswerNumberModelTest { - @Test - @DisplayName("AnswerNumberModel 생성 테스트") - public void testConstructor() { - int[] answerNumber = {1, 2, 3}; - AnswerNumberModel answerNumberModel = new AnswerNumberModel(answerNumber); - assertThat(answerNumberModel.getAnswerNumber()).containsExactly(1, 2, 3); - } - - @Test - @DisplayName("AnswerNumberModel 길이 검증 테스트") - public void testLengthValidation() { - int[] answerNumber = {1, 2}; - assertThatThrownBy(() -> new AnswerNumberModel(answerNumber)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("[Error] Invalid answer number"); - } - - @Test - @DisplayName("AnswerNumberModel 중복 숫자 검증 테스트") - public void testDistinctValidation() { - int[] answerNumber = {1, 1, 2}; - assertThatThrownBy(() -> new AnswerNumberModel(answerNumber)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("[Error] Invalid answer number"); - } -} From 7d1e3587fdf726f73c2556ea84bbd16c682ad132 Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Wed, 28 Jan 2026 17:49:50 +0900 Subject: [PATCH 15/24] refac: refac Controller --- src/main/java/controller/Controller.java | 36 ++++++++++++++++-------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java index 5357a370..e99c437f 100644 --- a/src/main/java/controller/Controller.java +++ b/src/main/java/controller/Controller.java @@ -19,34 +19,46 @@ public Controller() { public void run() { while (true) { - int[] answerNumber = answerNumberGenerator.generateAnswerNumber(); + int[] answerNumber = generateAnswerNumber(); if (playGame(answerNumber)) { break; } } } - private boolean playGame(int[] answerNumber) { - boolean isWin = false; - while (!isWin) { + private int[] generateAnswerNumber() { + return answerNumberGenerator.generateAnswerNumber(); + } + + private int[] getValidInputNumber() { + while (true) { try { - int[] inputNumber = inputView.readNumberInput(); - GameResultModel gameResult = judgement.judge(answerNumber, inputNumber); - outputView.printResult(gameResult); - isWin = gameResult.isWin(); + return inputView.readNumberInput(); } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); - continue; } } + } + + private int getValidCommandInput() { while (true) { try { - int inputCommand = inputView.readCommandInput(); - return inputCommand == 1; + return inputView.readCommandInput(); } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); - continue; } } } + + private boolean playGame(int[] answerNumber) { + boolean isWin = false; + while (!isWin) { + int[] inputNumber = getValidInputNumber(); + GameResultModel gameResult = judgement.judge(answerNumber, inputNumber); + outputView.printResult(gameResult); + isWin = gameResult.isWin(); + } + int inputCommand = getValidCommandInput(); + return inputCommand == 1; + } } From ee89a33a9975705f53ecf47c9c2f504f3f1938f8 Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Wed, 28 Jan 2026 17:55:14 +0900 Subject: [PATCH 16/24] refac: apply convention --- src/main/java/controller/Controller.java | 8 +++++--- src/main/java/model/GameResultModel.java | 3 ++- src/main/java/view/InputView.java | 2 +- src/test/java/service/JudgementTest.java | 3 +-- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java index e99c437f..8100bd8d 100644 --- a/src/main/java/controller/Controller.java +++ b/src/main/java/controller/Controller.java @@ -1,8 +1,10 @@ package controller; -import view.*; -import service.*; -import model.*; +import model.GameResultModel; +import service.AnswerNumberGenerator; +import service.Judgement; +import view.InputView; +import view.OutputView; public class Controller { private InputView inputView; diff --git a/src/main/java/model/GameResultModel.java b/src/main/java/model/GameResultModel.java index a77b0694..cdc88372 100644 --- a/src/main/java/model/GameResultModel.java +++ b/src/main/java/model/GameResultModel.java @@ -19,10 +19,11 @@ public int getBall() { return ball; } - public Boolean isWin() { + public boolean isWin() { return strike == AnswerNumberGenerator.ANSWER_NUMBER_LENGTH; } + @Override public String toString() { if (strike == 0 && ball == 0) { return "낫싱"; diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index a30c18e5..34458340 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -36,7 +36,7 @@ public int readCommandInput() { return parseCommandInput(input); } - public Boolean validateCommandInput(String input) { + public boolean validateCommandInput(String input) { return input.matches("^[1-2]$"); } diff --git a/src/test/java/service/JudgementTest.java b/src/test/java/service/JudgementTest.java index 9c063109..d406c434 100644 --- a/src/test/java/service/JudgementTest.java +++ b/src/test/java/service/JudgementTest.java @@ -2,11 +2,10 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; import model.GameResultModel; -import static org.assertj.core.api.Assertions.assertThat; - public class JudgementTest { @Test @DisplayName("Judgement 생성 테스트") From 692e9bb3866624a08f14d29d1800b38ae79171a1 Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Wed, 28 Jan 2026 18:06:24 +0900 Subject: [PATCH 17/24] refac: add root package --- src/main/java/{ => baseball}/App.java | 4 +++- .../{ => baseball}/controller/Controller.java | 12 ++++++------ .../{ => baseball}/model/GameResultModel.java | 4 ++-- .../service/AnswerNumberGenerator.java | 0 .../java/{ => baseball}/service/Judgement.java | 18 ++++++++++++------ .../java/{ => baseball}/view/InputView.java | 9 ++++++--- .../java/{ => baseball}/view/OutputView.java | 4 ++-- src/test/java/model/GameResultModelTest.java | 2 ++ .../service/AnswerNumberGeneratorTest.java | 2 ++ src/test/java/service/JudgementTest.java | 3 ++- 10 files changed, 37 insertions(+), 21 deletions(-) rename src/main/java/{ => baseball}/App.java (71%) rename src/main/java/{ => baseball}/controller/Controller.java (88%) rename src/main/java/{ => baseball}/model/GameResultModel.java (91%) rename src/main/java/{ => baseball}/service/AnswerNumberGenerator.java (100%) rename src/main/java/{ => baseball}/service/Judgement.java (62%) rename src/main/java/{ => baseball}/view/InputView.java (84%) rename src/main/java/{ => baseball}/view/OutputView.java (82%) diff --git a/src/main/java/App.java b/src/main/java/baseball/App.java similarity index 71% rename from src/main/java/App.java rename to src/main/java/baseball/App.java index 7b539dbc..8f03c569 100644 --- a/src/main/java/App.java +++ b/src/main/java/baseball/App.java @@ -1,4 +1,6 @@ -import controller.Controller; +package baseball; + +import baseball.controller.Controller; public class App { public static void main(String[] args) { diff --git a/src/main/java/controller/Controller.java b/src/main/java/baseball/controller/Controller.java similarity index 88% rename from src/main/java/controller/Controller.java rename to src/main/java/baseball/controller/Controller.java index 8100bd8d..bd987977 100644 --- a/src/main/java/controller/Controller.java +++ b/src/main/java/baseball/controller/Controller.java @@ -1,10 +1,10 @@ -package controller; +package baseball.controller; -import model.GameResultModel; -import service.AnswerNumberGenerator; -import service.Judgement; -import view.InputView; -import view.OutputView; +import baseball.model.GameResultModel; +import baseball.service.AnswerNumberGenerator; +import baseball.service.Judgement; +import baseball.view.InputView; +import baseball.view.OutputView; public class Controller { private InputView inputView; diff --git a/src/main/java/model/GameResultModel.java b/src/main/java/baseball/model/GameResultModel.java similarity index 91% rename from src/main/java/model/GameResultModel.java rename to src/main/java/baseball/model/GameResultModel.java index cdc88372..4ddbe144 100644 --- a/src/main/java/model/GameResultModel.java +++ b/src/main/java/baseball/model/GameResultModel.java @@ -1,6 +1,6 @@ -package model; +package baseball.model; -import service.AnswerNumberGenerator; +import baseball.service.AnswerNumberGenerator; public class GameResultModel { private int strike; diff --git a/src/main/java/service/AnswerNumberGenerator.java b/src/main/java/baseball/service/AnswerNumberGenerator.java similarity index 100% rename from src/main/java/service/AnswerNumberGenerator.java rename to src/main/java/baseball/service/AnswerNumberGenerator.java diff --git a/src/main/java/service/Judgement.java b/src/main/java/baseball/service/Judgement.java similarity index 62% rename from src/main/java/service/Judgement.java rename to src/main/java/baseball/service/Judgement.java index 6cd49a6e..98e93a13 100644 --- a/src/main/java/service/Judgement.java +++ b/src/main/java/baseball/service/Judgement.java @@ -1,6 +1,6 @@ -package service; +package baseball.service; -import model.GameResultModel; +import baseball.model.GameResultModel; public class Judgement { public GameResultModel judge(int[] answerNumber, int[] inputNumber) { @@ -22,10 +22,16 @@ private int countStrike(int[] answerNumber, int[] inputNumber) { private int countBall(int[] answerNumber, int[] inputNumber) { int ball = 0; for (int i = 0; i < answerNumber.length; i++) { - for (int j = 0; j < inputNumber.length; j++) { - if (answerNumber[i] == inputNumber[j] && i != j) { - ball++; - } + ball += countBallForPosition(answerNumber, inputNumber, i); + } + return ball; + } + + private int countBallForPosition(int[] answerNumber, int[] inputNumber, int position) { + int ball = 0; + for (int j = 0; j < inputNumber.length; j++) { + if (answerNumber[position] == inputNumber[j] && position != j) { + ball++; } } return ball; diff --git a/src/main/java/view/InputView.java b/src/main/java/baseball/view/InputView.java similarity index 84% rename from src/main/java/view/InputView.java rename to src/main/java/baseball/view/InputView.java index 34458340..8363c3d6 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -1,6 +1,5 @@ -package view; +package baseball.view; -import java.util.Arrays; import java.util.Scanner; public class InputView { @@ -24,7 +23,11 @@ private boolean validateNumberInput(String input) { } private int[] parseNumberInput(String input) { - return Arrays.stream(input.split("")).mapToInt(Integer::parseInt).toArray(); + int[] numbers = new int[input.length()]; + for (int i = 0; i < input.length(); i++) { + numbers[i] = Character.getNumericValue(input.charAt(i)); + } + return numbers; } public int readCommandInput() { diff --git a/src/main/java/view/OutputView.java b/src/main/java/baseball/view/OutputView.java similarity index 82% rename from src/main/java/view/OutputView.java rename to src/main/java/baseball/view/OutputView.java index 926d2f93..d929a88b 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -1,6 +1,6 @@ -package view; +package baseball.view; -import model.GameResultModel; +import baseball.model.GameResultModel; public class OutputView { public void printResult(GameResultModel gameResult) { diff --git a/src/test/java/model/GameResultModelTest.java b/src/test/java/model/GameResultModelTest.java index 98138b3b..493ab21d 100644 --- a/src/test/java/model/GameResultModelTest.java +++ b/src/test/java/model/GameResultModelTest.java @@ -4,6 +4,8 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import baseball.model.GameResultModel; + public class GameResultModelTest { @Test @DisplayName("GameResultModel 생성 테스트") diff --git a/src/test/java/service/AnswerNumberGeneratorTest.java b/src/test/java/service/AnswerNumberGeneratorTest.java index 8f8b2ae0..4fc1ecdc 100644 --- a/src/test/java/service/AnswerNumberGeneratorTest.java +++ b/src/test/java/service/AnswerNumberGeneratorTest.java @@ -4,6 +4,8 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import baseball.service.AnswerNumberGenerator; + public class AnswerNumberGeneratorTest { @Test @DisplayName("AnswerNumberGenerator 생성 테스트") diff --git a/src/test/java/service/JudgementTest.java b/src/test/java/service/JudgementTest.java index d406c434..932d5392 100644 --- a/src/test/java/service/JudgementTest.java +++ b/src/test/java/service/JudgementTest.java @@ -4,7 +4,8 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -import model.GameResultModel; +import baseball.model.GameResultModel; +import baseball.service.Judgement; public class JudgementTest { @Test From 9d16bd548ce0b97ce811e8acd0b22d8a557f59ef Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Wed, 28 Jan 2026 18:07:12 +0900 Subject: [PATCH 18/24] refac: add root package --- src/main/java/baseball/service/AnswerNumberGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/baseball/service/AnswerNumberGenerator.java b/src/main/java/baseball/service/AnswerNumberGenerator.java index b54b43f1..ff5bd36d 100644 --- a/src/main/java/baseball/service/AnswerNumberGenerator.java +++ b/src/main/java/baseball/service/AnswerNumberGenerator.java @@ -1,4 +1,4 @@ -package service; +package baseball.service; import java.util.Arrays; import java.util.Collections; From 5af96e8c16c887c1e223a95ab6505dd3d3095fe4 Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Wed, 28 Jan 2026 18:10:57 +0900 Subject: [PATCH 19/24] style: edit input prompt text --- src/main/java/baseball/view/InputView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 8363c3d6..62df404a 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -10,7 +10,7 @@ public InputView() { } public int[] readNumberInput() { - System.out.println("숫자를 입력해주세요."); + System.out.print("숫자를 입력해주세요. : "); String input = scanner.nextLine(); if (!validateNumberInput(input)) { throw new IllegalArgumentException("[Error] Invalid number input"); From 9e2be9ef29be2446643af7a83d6197713bbaf9a5 Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Wed, 28 Jan 2026 18:14:46 +0900 Subject: [PATCH 20/24] fix: fix continue condition --- src/main/java/baseball/controller/Controller.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/baseball/controller/Controller.java b/src/main/java/baseball/controller/Controller.java index bd987977..e69e9e37 100644 --- a/src/main/java/baseball/controller/Controller.java +++ b/src/main/java/baseball/controller/Controller.java @@ -61,6 +61,6 @@ private boolean playGame(int[] answerNumber) { isWin = gameResult.isWin(); } int inputCommand = getValidCommandInput(); - return inputCommand == 1; + return inputCommand == 2; } } From 0a118791e62ec5241c833b0d48777c156d0d11a8 Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Wed, 28 Jan 2026 18:22:36 +0900 Subject: [PATCH 21/24] style: correct output msg --- src/main/java/baseball/controller/Controller.java | 2 ++ src/main/java/baseball/view/InputView.java | 2 +- src/main/java/baseball/view/OutputView.java | 4 ++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/baseball/controller/Controller.java b/src/main/java/baseball/controller/Controller.java index e69e9e37..f8d52c8d 100644 --- a/src/main/java/baseball/controller/Controller.java +++ b/src/main/java/baseball/controller/Controller.java @@ -60,6 +60,8 @@ private boolean playGame(int[] answerNumber) { outputView.printResult(gameResult); isWin = gameResult.isWin(); } + outputView.printWinMessage(); + outputView.printContinueQuestion(); int inputCommand = getValidCommandInput(); return inputCommand == 2; } diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 62df404a..ea7f839e 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -10,7 +10,7 @@ public InputView() { } public int[] readNumberInput() { - System.out.print("숫자를 입력해주세요. : "); + System.out.print("숫자를 입력해주세요 : "); String input = scanner.nextLine(); if (!validateNumberInput(input)) { throw new IllegalArgumentException("[Error] Invalid number input"); diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index d929a88b..2612cb81 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -7,6 +7,10 @@ public void printResult(GameResultModel gameResult) { System.out.println(gameResult.toString()); } + public void printWinMessage() { + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 끝"); + } + public void printContinueQuestion() { System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); } From bd498f3eaa6e766224062e6ba4079ec82ce6cff3 Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Wed, 28 Jan 2026 18:23:26 +0900 Subject: [PATCH 22/24] refac: change test package structure --- src/test/java/{ => baseball}/model/GameResultModelTest.java | 4 +--- .../{ => baseball}/service/AnswerNumberGeneratorTest.java | 4 +--- src/test/java/{ => baseball}/service/JudgementTest.java | 3 +-- 3 files changed, 3 insertions(+), 8 deletions(-) rename src/test/java/{ => baseball}/model/GameResultModelTest.java (97%) rename src/test/java/{ => baseball}/service/AnswerNumberGeneratorTest.java (89%) rename src/test/java/{ => baseball}/service/JudgementTest.java (97%) diff --git a/src/test/java/model/GameResultModelTest.java b/src/test/java/baseball/model/GameResultModelTest.java similarity index 97% rename from src/test/java/model/GameResultModelTest.java rename to src/test/java/baseball/model/GameResultModelTest.java index 493ab21d..82acaa8e 100644 --- a/src/test/java/model/GameResultModelTest.java +++ b/src/test/java/baseball/model/GameResultModelTest.java @@ -1,11 +1,9 @@ -package model; +package baseball.model; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -import baseball.model.GameResultModel; - public class GameResultModelTest { @Test @DisplayName("GameResultModel 생성 테스트") diff --git a/src/test/java/service/AnswerNumberGeneratorTest.java b/src/test/java/baseball/service/AnswerNumberGeneratorTest.java similarity index 89% rename from src/test/java/service/AnswerNumberGeneratorTest.java rename to src/test/java/baseball/service/AnswerNumberGeneratorTest.java index 4fc1ecdc..54487c39 100644 --- a/src/test/java/service/AnswerNumberGeneratorTest.java +++ b/src/test/java/baseball/service/AnswerNumberGeneratorTest.java @@ -1,11 +1,9 @@ -package service; +package baseball.service; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -import baseball.service.AnswerNumberGenerator; - public class AnswerNumberGeneratorTest { @Test @DisplayName("AnswerNumberGenerator 생성 테스트") diff --git a/src/test/java/service/JudgementTest.java b/src/test/java/baseball/service/JudgementTest.java similarity index 97% rename from src/test/java/service/JudgementTest.java rename to src/test/java/baseball/service/JudgementTest.java index 932d5392..86a50d25 100644 --- a/src/test/java/service/JudgementTest.java +++ b/src/test/java/baseball/service/JudgementTest.java @@ -1,11 +1,10 @@ -package service; +package baseball.service; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; import baseball.model.GameResultModel; -import baseball.service.Judgement; public class JudgementTest { @Test From 72ce315c61303353a3ab4061cf31ba4c1ff02340 Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Wed, 28 Jan 2026 18:26:01 +0900 Subject: [PATCH 23/24] fix: delete duplicated msg --- src/main/java/baseball/view/InputView.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index ea7f839e..5c4c39cc 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -31,7 +31,6 @@ private int[] parseNumberInput(String input) { } public int readCommandInput() { - System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); String input = scanner.nextLine(); if (!validateCommandInput(input)) { throw new IllegalArgumentException("[Error] Invalid command input"); From f4af9c4b597a870b90574bc821ab62f9466ce161 Mon Sep 17 00:00:00 2001 From: "albus.kim" Date: Wed, 28 Jan 2026 18:28:33 +0900 Subject: [PATCH 24/24] fix: correct random answer generation logic --- .../baseball/service/AnswerNumberGenerator.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/baseball/service/AnswerNumberGenerator.java b/src/main/java/baseball/service/AnswerNumberGenerator.java index ff5bd36d..a5e8ed97 100644 --- a/src/main/java/baseball/service/AnswerNumberGenerator.java +++ b/src/main/java/baseball/service/AnswerNumberGenerator.java @@ -2,15 +2,18 @@ import java.util.Arrays; import java.util.Collections; +import java.util.List; public class AnswerNumberGenerator { public static final int ANSWER_NUMBER_LENGTH = 3; public int[] generateAnswerNumber() { - int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9}; - Collections.shuffle(Arrays.asList(numbers)); - int[] answerNumber = Arrays.copyOfRange( - numbers, 0, ANSWER_NUMBER_LENGTH - ); + Integer[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9}; + List numberList = Arrays.asList(numbers); + Collections.shuffle(numberList); + int[] answerNumber = new int[ANSWER_NUMBER_LENGTH]; + for (int i = 0; i < ANSWER_NUMBER_LENGTH; i++) { + answerNumber[i] = numberList.get(i); + } return answerNumber; } }