From cc63dfd7912acc349ef92cbef7ff20e89a03a460 Mon Sep 17 00:00:00 2001 From: mingmingmon Date: Tue, 3 Feb 2026 00:44:30 +0900 Subject: [PATCH 01/20] =?UTF-8?q?docs(readme):=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=EC=A0=9D=ED=8A=B8=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EA=B8=B0=EC=9E=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8d7e8aee..c07242a3 100644 --- a/README.md +++ b/README.md @@ -1 +1,54 @@ -# java-baseball-precourse \ No newline at end of file +# java-baseball-precourse + +## 프로그램 설계 + +본 숫자 야구 게임은 MVC 패턴을 기반으로 구현하도록 한다. + +### Model + +게임의 핵심 도메인 로직을 담당한다. + +- 봇(컴퓨터)의 랜덤 숫자 생성 +- 플레이어(사용자)의 입력 검증 +- 스트라이크 / 볼 / 낫싱 판정 +- 게임 종료 조건 판단 + +### View + +사용자와의 입출력을 담당하며 게임 로직을 포함하지 않는다. + +- 게임 시작 안내 출력 +- 사용자 입력 요청 +- 판정 결과 출력 +- 게임 종료 및 재시작 안내 + +### Controller + +Model과 View를 연결하며 게임의 전체 흐름을 제어한다. + +- 게임 시작 +- 입력 처리 +- 판정 요청 +- 종료 및 재시작 여부 결정 + +## 기능 목록 (커밋 단위) + +- [ ] 코드 컨벤션 툴 세팅 + - [링크](https://naver.github.io/hackday-conventions-java/)의 코드 컨벤션을 따르도록 인텔리제이 환경 세팅 +- [ ] 봇의 숫자 생성 로직 구현 + - 봇(컴퓨터)가 1~9 사이의 서로 다른 수로 이루어진 3자리 숫자를 생성한다. +- [ ] 봇의 숫자 생성 로직 구현 단위 테스트 +- [ ] 플레이어 입력 검증 로직 구현 + - 플레이어(사용자)는 1~9 사이의 3자리 숫자를 입력할 수 있다. + - 입력값이 유효하지 않으면 예외를 발생시킨다. +- [ ] 플레이어 입력 검증 로직 구현 단위 테스트 +- [ ] '스트라이크' 개수 카운팅 로직 구현 + - 스트라이크는 숫자도 맞고 위치도 맞은 경우 +- [ ] '스트라이크' 개수 카운팅 로직 구현 단위 테스트 +- [ ] '볼' 개수 카운팅 로직 구현 + - 볼은 숫자는 맞지만 위치는 틀린 경우 +- [ ] '볼' 개수 카운팅 로직 구현 단위 테스트 +- [ ] 게임 진행 및 종료 뷰 구현 +- [ ] 게임 진행 및 종료 컨트롤러 구현 +- [ ] 게임 재시작 뷰 구현 +- [ ] 게임 재시작 컨트롤러 구현 From 1533cfe7cb120af9c70323b900150ac0c7682578 Mon Sep 17 00:00:00 2001 From: mingmingmon Date: Tue, 3 Feb 2026 00:45:18 +0900 Subject: [PATCH 02/20] =?UTF-8?q?chore(convention):=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EC=BB=A8=EB=B2=A4=EC=85=98=20=ED=88=B4=20=EC=84=B8=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/checkstyle/naver-checkstyle-rules.xml | 433 ++++++++++++++++++ .../naver-checkstyle-suppressions.xml | 7 + .../checkstyle/naver-intellij-formatter.xml | 62 +++ 3 files changed, 502 insertions(+) create mode 100644 config/checkstyle/naver-checkstyle-rules.xml create mode 100644 config/checkstyle/naver-checkstyle-suppressions.xml create mode 100644 config/checkstyle/naver-intellij-formatter.xml diff --git a/config/checkstyle/naver-checkstyle-rules.xml b/config/checkstyle/naver-checkstyle-rules.xml new file mode 100644 index 00000000..dafbb4d1 --- /dev/null +++ b/config/checkstyle/naver-checkstyle-rules.xml @@ -0,0 +1,433 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/checkstyle/naver-checkstyle-suppressions.xml b/config/checkstyle/naver-checkstyle-suppressions.xml new file mode 100644 index 00000000..3f11e0cd --- /dev/null +++ b/config/checkstyle/naver-checkstyle-suppressions.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/config/checkstyle/naver-intellij-formatter.xml b/config/checkstyle/naver-intellij-formatter.xml new file mode 100644 index 00000000..658fc659 --- /dev/null +++ b/config/checkstyle/naver-intellij-formatter.xml @@ -0,0 +1,62 @@ + + + From 36e79ac9ed5a202f9e0898dde514e3f7ef31ca6e Mon Sep 17 00:00:00 2001 From: mingmingmon Date: Tue, 3 Feb 2026 00:45:46 +0900 Subject: [PATCH 03/20] =?UTF-8?q?feat(random=20number):=20=EB=B4=87?= =?UTF-8?q?=EC=9D=98=20=EC=88=AB=EC=9E=90=20=EC=83=9D=EC=84=B1=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/ComputerNumber.java | 33 +++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/main/java/model/ComputerNumber.java diff --git a/src/main/java/model/ComputerNumber.java b/src/main/java/model/ComputerNumber.java new file mode 100644 index 00000000..96eb29ba --- /dev/null +++ b/src/main/java/model/ComputerNumber.java @@ -0,0 +1,33 @@ +package model; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class ComputerNumber { + + private static final int SIZE = 3; + private static final int MIN = 1; + private static final int MAX = 9; + + private final List numbers; + + public ComputerNumber() { + this.numbers = generate(); + } + + private List generate() { + List pool = new ArrayList<>(); + for (int i = MIN; i <= MAX; i++) { + pool.add(i); + } + + Collections.shuffle(pool); + return pool.subList(0, SIZE); + } + + public List getNumbers() { + return numbers; + } + +} From e56ea54ee3a099bfc82011efecfa9e797a7bc252 Mon Sep 17 00:00:00 2001 From: mingmingmon Date: Tue, 3 Feb 2026 00:46:13 +0900 Subject: [PATCH 04/20] =?UTF-8?q?test(random=20number):=20=EB=B4=87?= =?UTF-8?q?=EC=9D=98=20=EC=88=AB=EC=9E=90=20=EC=83=9D=EC=84=B1=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=8B=A8=EC=9C=84=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/ComputerNumberTest.java | 39 +++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/test/java/model/ComputerNumberTest.java diff --git a/src/test/java/model/ComputerNumberTest.java b/src/test/java/model/ComputerNumberTest.java new file mode 100644 index 00000000..d466c773 --- /dev/null +++ b/src/test/java/model/ComputerNumberTest.java @@ -0,0 +1,39 @@ +package model; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.*; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class ComputerNumberTest { + + @Test + @DisplayName("봇(컴퓨터)는 항상 3자리인 숫자를 생성한다") + void generateThreeDigitNumber() { + ComputerNumber computerNumber = new ComputerNumber(); + List numbers = computerNumber.getNumbers(); + assertThat(numbers).hasSize(3); + } + + @Test + @DisplayName("봇(컴퓨터)이 생성한 숫자는 1에서 9 사이의 값이다") + void generateNumberWithinRange() { + ComputerNumber computerNumber = new ComputerNumber(); + assertThat(computerNumber.getNumbers()) + .allSatisfy(number -> + assertThat(number).isBetween(1, 9)); + } + + @Test + @DisplayName("봇(컴퓨터)이 생성한 숫자는 서로 중복되지 않는다") + void generateDistinctDigits() { + ComputerNumber computerNumber = new ComputerNumber(); + Set numbers = new HashSet<>(computerNumber.getNumbers()); + assertThat(numbers).hasSize(3); + } + +} From c92a5d518c7a71f85f99c47d61c5e5c27b387574 Mon Sep 17 00:00:00 2001 From: mingmingmon Date: Wed, 4 Feb 2026 14:49:57 +0900 Subject: [PATCH 05/20] =?UTF-8?q?feat(player=20number):=20=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=20=EC=9E=85=EB=A0=A5=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/PlayerNumber.java | 60 +++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/main/java/model/PlayerNumber.java diff --git a/src/main/java/model/PlayerNumber.java b/src/main/java/model/PlayerNumber.java new file mode 100644 index 00000000..ab4e2a68 --- /dev/null +++ b/src/main/java/model/PlayerNumber.java @@ -0,0 +1,60 @@ +package model; + +import java.util.ArrayList; +import java.util.List; + +public class PlayerNumber { + + private static final int NUMBER_COUNT = 3; + private static final int MIN = 1; + private static final int MAX = 9; + + private final List numbers; + + public PlayerNumber(String input) { + validate(input); + this.numbers = parse(input); + } + + private void validate(String input) { + validateLength(input); + validateAllDigits(input); + validateRange(input); + } + + private void validateLength(String input) { + if (input.length() != NUMBER_COUNT) { + throw new IllegalArgumentException("입력은 3자리 숫자여야 합니다."); + } + } + + private void validateAllDigits(String input) { + for (char c : input.toCharArray()) { + if (!Character.isDigit(c)) { + throw new IllegalArgumentException("숫자 이외의 입력은 불가능합니다."); + } + } + } + + private void validateRange(String input) { + for (char c : input.toCharArray()) { + int number = c - '0'; + if (number < MIN || number > MAX) { + throw new IllegalArgumentException("1 ~ 9까지의 숫자만 입력 가능합니다."); + } + } + } + + private List parse(String input) { + List result = new ArrayList<>(); + for (char c : input.toCharArray()) { + result.add(c - '0'); + } + return result; + } + + public List getNumbers() { + return numbers; + } + +} From 6dca94fb33693da71ea2526cba82b0a9dd12a8a9 Mon Sep 17 00:00:00 2001 From: mingmingmon Date: Wed, 4 Feb 2026 15:00:26 +0900 Subject: [PATCH 06/20] =?UTF-8?q?test(player=20number):=20=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=20=EC=9E=85=EB=A0=A5=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=EB=8B=A8=EC=9C=84=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/PlayerNumberTest.java | 38 +++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/test/java/model/PlayerNumberTest.java diff --git a/src/test/java/model/PlayerNumberTest.java b/src/test/java/model/PlayerNumberTest.java new file mode 100644 index 00000000..af4cdfab --- /dev/null +++ b/src/test/java/model/PlayerNumberTest.java @@ -0,0 +1,38 @@ +package model; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class PlayerNumberTest { + + @Test + @DisplayName("플레이어는 1~9 사이의 숫자 3자리를 입력할 수 있다") + void createPlayerNumberWithValidInput() { + PlayerNumber playerNumber = new PlayerNumber("123"); + assertThat(playerNumber.getNumbers()) + .containsExactly(1, 2, 3); + } + + @Test + @DisplayName("플레이어가 입력한 숫자가 3자리가 아니면 예외가 발생한다") + void throwExceptionWhenLengthIsNot3() { + assertThatThrownBy(() -> new PlayerNumber("12")) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("플레이어가 입력한 값에 숫자가 아닌 문자가 포함되면 예외가 발생한다.") + void throwExceptionWhenContainsNonDigit() { + assertThatThrownBy(() -> new PlayerNumber("12a")) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("플레이어가 입력한 값에 0이 포함되면 예외가 발생한다.") + void throwExceptionWhenContainsZero() { + assertThatThrownBy(() -> new PlayerNumber("120")) + .isInstanceOf(IllegalArgumentException.class); + } +} From bb5985ec8187046fd7354bf0faeb265803e1c278 Mon Sep 17 00:00:00 2001 From: mingmingmon Date: Wed, 4 Feb 2026 22:14:51 +0900 Subject: [PATCH 07/20] =?UTF-8?q?feat(strike):=20=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EB=9D=BC=EC=9D=B4=ED=81=AC=20=EA=B0=9C=EC=88=98=20=EC=B9=B4?= =?UTF-8?q?=EC=9A=B4=ED=8C=85=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/StrikeCounter.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/model/StrikeCounter.java diff --git a/src/main/java/model/StrikeCounter.java b/src/main/java/model/StrikeCounter.java new file mode 100644 index 00000000..b84a7efd --- /dev/null +++ b/src/main/java/model/StrikeCounter.java @@ -0,0 +1,19 @@ +package model; + +import java.util.List; + +public class StrikeCounter { + + public int count(ComputerNumber computerNumber, PlayerNumber playerNumber) { + List computer = computerNumber.getNumbers(); + List player = playerNumber.getNumbers(); + + int strike = 0; + for (int i = 0; i < computer.size(); i++) { + if (computer.get(i).equals(player.get(i))) { + strike++; + } + } + return strike; + } +} From 7673126e2976157a374468aa997dbeb6ff4b983c Mon Sep 17 00:00:00 2001 From: mingmingmon Date: Wed, 4 Feb 2026 22:32:16 +0900 Subject: [PATCH 08/20] =?UTF-8?q?test(strike):=20=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EB=9D=BC=EC=9D=B4=ED=81=AC=20=EA=B0=9C=EC=88=98=20=EC=B9=B4?= =?UTF-8?q?=EC=9A=B4=ED=8C=85=20=EB=A1=9C=EC=A7=81=20=EB=8B=A8=EC=9C=84=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/ComputerNumber.java | 4 ++ src/test/java/model/StrikeCounterTest.java | 43 +++++++++++++++++++ .../java/model/object/TestComputerNumber.java | 16 +++++++ 3 files changed, 63 insertions(+) create mode 100644 src/test/java/model/StrikeCounterTest.java create mode 100644 src/test/java/model/object/TestComputerNumber.java diff --git a/src/main/java/model/ComputerNumber.java b/src/main/java/model/ComputerNumber.java index 96eb29ba..2d51f6e5 100644 --- a/src/main/java/model/ComputerNumber.java +++ b/src/main/java/model/ComputerNumber.java @@ -12,6 +12,10 @@ public class ComputerNumber { private final List numbers; + public ComputerNumber(List numbers) { + this.numbers = numbers; + } + public ComputerNumber() { this.numbers = generate(); } diff --git a/src/test/java/model/StrikeCounterTest.java b/src/test/java/model/StrikeCounterTest.java new file mode 100644 index 00000000..01984294 --- /dev/null +++ b/src/test/java/model/StrikeCounterTest.java @@ -0,0 +1,43 @@ +package model; + +import static org.assertj.core.api.AssertionsForClassTypes.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import model.object.TestComputerNumber; + +public class StrikeCounterTest { + + private final StrikeCounter strikeCounter = new StrikeCounter(); + + @Test + @DisplayName("같은 숫자가 같은 위치에 있으면 스트라이크로 계산한다") + void countStrikeWhenNumberAndPositionMatch() { + ComputerNumber computer = TestComputerNumber.of(1, 2, 3); + PlayerNumber player = new PlayerNumber("123"); + + int strike = strikeCounter.count(computer, player); + assertThat(strike).isEqualTo(3); + } + + @Test + @DisplayName("숫자가 같아도 위치가 다르면 스트라이크가 아니다") + void doNotCountStrikeWhenPositionIsDifferent() { + ComputerNumber computer = TestComputerNumber.of(1, 2, 3); + PlayerNumber player = new PlayerNumber("231"); + + int strike = strikeCounter.count(computer, player); + assertThat(strike).isEqualTo(0); + } + + @Test + @DisplayName("일부 숫자만 같은 위치에 있으면 해당 개수만 스트라이크다") + void countPartialStrike() { + ComputerNumber computer = TestComputerNumber.of(1, 2, 3); + PlayerNumber player = new PlayerNumber("129"); + + int strike = strikeCounter.count(computer, player); + assertThat(strike).isEqualTo(2); + } +} diff --git a/src/test/java/model/object/TestComputerNumber.java b/src/test/java/model/object/TestComputerNumber.java new file mode 100644 index 00000000..2782a661 --- /dev/null +++ b/src/test/java/model/object/TestComputerNumber.java @@ -0,0 +1,16 @@ +package model.object; + +import java.util.List; + +import model.ComputerNumber; + +public class TestComputerNumber extends ComputerNumber { + + private TestComputerNumber(List numbers) { + super(numbers); + } + + public static ComputerNumber of(int a, int b, int c) { + return new TestComputerNumber(List.of(a, b, c)); + } +} From 52686f9d4e6c01608d03bc10371bd96d2b0c6349 Mon Sep 17 00:00:00 2001 From: mingmingmon Date: Wed, 4 Feb 2026 22:37:43 +0900 Subject: [PATCH 09/20] =?UTF-8?q?feat(ball):=20=EB=B3=BC=20=EA=B0=9C?= =?UTF-8?q?=EC=88=98=20=EC=B9=B4=EC=9A=B4=ED=8C=85=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 --- src/main/java/model/BallCounter.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/model/BallCounter.java diff --git a/src/main/java/model/BallCounter.java b/src/main/java/model/BallCounter.java new file mode 100644 index 00000000..185425f6 --- /dev/null +++ b/src/main/java/model/BallCounter.java @@ -0,0 +1,22 @@ +package model; + +import java.util.List; + +public class BallCounter { + + public int count(ComputerNumber computerNumber, PlayerNumber playerNumber) { + List computer = computerNumber.getNumbers(); + List player = playerNumber.getNumbers(); + + int ball = 0; + for (int i = 0; i < player.size(); i++) { + int playerNumberAt = player.get(i); + + if (computer.contains(playerNumberAt) + && !computer.get(i).equals(playerNumberAt)) { + ball++; + } + } + return ball; + } +} From a1a55d1b79c0c70d7b49a8dcb4290e850358ab93 Mon Sep 17 00:00:00 2001 From: mingmingmon Date: Wed, 4 Feb 2026 23:09:13 +0900 Subject: [PATCH 10/20] =?UTF-8?q?fix(ball):=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EA=B0=80=20=EC=9E=85=EB=A0=A5=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=EB=90=9C=20=EC=88=AB=EC=9E=90=EB=A5=BC=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=ED=95=9C=20=EA=B2=BD=EC=9A=B0=EB=A5=BC=20?= =?UTF-8?q?=EA=B3=A0=EB=A0=A4=ED=95=98=EC=97=AC=20=EB=B3=BC=20=EC=B9=B4?= =?UTF-8?q?=EC=9A=B4=ED=8C=85=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/BallCounter.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/model/BallCounter.java b/src/main/java/model/BallCounter.java index 185425f6..6090b677 100644 --- a/src/main/java/model/BallCounter.java +++ b/src/main/java/model/BallCounter.java @@ -1,15 +1,18 @@ package model; +import java.util.HashSet; import java.util.List; +import java.util.Set; public class BallCounter { public int count(ComputerNumber computerNumber, PlayerNumber playerNumber) { List computer = computerNumber.getNumbers(); List player = playerNumber.getNumbers(); + Set playerSet = new HashSet<>(player); int ball = 0; - for (int i = 0; i < player.size(); i++) { + for (int i = 0; i < playerSet.size(); i++) { int playerNumberAt = player.get(i); if (computer.contains(playerNumberAt) From d0ec6bf9d59af569498afa7f79feffe7f1519a1d Mon Sep 17 00:00:00 2001 From: mingmingmon Date: Wed, 4 Feb 2026 23:11:33 +0900 Subject: [PATCH 11/20] =?UTF-8?q?test(ball):=20=EB=B3=BC=20=EA=B0=9C?= =?UTF-8?q?=EC=88=98=20=EC=B9=B4=EC=9A=B4=ED=8C=85=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EB=8B=A8=EC=9C=84=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/BallCounterTest.java | 53 ++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/test/java/model/BallCounterTest.java diff --git a/src/test/java/model/BallCounterTest.java b/src/test/java/model/BallCounterTest.java new file mode 100644 index 00000000..3c34431f --- /dev/null +++ b/src/test/java/model/BallCounterTest.java @@ -0,0 +1,53 @@ +package model; + +import static org.assertj.core.api.AssertionsForClassTypes.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import model.object.TestComputerNumber; + +public class BallCounterTest { + + private final BallCounter ballCounter = new BallCounter(); + + @Test + @DisplayName("같은 숫자가 다른 위치에 있으면 볼로 계산한다") + void countBallWhenNumberMatchesButPositionDiffers() { + ComputerNumber computer = TestComputerNumber.of(1, 2, 3); + PlayerNumber player = new PlayerNumber("321"); + + int ball = ballCounter.count(computer, player); + assertThat(ball).isEqualTo(2); + } + + @Test + @DisplayName("같은 위치의 숫자는 볼로 계산하지 않는다") + void doNotCountBallWhenPositionMatches() { + ComputerNumber computer = TestComputerNumber.of(1, 2, 3); + PlayerNumber player = new PlayerNumber("129"); + + int ball = ballCounter.count(computer, player); + assertThat(ball).isEqualTo(0); + } + + @Test + @DisplayName("플레이어의 숫자에서 중복된 수가 있는 경우 스트라이크를 볼보다 우선시 한다") + void countBallOnceEvenIfPlayerHasDuplicates() { + ComputerNumber computer = TestComputerNumber.of(1, 2, 3); + PlayerNumber player = new PlayerNumber("121"); + + int ball = ballCounter.count(computer, player); + assertThat(ball).isEqualTo(0); + } + + @Test + @DisplayName("스트라이크로 사용된 숫자는 볼로 계산되지 않는다") + void doNotCountBallForStrikeNumbers() { + ComputerNumber computer = TestComputerNumber.of(1, 2, 3); + PlayerNumber player = new PlayerNumber("131"); + + int ball = ballCounter.count(computer, player); + assertThat(ball).isEqualTo(1); + } +} From 60152a7a9e88ab3bdad95ee88d6964e1dbb9ce99 Mon Sep 17 00:00:00 2001 From: mingmingmon Date: Wed, 4 Feb 2026 23:33:37 +0900 Subject: [PATCH 12/20] =?UTF-8?q?docs(readme):=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EB=AA=A9=EB=A3=8D=EC=97=90=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EC=9E=85=EB=A0=A5=20=ED=8C=90=EC=A0=95=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=B0=8F=20=EB=8B=A8=EC=9C=84=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=ED=95=AD=EB=AA=A9=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index c07242a3..d614ebd1 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,8 @@ Model과 View를 연결하며 게임의 전체 흐름을 제어한다. - [ ] '볼' 개수 카운팅 로직 구현 - 볼은 숫자는 맞지만 위치는 틀린 경우 - [ ] '볼' 개수 카운팅 로직 구현 단위 테스트 +- [ ] 플레이어 입력 판정 로직 구현 +- [ ] 플레이어 입력 판정 로직 구현 단위 테스트 - [ ] 게임 진행 및 종료 뷰 구현 - [ ] 게임 진행 및 종료 컨트롤러 구현 - [ ] 게임 재시작 뷰 구현 From 72866eee6bd394733997b6c0085e5c10f65af448 Mon Sep 17 00:00:00 2001 From: mingmingmon Date: Wed, 4 Feb 2026 23:42:16 +0900 Subject: [PATCH 13/20] =?UTF-8?q?feat(judge):=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=20=EC=9E=85=EB=A0=A5=20=ED=8C=90=EC=A0=95=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/Judge.java | 21 ++++++++++ src/main/java/model/object/Result.java | 53 ++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 src/main/java/model/Judge.java create mode 100644 src/main/java/model/object/Result.java diff --git a/src/main/java/model/Judge.java b/src/main/java/model/Judge.java new file mode 100644 index 00000000..f4a4c8be --- /dev/null +++ b/src/main/java/model/Judge.java @@ -0,0 +1,21 @@ +package model; + +import model.object.Result; + +public class Judge { + + private final StrikeCounter strikeCounter; + private final BallCounter ballCounter; + + public Judge() { + this.strikeCounter = new StrikeCounter(); + this.ballCounter = new BallCounter(); + } + + public Result judge(ComputerNumber computerNumber, PlayerNumber playerNumber) { + int strike = strikeCounter.count(computerNumber, playerNumber); + int ball = ballCounter.count(computerNumber, playerNumber); + + return new Result(strike, ball); + } +} diff --git a/src/main/java/model/object/Result.java b/src/main/java/model/object/Result.java new file mode 100644 index 00000000..806cd4e0 --- /dev/null +++ b/src/main/java/model/object/Result.java @@ -0,0 +1,53 @@ +package model.object; + +public class Result { + + private final int strike; + private final int ball; + + public Result(int strike, int ball) { + validate(strike, ball); + this.strike = strike; + this.ball = ball; + } + + private void validate(int strike, int ball) { + if (strike < 0 || ball < 0) { + throw new IllegalArgumentException("스트라이크와 볼은 음수가 될 수 없습니다."); + } + if (strike + ball > 3) { + throw new IllegalArgumentException("스트라이크와 볼의 합은 3을 넘을 수 없습니다."); + } + } + + public int getStrike() { + return this.strike; + } + + public int getBall() { + return this.ball; + } + + @Override + public String toString() { + if (strike == 0 && ball == 0) { + return "낫싱"; + } + + StringBuilder result = new StringBuilder(); + + if (strike > 0) { + result.append(strike).append("스트라이크"); + } + + if (strike > 0 && ball > 0) { + result.append(" "); + } + + if (ball > 0) { + result.append(ball).append("볼"); + } + + return result.toString(); + } +} From 15c6c77748773d6599c5b79780a3097a58ddf5b1 Mon Sep 17 00:00:00 2001 From: mingmingmon Date: Wed, 4 Feb 2026 23:42:40 +0900 Subject: [PATCH 14/20] =?UTF-8?q?test(judge):=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=20=EC=9E=85=EB=A0=A5=20=ED=8C=90=EC=A0=95=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EB=8B=A8=EC=9C=84=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/JudgeTest.java | 50 ++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/test/java/model/JudgeTest.java diff --git a/src/test/java/model/JudgeTest.java b/src/test/java/model/JudgeTest.java new file mode 100644 index 00000000..049c6378 --- /dev/null +++ b/src/test/java/model/JudgeTest.java @@ -0,0 +1,50 @@ +package model; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import model.object.Result; +import model.object.TestComputerNumber; + +public class JudgeTest { + + private final Judge judge = new Judge(); + + @Test + @DisplayName("스트라이크와 볼을 종합하여 Result를 생성한다") + void judgeReturnsCorrectResult() { + ComputerNumber computer = TestComputerNumber.of(1, 2, 3); + PlayerNumber player = new PlayerNumber("132"); + + Result result = judge.judge(computer, player); + assertThat(result.getStrike()).isEqualTo(1); + assertThat(result.getBall()).isEqualTo(2); + assertThat(result.toString()).isEqualTo("1스트라이크 2볼"); + } + + @Test + @DisplayName("스트라이크와 볼이 모두 0이면 낫싱이다") + void judgeReturnsNothing() { + ComputerNumber computer = TestComputerNumber.of(1, 2, 3); + PlayerNumber player = new PlayerNumber("456"); + + Result result = judge.judge(computer, player); + assertThat(result.getStrike()).isZero(); + assertThat(result.getBall()).isZero(); + assertThat(result.toString()).isEqualTo("낫싱"); + } + + @Test + @DisplayName("플레이어 숫자가 중복되어도 규칙에 맞게 판정한다") + void judgeHandlesDuplicatePlayerNumber() { + ComputerNumber computer = TestComputerNumber.of(1, 2, 3); + PlayerNumber player = new PlayerNumber("111"); + + Result result = judge.judge(computer, player); + assertThat(result.getStrike()).isEqualTo(1); + assertThat(result.getBall()).isZero(); + assertThat(result.toString()).isEqualTo("1스트라이크"); + } +} From 7bd4a2900002ba143d04c15ffc064d6d9f9259f6 Mon Sep 17 00:00:00 2001 From: mingmingmon Date: Wed, 4 Feb 2026 23:48:54 +0900 Subject: [PATCH 15/20] =?UTF-8?q?docs(readme):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=9E=AC=EC=8B=9C=EC=9E=91=20=EA=B4=80=EB=A0=A8=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=ED=95=AD=EB=AA=A9=EC=9D=84=20=EC=A7=84=ED=96=89?= =?UTF-8?q?=EA=B3=BC=20=EC=A2=85=EB=A3=8C=20=ED=95=AD=EB=AA=A9=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=ED=9D=A1=EC=88=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index d614ebd1..a81eb1ee 100644 --- a/README.md +++ b/README.md @@ -52,5 +52,3 @@ Model과 View를 연결하며 게임의 전체 흐름을 제어한다. - [ ] 플레이어 입력 판정 로직 구현 단위 테스트 - [ ] 게임 진행 및 종료 뷰 구현 - [ ] 게임 진행 및 종료 컨트롤러 구현 -- [ ] 게임 재시작 뷰 구현 -- [ ] 게임 재시작 컨트롤러 구현 From 47e40d3360f5a79d856a8b8e13fa439ebfa88906 Mon Sep 17 00:00:00 2001 From: mingmingmon Date: Wed, 4 Feb 2026 23:58:36 +0900 Subject: [PATCH 16/20] =?UTF-8?q?feat(view):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=A7=84=ED=96=89=20=EB=B0=8F=20=EC=A2=85=EB=A3=8C=20=EB=B7=B0?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/GameView.java | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/main/java/view/GameView.java diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java new file mode 100644 index 00000000..93ae172f --- /dev/null +++ b/src/main/java/view/GameView.java @@ -0,0 +1,32 @@ +package view; + +import java.util.Scanner; + +import model.object.Result; + +public class GameView { + + private final Scanner scanner = new Scanner(System.in); + + public String readPlayerNumber() { + System.out.print("숫자를 입력해주세요 : "); + return scanner.nextLine(); + } + + public void printResult(Result result) { + System.out.println(result.toString()); + } + + public void printGamClear() { + System.out.println("3개의 숫자를 모두 맞히셨습니다!"); + } + + public int readRestartCommand() { + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + return Integer.parseInt(scanner.nextLine()); + } + + public void printErrorMessage(String message) { + System.out.println(message); + } +} From fa9482797df36831ae1660473b2386a05386a245 Mon Sep 17 00:00:00 2001 From: mingmingmon Date: Thu, 5 Feb 2026 00:39:18 +0900 Subject: [PATCH 17/20] =?UTF-8?q?feat(controller):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=A7=84=ED=96=89=20=EB=B0=8F=20=EC=A2=85=EB=A3=8C=20=EC=BB=A8?= =?UTF-8?q?=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/GameController.java | 48 ++++++++++++++++++++ src/main/java/model/object/Result.java | 4 ++ 2 files changed, 52 insertions(+) create mode 100644 src/main/java/controller/GameController.java diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java new file mode 100644 index 00000000..05e68e77 --- /dev/null +++ b/src/main/java/controller/GameController.java @@ -0,0 +1,48 @@ +package controller; + +import model.ComputerNumber; +import model.Judge; +import model.PlayerNumber; +import model.object.Result; +import view.GameView; + +public class GameController { + + private final GameView view = new GameView(); + private final Judge judge = new Judge(); + + private Result round(ComputerNumber computer) { + try { + PlayerNumber player = new PlayerNumber(view.readPlayerNumber()); + return judge.judge(computer, player); + } catch (IllegalArgumentException e) { + view.printErrorMessage(e.getMessage()); + return round(computer); + } + } + + private boolean isRestart() { + return view.readRestartCommand() == 1; + } + + public void run() { + do { + playGame(); + } while (isRestart()); + } + + private void playGame() { + ComputerNumber computer = new ComputerNumber(); + + while (true) { + Result result = round(computer); + view.printResult(result); + + if (result.isThreeStrike()) { + view.printGamClear(); + return; + } + } + } + +} diff --git a/src/main/java/model/object/Result.java b/src/main/java/model/object/Result.java index 806cd4e0..c6606441 100644 --- a/src/main/java/model/object/Result.java +++ b/src/main/java/model/object/Result.java @@ -28,6 +28,10 @@ public int getBall() { return this.ball; } + public boolean isThreeStrike() { + return this.strike == 3 && this.ball == 0; + } + @Override public String toString() { if (strike == 0 && ball == 0) { From 62785cf374d95a600d2b18545341001dc32f1ab1 Mon Sep 17 00:00:00 2001 From: mingmingmon Date: Thu, 5 Feb 2026 00:42:00 +0900 Subject: [PATCH 18/20] =?UTF-8?q?fix(ball):=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EC=9D=98=20=EC=88=AB=EC=9E=90=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=EB=90=9C=20=EC=88=98=EA=B0=80=20=EC=97=B0?= =?UTF-8?q?=EC=86=8D=EC=9D=B8=20=EA=B2=BD=EC=9A=B0=20=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EB=9D=BC=EC=9D=B4=ED=81=AC=EB=A1=9C=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EB=90=9C=20=EC=88=AB=EC=9E=90=EA=B0=80=20=EB=B3=BC=EB=A1=9C=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=EB=90=98=EB=8A=94=20=EB=B2=84=EA=B7=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/BallCounter.java | 24 +++++++++++------------- src/test/java/model/BallCounterTest.java | 12 ++++++------ src/test/java/model/JudgeTest.java | 4 ++-- 3 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/main/java/model/BallCounter.java b/src/main/java/model/BallCounter.java index 6090b677..b0fa09ab 100644 --- a/src/main/java/model/BallCounter.java +++ b/src/main/java/model/BallCounter.java @@ -1,25 +1,23 @@ package model; +import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class BallCounter { - public int count(ComputerNumber computerNumber, PlayerNumber playerNumber) { - List computer = computerNumber.getNumbers(); - List player = playerNumber.getNumbers(); - Set playerSet = new HashSet<>(player); + private final StrikeCounter strikeCounter = new StrikeCounter(); - int ball = 0; - for (int i = 0; i < playerSet.size(); i++) { - int playerNumberAt = player.get(i); + public List extractCommonNumber(List a, List b) { + Set common = new HashSet<>(a); + common.retainAll(b); + return new ArrayList<>(common); + } - if (computer.contains(playerNumberAt) - && !computer.get(i).equals(playerNumberAt)) { - ball++; - } - } - return ball; + public int count(ComputerNumber computer, PlayerNumber player) { + List commonNumbers = extractCommonNumber(computer.getNumbers(), player.getNumbers()); + return commonNumbers.size() - strikeCounter.count(computer, player); } + } diff --git a/src/test/java/model/BallCounterTest.java b/src/test/java/model/BallCounterTest.java index 3c34431f..e38b5ab8 100644 --- a/src/test/java/model/BallCounterTest.java +++ b/src/test/java/model/BallCounterTest.java @@ -15,10 +15,10 @@ public class BallCounterTest { @DisplayName("같은 숫자가 다른 위치에 있으면 볼로 계산한다") void countBallWhenNumberMatchesButPositionDiffers() { ComputerNumber computer = TestComputerNumber.of(1, 2, 3); - PlayerNumber player = new PlayerNumber("321"); + PlayerNumber player = new PlayerNumber("312"); int ball = ballCounter.count(computer, player); - assertThat(ball).isEqualTo(2); + assertThat(ball).isEqualTo(3); } @Test @@ -35,7 +35,7 @@ void doNotCountBallWhenPositionMatches() { @DisplayName("플레이어의 숫자에서 중복된 수가 있는 경우 스트라이크를 볼보다 우선시 한다") void countBallOnceEvenIfPlayerHasDuplicates() { ComputerNumber computer = TestComputerNumber.of(1, 2, 3); - PlayerNumber player = new PlayerNumber("121"); + PlayerNumber player = new PlayerNumber("124"); int ball = ballCounter.count(computer, player); assertThat(ball).isEqualTo(0); @@ -44,10 +44,10 @@ void countBallOnceEvenIfPlayerHasDuplicates() { @Test @DisplayName("스트라이크로 사용된 숫자는 볼로 계산되지 않는다") void doNotCountBallForStrikeNumbers() { - ComputerNumber computer = TestComputerNumber.of(1, 2, 3); - PlayerNumber player = new PlayerNumber("131"); + ComputerNumber computer = TestComputerNumber.of(4, 2, 7); + PlayerNumber player = new PlayerNumber("223"); int ball = ballCounter.count(computer, player); - assertThat(ball).isEqualTo(1); + assertThat(ball).isEqualTo(0); } } diff --git a/src/test/java/model/JudgeTest.java b/src/test/java/model/JudgeTest.java index 049c6378..d35baca1 100644 --- a/src/test/java/model/JudgeTest.java +++ b/src/test/java/model/JudgeTest.java @@ -39,8 +39,8 @@ void judgeReturnsNothing() { @Test @DisplayName("플레이어 숫자가 중복되어도 규칙에 맞게 판정한다") void judgeHandlesDuplicatePlayerNumber() { - ComputerNumber computer = TestComputerNumber.of(1, 2, 3); - PlayerNumber player = new PlayerNumber("111"); + ComputerNumber computer = TestComputerNumber.of(4, 2, 7); + PlayerNumber player = new PlayerNumber("223"); Result result = judge.judge(computer, player); assertThat(result.getStrike()).isEqualTo(1); From f161bda1d1e50705ccc2978ea162263bb316eb33 Mon Sep 17 00:00:00 2001 From: mingmingmon Date: Thu, 5 Feb 2026 00:47:17 +0900 Subject: [PATCH 19/20] =?UTF-8?q?feat(main):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EA=B5=AC=EB=8F=99=20main=20=ED=95=A8=EC=88=98=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 --- README.md | 1 + src/main/java/Application.java | 8 ++++++++ 2 files changed, 9 insertions(+) create mode 100644 src/main/java/Application.java diff --git a/README.md b/README.md index a81eb1ee..9ff4ac9b 100644 --- a/README.md +++ b/README.md @@ -52,3 +52,4 @@ Model과 View를 연결하며 게임의 전체 흐름을 제어한다. - [ ] 플레이어 입력 판정 로직 구현 단위 테스트 - [ ] 게임 진행 및 종료 뷰 구현 - [ ] 게임 진행 및 종료 컨트롤러 구현 +- [ ] 게임 구동 main 함수 구현 diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 00000000..cba0effe --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,8 @@ +import controller.GameController; + +public class Application { + public static void main(String[] args) { + GameController controller = new GameController(); + controller.run(); + } +} From ea2a7e7f56d584add9e87f207fea00429fcc276b Mon Sep 17 00:00:00 2001 From: mingmingmon Date: Fri, 6 Feb 2026 17:45:12 +0900 Subject: [PATCH 20/20] =?UTF-8?q?fix(error=20message):=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EC=8B=9C=20=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=A5=B8=20=ED=94=84=EB=A6=AC=ED=94=BD=EC=8A=A4=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/GameView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index 93ae172f..23800841 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -27,6 +27,6 @@ public int readRestartCommand() { } public void printErrorMessage(String message) { - System.out.println(message); + System.out.println("[ERROR] " + message); } }