From c3dc25970f926c245a295da31cdc14fe7a1632c5 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Wed, 28 Jan 2026 16:26:10 +0900 Subject: [PATCH 01/34] =?UTF-8?q?docs:=20readme=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8d7e8aee..ea77745a 100644 --- a/README.md +++ b/README.md @@ -1 +1,44 @@ -# java-baseball-precourse \ No newline at end of file +# java-baseball-precourse + +1. 게임 시작 및 초기화 +- 애플리케이션 실행 시 숫자 야구 게임을 시작한다. +- 컴퓨터의 정답 숫자 3자리를 생성한다. +- 1~9 사이의 숫자만 사용한다. +- 중복되지 않는 서로 다른 숫자 3개로 구성한다. +- 3자리 수(문자열 또는 리스트 등)로 관리한다. + +--- +2. 사용자 입력 처리 +- 사용자로부터 3자리 숫자를 입력받는다. +- 입력값 검증을 수행한다. +- 길이가 3인지 확인한다. +- 모두 숫자인지 확인한다. +- 각 자리가 1~9인지 확인한다. +- 중복 숫자가 없는지 확인한다. +- 잘못된 입력이면 예외 처리 후 에러 메시지를 출력한다. +- [ERROR]로 시작하는 메시지를 출력한다. +- 에러 이후에도 게임은 종료되지 않고 다시 입력을 받는다. + +--- +3. 결과(힌트) 판정 +- 사용자 입력과 컴퓨터 정답을 비교하여 스트라이크/볼/낫싱을 계산한다. +- 같은 숫자가 같은 자리면 스트라이크 +- 같은 숫자가 다른 자리면 볼 +- 공통 숫자가 하나도 없으면 낫싱 +- 판정 결과를 출력한다. +- 스트라이크/볼이 존재하면 조합 형태로 출력한다. (예: 1스트라이크 1볼) +- 아무것도 없으면 낫싱을 출력한다. + +--- +4. 게임 진행 루프 +- 사용자가 정답 3자리를 모두 맞힐 때까지(3스트라이크) 입력 → 판정 → 출력 과정을 반복한다. +- 3스트라이크가 되면 게임 종료 메시지를 출력한다. + +--- +5. 게임 종료 후 재시작/종료 +- 게임 종료 후 사용자에게 재시작/종료 입력을 받는다. +- 1 입력 시 게임을 다시 시작한다 (정답 숫자 재생성). +- 2 입력 시 프로그램을 완전히 종료한다. +- 재시작/종료 입력값이 잘못된 경우에도 예외 처리한다. +- [ERROR]로 시작하는 메시지를 출력한다. +- 다시 입력을 받는다. \ No newline at end of file From c082f3219b77c7dfc9e125f5976320b8aff12c0c Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Wed, 28 Jan 2026 16:26:54 +0900 Subject: [PATCH 02/34] =?UTF-8?q?feat:=20main=20=ED=95=A8=EC=88=98=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 --- src/main/java/Application.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/main/java/Application.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 00000000..54844437 --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,5 @@ +public class Application { + + public static void main(String[] args) { + } +} \ No newline at end of file From 4e90c1b6846583d4158fd78dcd8992d6b8e96c44 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Wed, 28 Jan 2026 16:49:19 +0900 Subject: [PATCH 03/34] =?UTF-8?q?feat:=20main=20=EB=82=B4=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=ED=95=A8=EC=88=98=20=EC=BD=94=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Application.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 54844437..9c97455f 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,5 +1,7 @@ public class Application { public static void main(String[] args) { + BaseballGame game = new BaseballGame(); + game.run(); } } \ No newline at end of file From 8a9bad8016c5eadac811ce2973a3e0778d76337d Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Wed, 28 Jan 2026 17:02:09 +0900 Subject: [PATCH 04/34] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/BaseballGame.java | 5 +++++ src/main/java/view/InputView.java | 7 +++++++ 2 files changed, 12 insertions(+) create mode 100644 src/main/java/model/BaseballGame.java create mode 100644 src/main/java/view/InputView.java diff --git a/src/main/java/model/BaseballGame.java b/src/main/java/model/BaseballGame.java new file mode 100644 index 00000000..8d877916 --- /dev/null +++ b/src/main/java/model/BaseballGame.java @@ -0,0 +1,5 @@ +package model; + +public class BaseballGame { + private final InputView inputView = new InputView(); +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 00000000..86a9523d --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,7 @@ +package view; + +import java.util.Scanner; + +public class InputView { + private final Scanner scanner = new Scanner(System.in); +} From 205546cbede2decaf4bff44471bec6d64bfa58ef Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Wed, 28 Jan 2026 17:06:00 +0900 Subject: [PATCH 05/34] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/BaseballGame.java | 1 + src/main/java/view/OutputView.java | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 src/main/java/view/OutputView.java diff --git a/src/main/java/model/BaseballGame.java b/src/main/java/model/BaseballGame.java index 8d877916..a430ffd8 100644 --- a/src/main/java/model/BaseballGame.java +++ b/src/main/java/model/BaseballGame.java @@ -2,4 +2,5 @@ public class BaseballGame { private final InputView inputView = new InputView(); + private final OutPutView outPutView = new OutputView(); } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 00000000..d8f9743c --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,4 @@ +package view; + +public class OutputView { +} From 74e2b6dbc1f1a531c6206a1163bd1ddb8281d3ae Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Wed, 28 Jan 2026 17:10:24 +0900 Subject: [PATCH 06/34] =?UTF-8?q?feat:=20=EC=95=A0=ED=94=8C=EB=A6=AC?= =?UTF-8?q?=EC=BC=80=EC=9D=B4=EC=85=98=20=EC=8B=A4=ED=96=89=20=EC=8B=9C=20?= =?UTF-8?q?=EC=88=AB=EC=9E=90=20=EC=95=BC=EA=B5=AC=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=8B=A4=ED=96=89=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/BaseballGame.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/model/BaseballGame.java b/src/main/java/model/BaseballGame.java index a430ffd8..8b6fb9b0 100644 --- a/src/main/java/model/BaseballGame.java +++ b/src/main/java/model/BaseballGame.java @@ -3,4 +3,18 @@ public class BaseballGame { private final InputView inputView = new InputView(); private final OutPutView outPutView = new OutputView(); + + public void run() { + boolean keepPlaying = true; + while (keepPlaying) { + // 게임 시작 + playingGame(); + + /* 재시작 여부 결정 + yes 선택 시: askRestart는 true 반환 + no 선택 시: askRestart는 false 반환 + */ + keepPlaying = askRestart(); + } + } } From 4ddd39c9359b56e3da06a127c97b54196cab7b52 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Wed, 28 Jan 2026 18:17:14 +0900 Subject: [PATCH 07/34] =?UTF-8?q?feat:=20=EC=BB=B4=ED=93=A8=ED=84=B0?= =?UTF-8?q?=EC=9D=98=20=EC=A0=95=EB=8B=B5=203=EC=9E=90=EB=A6=AC=20?= =?UTF-8?q?=EC=88=AB=EC=9E=90=20=EC=83=9D=EC=84=B1=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/BaseballGame.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/model/BaseballGame.java b/src/main/java/model/BaseballGame.java index 8b6fb9b0..158e5d75 100644 --- a/src/main/java/model/BaseballGame.java +++ b/src/main/java/model/BaseballGame.java @@ -1,14 +1,17 @@ package model; +import java.util.*; + public class BaseballGame { private final InputView inputView = new InputView(); private final OutPutView outPutView = new OutputView(); + private final Random random = new Random(); public void run() { boolean keepPlaying = true; while (keepPlaying) { // 게임 시작 - playingGame(); + playSingleGame(); /* 재시작 여부 결정 yes 선택 시: askRestart는 true 반환 @@ -17,4 +20,18 @@ public void run() { keepPlaying = askRestart(); } } + + private void playSingleGame() { + List targetNum = generateComputerNumber(); + } + + private List generateComputerNumber() { + Set setNum = new LinkedHashSet<>(); + while (setNum.size() < 3) { + int n = random.nextInt(9) + 1; + setNum.add(n); + } + return new ArrayList<>(setNum); + } + } From d1fdb883f5bec3195921456f3701c8a3430c4ba1 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Wed, 28 Jan 2026 18:32:36 +0900 Subject: [PATCH 08/34] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EA=B0=92=20=EB=B0=9B=EA=B8=B0=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/BaseballGame.java | 6 ++++++ src/main/java/view/InputView.java | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/src/main/java/model/BaseballGame.java b/src/main/java/model/BaseballGame.java index 158e5d75..fea46100 100644 --- a/src/main/java/model/BaseballGame.java +++ b/src/main/java/model/BaseballGame.java @@ -1,5 +1,7 @@ package model; +import view.InputView; + import java.util.*; public class BaseballGame { @@ -23,6 +25,10 @@ public void run() { private void playSingleGame() { List targetNum = generateComputerNumber(); + + while (true) { + String userInput = inputView.readGuess(); + } } private List generateComputerNumber() { diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 86a9523d..90238b20 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -4,4 +4,9 @@ public class InputView { private final Scanner scanner = new Scanner(System.in); + + public String readGuess() { + System.out.print("숫자를 입력해주세요: "); + return scanner.nextLine(); + } } From 96ced91300f7b76bb2018ea6ab96ab5f4782c468 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Fri, 30 Jan 2026 23:01:06 +0900 Subject: [PATCH 09/34] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=20=EB=A1=9C=EC=A7=81=20(=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D,=20=EC=8A=A4=ED=8A=B8=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=ED=81=AC=20=EC=97=AC=EB=B6=80,=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EB=B0=98=ED=99=98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/BaseballGame.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/java/model/BaseballGame.java b/src/main/java/model/BaseballGame.java index fea46100..9f7adb7f 100644 --- a/src/main/java/model/BaseballGame.java +++ b/src/main/java/model/BaseballGame.java @@ -1,12 +1,13 @@ package model; import view.InputView; +import view.OutputView; import java.util.*; public class BaseballGame { private final InputView inputView = new InputView(); - private final OutPutView outPutView = new OutputView(); + private final OutputView outputView = new OutputView(); private final Random random = new Random(); public void run() { @@ -27,7 +28,21 @@ private void playSingleGame() { List targetNum = generateComputerNumber(); while (true) { - String userInput = inputView.readGuess(); + try { + String raw = inputView.readGuess(); + UserGuess guess = UserGuess.from(raw); + + Result result = Judge.judge(targetNum, guess); + outputView.printHint(result); + + if (result.isTreeStrike()) { + outputView.printGameEndmessage(); + break; + } + } catch (InvalidInputException e) { + outputView.printError(e.getMessage()); + } + } } From d19893420f841d4374a3ea7c35289157063f9c28 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Fri, 30 Jan 2026 23:06:51 +0900 Subject: [PATCH 10/34] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=ED=81=B4=EB=9E=98=EC=8A=A4=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 --- build.gradle | 2 ++ src/main/java/model/UserGuess.java | 43 ++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 src/main/java/model/UserGuess.java diff --git a/build.gradle b/build.gradle index 20a92c9e..8418af5a 100644 --- a/build.gradle +++ b/build.gradle @@ -18,6 +18,8 @@ repositories { dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' testImplementation 'org.assertj:assertj-core:3.25.3' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' } test { diff --git a/src/main/java/model/UserGuess.java b/src/main/java/model/UserGuess.java new file mode 100644 index 00000000..e333aca2 --- /dev/null +++ b/src/main/java/model/UserGuess.java @@ -0,0 +1,43 @@ +package model; + +import lombok.AllArgsConstructor; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +@AllArgsConstructor +public class UserGuess { + private final List digits; + + public static UserGuess from(String input) { + if (input == null) { + throw new InvalidInputException("입력값이 비어있습니다."); + } + if (input.length() != 3) { + throw new InvalidInputException("3자리 숫자를 입력해야 합니다."); + } + + List digits = new ArrayList<>(3); + Set dupCheck = new HashSet<>(); + + for (int i = 0; i < 3; i++) { + char c = input.charAt(i); + if (!Character.isDigit(c)) { + throw new InvalidInputException("숫자만 입력해야 합니다."); + } + + int d = c - '0'; + if (d < 1 || d > 9) { + throw new InvalidInputException("각 자리는 1~9 사이여야 합니다."); + } + if (!dupCheck.add(d)) { + throw new InvalidInputException("중복되지 않는 숫자 3개여야 합니다."); + } + digits.add(d); + } + + return new UserGuess(digits); + } +} From 8f26e1838e81bc62e3f986eb8564cf9a55f1eb26 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Fri, 30 Jan 2026 23:08:07 +0900 Subject: [PATCH 11/34] =?UTF-8?q?feat:=20Result=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=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/Result.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/model/Result.java diff --git a/src/main/java/model/Result.java b/src/main/java/model/Result.java new file mode 100644 index 00000000..088e4593 --- /dev/null +++ b/src/main/java/model/Result.java @@ -0,0 +1,7 @@ +package model; + +public record Result(int strike, int ball) { + public boolean isThreeStrike() { + return strike == 3; + } +} \ No newline at end of file From 0983316fb68f529ad15e2e8c0b83186354fd9b67 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Fri, 30 Jan 2026 23:14:48 +0900 Subject: [PATCH 12/34] =?UTF-8?q?feat:=20Judge=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=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 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/java/model/Judge.java diff --git a/src/main/java/model/Judge.java b/src/main/java/model/Judge.java new file mode 100644 index 00000000..ae62eaa5 --- /dev/null +++ b/src/main/java/model/Judge.java @@ -0,0 +1,21 @@ +package model; + +public final class Judge { + private Judge() { } + + public static Result judge(ComputerNumber answer, UserGuess guess) { + int strike = 0; + int ball = 0; + + for (int i = 0; i < answer.size(); i++) { + int g = guess.digitAt(i); + + if (answer.digitAt(i) == g) { + strike++; + } else if (answer.contains(g)) { + ball++; + } + } + return new Result(strike, ball); + } +} \ No newline at end of file From 1389c2f93309f3e2f72bcfc46c5629a576c09b26 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Fri, 30 Jan 2026 23:19:19 +0900 Subject: [PATCH 13/34] =?UTF-8?q?feat:=20ComputerNumber=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EB=82=B4=20=EB=9E=9C=EB=8D=A4=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=20=EC=83=9D=EC=84=B1=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/BaseballGame.java | 2 +- src/main/java/model/ComputerNumber.java | 36 +++++++++++++++++++++++++ src/main/java/model/UserGuess.java | 4 +++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/main/java/model/ComputerNumber.java diff --git a/src/main/java/model/BaseballGame.java b/src/main/java/model/BaseballGame.java index 9f7adb7f..639e8f1a 100644 --- a/src/main/java/model/BaseballGame.java +++ b/src/main/java/model/BaseballGame.java @@ -25,7 +25,7 @@ public void run() { } private void playSingleGame() { - List targetNum = generateComputerNumber(); + ComputerNumber targetNum = ComputerNumber.createRandom(); while (true) { try { diff --git a/src/main/java/model/ComputerNumber.java b/src/main/java/model/ComputerNumber.java new file mode 100644 index 00000000..25f1a702 --- /dev/null +++ b/src/main/java/model/ComputerNumber.java @@ -0,0 +1,36 @@ +package model; + +import lombok.AllArgsConstructor; + +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Random; +import java.util.Set; + +@AllArgsConstructor +public final class ComputerNumber { + private static final Random RANDOM = new Random(); + private final List digits; + + public static ComputerNumber createRandom() { + Set set = new LinkedHashSet<>(); + while (set.size() < 3) { + int n = RANDOM.nextInt(9) + 1; // 1~9 + set.add(n); // 중복 자동 제거 + } + return new ComputerNumber(new ArrayList<>(set)); + } + + public int digitAt(int index) { + return digits.get(index); + } + + public boolean contains(int digit) { + return digits.contains(digit); + } + + public int size() { + return digits.size(); + } +} \ No newline at end of file diff --git a/src/main/java/model/UserGuess.java b/src/main/java/model/UserGuess.java index e333aca2..ba979d47 100644 --- a/src/main/java/model/UserGuess.java +++ b/src/main/java/model/UserGuess.java @@ -40,4 +40,8 @@ public static UserGuess from(String input) { return new UserGuess(digits); } + + public int digitAt(int index) { + return digits.get(index); + } } From f7ac0fc28e1b747ecb4b7fb9292e23a95162c749 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Fri, 30 Jan 2026 23:30:13 +0900 Subject: [PATCH 14/34] =?UTF-8?q?feat:=20exception=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=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/exception/InvalidInputException.java | 7 +++++++ src/main/java/model/BaseballGame.java | 1 + src/main/java/model/UserGuess.java | 1 + 3 files changed, 9 insertions(+) create mode 100644 src/main/java/exception/InvalidInputException.java diff --git a/src/main/java/exception/InvalidInputException.java b/src/main/java/exception/InvalidInputException.java new file mode 100644 index 00000000..70ced9b3 --- /dev/null +++ b/src/main/java/exception/InvalidInputException.java @@ -0,0 +1,7 @@ +package exception; + +public class InvalidInputException extends IllegalArgumentException { + public InvalidInputException(String message) { + super(message); + } +} diff --git a/src/main/java/model/BaseballGame.java b/src/main/java/model/BaseballGame.java index 639e8f1a..ba9354ae 100644 --- a/src/main/java/model/BaseballGame.java +++ b/src/main/java/model/BaseballGame.java @@ -1,5 +1,6 @@ package model; +import exception.InvalidInputException; import view.InputView; import view.OutputView; diff --git a/src/main/java/model/UserGuess.java b/src/main/java/model/UserGuess.java index ba979d47..182f54a9 100644 --- a/src/main/java/model/UserGuess.java +++ b/src/main/java/model/UserGuess.java @@ -1,5 +1,6 @@ package model; +import exception.InvalidInputException; import lombok.AllArgsConstructor; import java.util.ArrayList; From 1f4ce23bd3c98f752dc95dd3cb4237d345a3c1c1 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Fri, 30 Jan 2026 23:35:31 +0900 Subject: [PATCH 15/34] =?UTF-8?q?feat:=20=EC=9E=AC=EC=8B=9C=EC=9E=91=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/BaseballGame.java | 13 +++++++++++++ src/main/java/view/InputView.java | 5 +++++ 2 files changed, 18 insertions(+) diff --git a/src/main/java/model/BaseballGame.java b/src/main/java/model/BaseballGame.java index ba9354ae..3966d311 100644 --- a/src/main/java/model/BaseballGame.java +++ b/src/main/java/model/BaseballGame.java @@ -56,4 +56,17 @@ private List generateComputerNumber() { return new ArrayList<>(setNum); } + + private boolean askRestart() { + while (true) { + try { + String cmd = inputView.readRestartCommand(); + validateRestartCommand(cmd); + + return "1".equals(cmd); + } catch (InvalidInputException e) { + outputView.printError(e.getMessage()); + } + } + } } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 90238b20..a8a4858d 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -9,4 +9,9 @@ public String readGuess() { System.out.print("숫자를 입력해주세요: "); return scanner.nextLine(); } + + public String readRestartCommand() { + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + return scanner.nextLine(); + } } From 912d5402d0d508591eaeed40cd40fd82485e1984 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Fri, 30 Jan 2026 23:39:12 +0900 Subject: [PATCH 16/34] =?UTF-8?q?feat:=20=EC=9E=AC=EC=8B=9C=EC=9E=91=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EA=B0=92=20=EA=B2=80=EC=A6=9D=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/BaseballGame.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/model/BaseballGame.java b/src/main/java/model/BaseballGame.java index 3966d311..6b482b80 100644 --- a/src/main/java/model/BaseballGame.java +++ b/src/main/java/model/BaseballGame.java @@ -69,4 +69,10 @@ private boolean askRestart() { } } } + + private void validateRestartCommand(String cmd) { + if (!"1".equals(cmd) && !"2".equals(cmd)) { + throw new InvalidInputException("1 또는 2를 입력해야 합니다."); + } + } } From b491cf41a9362466920854de13c805bb01652424 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Fri, 30 Jan 2026 23:41:07 +0900 Subject: [PATCH 17/34] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=20=EC=A4=91=20output=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/BaseballGame.java | 2 ++ src/main/java/view/OutputView.java | 28 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/main/java/model/BaseballGame.java b/src/main/java/model/BaseballGame.java index 6b482b80..faa5fa54 100644 --- a/src/main/java/model/BaseballGame.java +++ b/src/main/java/model/BaseballGame.java @@ -28,6 +28,8 @@ public void run() { private void playSingleGame() { ComputerNumber targetNum = ComputerNumber.createRandom(); + outputView.printStartMessage(); + while (true) { try { String raw = inputView.readGuess(); diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index d8f9743c..0af1967e 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,4 +1,32 @@ package view; +import model.Result; + public class OutputView { + public void printStartMessage() { + System.out.println("숫자 야구 게임을 시작합니다."); + } + + public void printHint(Result result) { + int strike = result.strike(); + int ball = result.ball(); + + if (strike == 0 && ball == 0) { + System.out.println("낫싱"); + return; + } + + StringBuilder sb = new StringBuilder(); + if (ball > 0) sb.append(ball).append("볼 "); + if (strike > 0) sb.append(strike).append("스트라이크"); + System.out.println(sb.toString().trim()); + } + + public void printGameEndMessage() { + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + } + + public void printError(String message) { + System.out.println("[ERROR] " + message); + } } From e003a9e847f7d2fb019255392154a2da56756d92 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Fri, 30 Jan 2026 23:43:05 +0900 Subject: [PATCH 18/34] =?UTF-8?q?fix:=20=EB=81=9D=20=EB=A9=94=EC=8B=9C?= =?UTF-8?q?=EC=A7=80=20=EC=B6=9C=EB=A0=A5=20=EB=B0=8F=20Tree=20=EC=98=A4?= =?UTF-8?q?=ED=83=80=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/BaseballGame.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/model/BaseballGame.java b/src/main/java/model/BaseballGame.java index faa5fa54..cca31ff4 100644 --- a/src/main/java/model/BaseballGame.java +++ b/src/main/java/model/BaseballGame.java @@ -38,8 +38,8 @@ private void playSingleGame() { Result result = Judge.judge(targetNum, guess); outputView.printHint(result); - if (result.isTreeStrike()) { - outputView.printGameEndmessage(); + if (result.isThreeStrike()) { + outputView.printGameEndMessage(); break; } } catch (InvalidInputException e) { From 12fd3feda52a0e147d6a0e3b9330943f09614549 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Fri, 30 Jan 2026 23:47:53 +0900 Subject: [PATCH 19/34] =?UTF-8?q?feat:=20run=20=EB=A9=94=EC=86=8C=EB=93=9C?= =?UTF-8?q?,=20=EA=B2=8C=EC=9E=84=20=EC=8B=9C=EC=9E=91=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/Application.java | 8 +++-- .../{model => controller}/BaseballGame.java | 36 +++++++------------ 2 files changed, 19 insertions(+), 25 deletions(-) rename src/main/java/{model => controller}/BaseballGame.java (65%) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 9c97455f..528704de 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,7 +1,11 @@ +import controller.BaseballGame; +import view.InputView; +import view.OutputView; + public class Application { public static void main(String[] args) { - BaseballGame game = new BaseballGame(); - game.run(); + BaseballGame controller = new BaseballGame(new InputView(), new OutputView()); + controller.run(); } } \ No newline at end of file diff --git a/src/main/java/model/BaseballGame.java b/src/main/java/controller/BaseballGame.java similarity index 65% rename from src/main/java/model/BaseballGame.java rename to src/main/java/controller/BaseballGame.java index cca31ff4..0bc04473 100644 --- a/src/main/java/model/BaseballGame.java +++ b/src/main/java/controller/BaseballGame.java @@ -1,27 +1,27 @@ -package model; +package controller; import exception.InvalidInputException; +import lombok.RequiredArgsConstructor; +import model.ComputerNumber; +import model.Judge; +import model.Result; +import model.UserGuess; import view.InputView; import view.OutputView; import java.util.*; +@RequiredArgsConstructor public class BaseballGame { - private final InputView inputView = new InputView(); - private final OutputView outputView = new OutputView(); - private final Random random = new Random(); + private final InputView inputView; + private final OutputView outputView; public void run() { - boolean keepPlaying = true; - while (keepPlaying) { - // 게임 시작 + while (true) { playSingleGame(); - - /* 재시작 여부 결정 - yes 선택 시: askRestart는 true 반환 - no 선택 시: askRestart는 false 반환 - */ - keepPlaying = askRestart(); + if (!askRestart()) { + return; + } } } @@ -49,16 +49,6 @@ private void playSingleGame() { } } - private List generateComputerNumber() { - Set setNum = new LinkedHashSet<>(); - while (setNum.size() < 3) { - int n = random.nextInt(9) + 1; - setNum.add(n); - } - return new ArrayList<>(setNum); - } - - private boolean askRestart() { while (true) { try { From bcbd93785c8195a24d9191c898387f03700c2c86 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Fri, 30 Jan 2026 23:56:03 +0900 Subject: [PATCH 20/34] =?UTF-8?q?feat:=20lombok=20AllArgs=EC=97=90?= =?UTF-8?q?=EC=84=9C=20RequiredArgs=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/ComputerNumber.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/model/ComputerNumber.java b/src/main/java/model/ComputerNumber.java index 25f1a702..f658ccfb 100644 --- a/src/main/java/model/ComputerNumber.java +++ b/src/main/java/model/ComputerNumber.java @@ -1,6 +1,6 @@ package model; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import java.util.ArrayList; import java.util.LinkedHashSet; @@ -8,7 +8,7 @@ import java.util.Random; import java.util.Set; -@AllArgsConstructor +@RequiredArgsConstructor public final class ComputerNumber { private static final Random RANDOM = new Random(); private final List digits; From 0af19ce210952a3ede1e7fefb139c9ba03dab793 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Mon, 2 Feb 2026 18:43:29 +0900 Subject: [PATCH 21/34] =?UTF-8?q?chore:=20gradle=20=EB=82=B4=20lombok=20?= =?UTF-8?q?=EB=B2=84=EC=A0=80=EB=8B=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 8418af5a..c3026c4c 100644 --- a/build.gradle +++ b/build.gradle @@ -18,8 +18,8 @@ repositories { dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' testImplementation 'org.assertj:assertj-core:3.25.3' - compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' + compileOnly 'org.projectlombok:lombok:1.18.30' + annotationProcessor 'org.projectlombok:lombok:1.18.30' } test { From b0c7e54a9dfb208cc76d08b913ce9833f0147540 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Tue, 3 Feb 2026 10:13:47 +0900 Subject: [PATCH 22/34] =?UTF-8?q?fix:=20git=20new=20line=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=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/Application.java | 2 +- src/main/java/model/ComputerNumber.java | 2 +- src/main/java/model/Judge.java | 2 +- src/main/java/model/Result.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 528704de..19ed0af0 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -8,4 +8,4 @@ public static void main(String[] args) { BaseballGame controller = new BaseballGame(new InputView(), new OutputView()); controller.run(); } -} \ No newline at end of file +} diff --git a/src/main/java/model/ComputerNumber.java b/src/main/java/model/ComputerNumber.java index f658ccfb..620dfba9 100644 --- a/src/main/java/model/ComputerNumber.java +++ b/src/main/java/model/ComputerNumber.java @@ -33,4 +33,4 @@ public boolean contains(int digit) { public int size() { return digits.size(); } -} \ No newline at end of file +} diff --git a/src/main/java/model/Judge.java b/src/main/java/model/Judge.java index ae62eaa5..020be934 100644 --- a/src/main/java/model/Judge.java +++ b/src/main/java/model/Judge.java @@ -18,4 +18,4 @@ public static Result judge(ComputerNumber answer, UserGuess guess) { } return new Result(strike, ball); } -} \ No newline at end of file +} diff --git a/src/main/java/model/Result.java b/src/main/java/model/Result.java index 088e4593..d4185a6f 100644 --- a/src/main/java/model/Result.java +++ b/src/main/java/model/Result.java @@ -4,4 +4,4 @@ public record Result(int strike, int ball) { public boolean isThreeStrike() { return strike == 3; } -} \ No newline at end of file +} From aa6595766fae379b10a21551fc3754a860df75d5 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Fri, 6 Feb 2026 22:24:19 +0900 Subject: [PATCH 23/34] =?UTF-8?q?feat:=20ErrorCode,=20CommonErrorCode=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=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/exception/CommonErrorCode.java | 12 ++++++++++++ src/main/java/exception/ErrorCode.java | 6 ++++++ 2 files changed, 18 insertions(+) create mode 100644 src/main/java/exception/CommonErrorCode.java create mode 100644 src/main/java/exception/ErrorCode.java diff --git a/src/main/java/exception/CommonErrorCode.java b/src/main/java/exception/CommonErrorCode.java new file mode 100644 index 00000000..d95ede7e --- /dev/null +++ b/src/main/java/exception/CommonErrorCode.java @@ -0,0 +1,12 @@ +package exception; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +public enum CommonErrorCode implements ErrorCode { + + private final String code; + private final String message; +} diff --git a/src/main/java/exception/ErrorCode.java b/src/main/java/exception/ErrorCode.java new file mode 100644 index 00000000..840edf47 --- /dev/null +++ b/src/main/java/exception/ErrorCode.java @@ -0,0 +1,6 @@ +package exception; + +public interface ErrorCode { + String getCode(); + String getMessage(); +} From d79e6f8898b6628af555979eb831336fd9846538 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Fri, 6 Feb 2026 22:40:34 +0900 Subject: [PATCH 24/34] =?UTF-8?q?feat:=20Exception=20=ED=95=98=EB=93=9C?= =?UTF-8?q?=EC=BD=94=EB=94=A9=20=EC=A0=9C=EA=B1=B0=20/=20enum=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/BaseballGame.java | 3 ++- src/main/java/exception/CommonErrorCode.java | 7 +++++++ src/main/java/exception/InvalidInputException.java | 10 ++++++++-- src/main/java/model/UserGuess.java | 11 ++++++----- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/main/java/controller/BaseballGame.java b/src/main/java/controller/BaseballGame.java index 0bc04473..75a3b5c4 100644 --- a/src/main/java/controller/BaseballGame.java +++ b/src/main/java/controller/BaseballGame.java @@ -1,5 +1,6 @@ package controller; +import exception.CommonErrorCode; import exception.InvalidInputException; import lombok.RequiredArgsConstructor; import model.ComputerNumber; @@ -64,7 +65,7 @@ private boolean askRestart() { private void validateRestartCommand(String cmd) { if (!"1".equals(cmd) && !"2".equals(cmd)) { - throw new InvalidInputException("1 또는 2를 입력해야 합니다."); + throw new InvalidInputException(CommonErrorCode.INVALID_COMMAND); } } } diff --git a/src/main/java/exception/CommonErrorCode.java b/src/main/java/exception/CommonErrorCode.java index d95ede7e..ef143316 100644 --- a/src/main/java/exception/CommonErrorCode.java +++ b/src/main/java/exception/CommonErrorCode.java @@ -7,6 +7,13 @@ @Getter public enum CommonErrorCode implements ErrorCode { + EMPTY_INPUT("EMPTY_INPUT", "입력값이 비어있습니다."), + INVALID_LENGTH("INVALID_LENGTH", "3자리 숫자를 입력해야 합니다."), + NOT_A_NUMBER("NOT_A_NUMBER", "숫자만 입력해야 합니다."), + NUMBER_OUT_OF_RANGE("NUMBER_OUT_OF_RANGE", "각 자리는 1~9 사이여야 합니다."), + DUPLICATED_NUMBER("DUPLICATED_NUMBER", "중복되지 않는 숫자 3개여야 합니다."), + INVALID_COMMAND("INVALID_COMMAND", "1 또는 2를 입력해야 합니다."); + private final String code; private final String message; } diff --git a/src/main/java/exception/InvalidInputException.java b/src/main/java/exception/InvalidInputException.java index 70ced9b3..32b2733f 100644 --- a/src/main/java/exception/InvalidInputException.java +++ b/src/main/java/exception/InvalidInputException.java @@ -1,7 +1,13 @@ package exception; +import lombok.Getter; + +@Getter public class InvalidInputException extends IllegalArgumentException { - public InvalidInputException(String message) { - super(message); + private final CommonErrorCode commonErrorCode; + + public InvalidInputException(CommonErrorCode commonErrorCode) { + super(commonErrorCode.getMessage()); + this.commonErrorCode = commonErrorCode; } } diff --git a/src/main/java/model/UserGuess.java b/src/main/java/model/UserGuess.java index 182f54a9..31624022 100644 --- a/src/main/java/model/UserGuess.java +++ b/src/main/java/model/UserGuess.java @@ -1,5 +1,6 @@ package model; +import exception.CommonErrorCode; import exception.InvalidInputException; import lombok.AllArgsConstructor; @@ -14,10 +15,10 @@ public class UserGuess { public static UserGuess from(String input) { if (input == null) { - throw new InvalidInputException("입력값이 비어있습니다."); + throw new InvalidInputException(CommonErrorCode.EMPTY_INPUT); } if (input.length() != 3) { - throw new InvalidInputException("3자리 숫자를 입력해야 합니다."); + throw new InvalidInputException(CommonErrorCode.INVALID_LENGTH); } List digits = new ArrayList<>(3); @@ -26,15 +27,15 @@ public static UserGuess from(String input) { for (int i = 0; i < 3; i++) { char c = input.charAt(i); if (!Character.isDigit(c)) { - throw new InvalidInputException("숫자만 입력해야 합니다."); + throw new InvalidInputException(CommonErrorCode.NOT_A_NUMBER); } int d = c - '0'; if (d < 1 || d > 9) { - throw new InvalidInputException("각 자리는 1~9 사이여야 합니다."); + throw new InvalidInputException(CommonErrorCode.NUMBER_OUT_OF_RANGE); } if (!dupCheck.add(d)) { - throw new InvalidInputException("중복되지 않는 숫자 3개여야 합니다."); + throw new InvalidInputException(CommonErrorCode.DUPLICATED_NUMBER); } digits.add(d); } From ed0108a17aa1e16eaf40bef8147611e945ac820f Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Fri, 6 Feb 2026 23:13:54 +0900 Subject: [PATCH 25/34] =?UTF-8?q?refactor:=20UserGuess=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EB=82=B4=20=ED=95=98=EB=93=9C=EC=BD=94?= =?UTF-8?q?=EB=94=A9=20=EC=88=AB=EC=9E=90=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/UserGuess.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/model/UserGuess.java b/src/main/java/model/UserGuess.java index 31624022..04b2093f 100644 --- a/src/main/java/model/UserGuess.java +++ b/src/main/java/model/UserGuess.java @@ -13,25 +13,29 @@ public class UserGuess { private final List digits; + private static final int DIGIT_COUNT = 3; + private static final int MIN_NUMBER = 1; + private static final int MAX_NUMBER = 9; + public static UserGuess from(String input) { if (input == null) { throw new InvalidInputException(CommonErrorCode.EMPTY_INPUT); } - if (input.length() != 3) { + if (input.length() != DIGIT_COUNT) { throw new InvalidInputException(CommonErrorCode.INVALID_LENGTH); } - List digits = new ArrayList<>(3); + List digits = new ArrayList<>(DIGIT_COUNT); Set dupCheck = new HashSet<>(); - for (int i = 0; i < 3; i++) { + for (int i = 0; i < DIGIT_COUNT; i++) { char c = input.charAt(i); if (!Character.isDigit(c)) { throw new InvalidInputException(CommonErrorCode.NOT_A_NUMBER); } int d = c - '0'; - if (d < 1 || d > 9) { + if (d < MIN_NUMBER || d > MAX_NUMBER) { throw new InvalidInputException(CommonErrorCode.NUMBER_OUT_OF_RANGE); } if (!dupCheck.add(d)) { From cab89ad73eccde1e274a2a8ac066a52012b69728 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Fri, 6 Feb 2026 23:14:20 +0900 Subject: [PATCH 26/34] =?UTF-8?q?refactor:=20Result=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=82=B4=20=ED=95=98=EB=93=9C=EC=BD=94=EB=94=A9=20?= =?UTF-8?q?=EC=88=AB=EC=9E=90=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/Result.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/model/Result.java b/src/main/java/model/Result.java index d4185a6f..c86300a5 100644 --- a/src/main/java/model/Result.java +++ b/src/main/java/model/Result.java @@ -1,7 +1,9 @@ package model; public record Result(int strike, int ball) { + private static final int DIGIT_COUNT = 3; + public boolean isThreeStrike() { - return strike == 3; + return strike == DIGIT_COUNT; } } From 4a256af6dce28a6267ea0c10dc5e80243d14415d Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Sat, 7 Feb 2026 14:17:08 +0900 Subject: [PATCH 27/34] =?UTF-8?q?refactor:=20baseball=EB=A1=9C=20=ED=8F=B4?= =?UTF-8?q?=EB=8D=94=20=EB=B3=91=ED=95=A9=20/=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EA=B2=BD=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/.gitkeep | 0 src/main/java/Application.java | 6 +++--- .../controller/BaseballGame.java | 20 +++++++++---------- .../exception/CommonErrorCode.java | 2 +- .../{ => baseball}/exception/ErrorCode.java | 2 +- .../exception/InvalidInputException.java | 2 +- .../{ => baseball}/model/ComputerNumber.java | 2 +- src/main/java/{ => baseball}/model/Judge.java | 2 +- .../java/{ => baseball}/model/Result.java | 2 +- .../java/{ => baseball}/model/UserGuess.java | 6 +++--- .../java/{ => baseball}/view/InputView.java | 2 +- .../java/{ => baseball}/view/OutputView.java | 4 ++-- src/test/java/.gitkeep | 0 13 files changed, 24 insertions(+), 26 deletions(-) delete mode 100644 src/main/java/.gitkeep rename src/main/java/{ => baseball}/controller/BaseballGame.java (83%) rename src/main/java/{ => baseball}/exception/CommonErrorCode.java (96%) rename src/main/java/{ => baseball}/exception/ErrorCode.java (73%) rename src/main/java/{ => baseball}/exception/InvalidInputException.java (92%) rename src/main/java/{ => baseball}/model/ComputerNumber.java (97%) rename src/main/java/{ => baseball}/model/Judge.java (95%) rename src/main/java/{ => baseball}/model/Result.java (88%) rename src/main/java/{ => baseball}/model/UserGuess.java (92%) rename src/main/java/{ => baseball}/view/InputView.java (95%) rename src/main/java/{ => baseball}/view/OutputView.java (94%) delete mode 100644 src/test/java/.gitkeep diff --git a/src/main/java/.gitkeep b/src/main/java/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 19ed0af0..e883719f 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,6 +1,6 @@ -import controller.BaseballGame; -import view.InputView; -import view.OutputView; +import baseball.controller.BaseballGame; +import baseball.view.InputView; +import baseball.view.OutputView; public class Application { diff --git a/src/main/java/controller/BaseballGame.java b/src/main/java/baseball/controller/BaseballGame.java similarity index 83% rename from src/main/java/controller/BaseballGame.java rename to src/main/java/baseball/controller/BaseballGame.java index 75a3b5c4..a63b43ec 100644 --- a/src/main/java/controller/BaseballGame.java +++ b/src/main/java/baseball/controller/BaseballGame.java @@ -1,16 +1,14 @@ -package controller; +package baseball.controller; -import exception.CommonErrorCode; -import exception.InvalidInputException; +import baseball.exception.CommonErrorCode; +import baseball.exception.InvalidInputException; import lombok.RequiredArgsConstructor; -import model.ComputerNumber; -import model.Judge; -import model.Result; -import model.UserGuess; -import view.InputView; -import view.OutputView; - -import java.util.*; +import baseball.model.ComputerNumber; +import baseball.model.Judge; +import baseball.model.Result; +import baseball.model.UserGuess; +import baseball.view.InputView; +import baseball.view.OutputView; @RequiredArgsConstructor public class BaseballGame { diff --git a/src/main/java/exception/CommonErrorCode.java b/src/main/java/baseball/exception/CommonErrorCode.java similarity index 96% rename from src/main/java/exception/CommonErrorCode.java rename to src/main/java/baseball/exception/CommonErrorCode.java index ef143316..a1464d2b 100644 --- a/src/main/java/exception/CommonErrorCode.java +++ b/src/main/java/baseball/exception/CommonErrorCode.java @@ -1,4 +1,4 @@ -package exception; +package baseball.exception; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/exception/ErrorCode.java b/src/main/java/baseball/exception/ErrorCode.java similarity index 73% rename from src/main/java/exception/ErrorCode.java rename to src/main/java/baseball/exception/ErrorCode.java index 840edf47..ae2738c7 100644 --- a/src/main/java/exception/ErrorCode.java +++ b/src/main/java/baseball/exception/ErrorCode.java @@ -1,4 +1,4 @@ -package exception; +package baseball.exception; public interface ErrorCode { String getCode(); diff --git a/src/main/java/exception/InvalidInputException.java b/src/main/java/baseball/exception/InvalidInputException.java similarity index 92% rename from src/main/java/exception/InvalidInputException.java rename to src/main/java/baseball/exception/InvalidInputException.java index 32b2733f..5bf7f61c 100644 --- a/src/main/java/exception/InvalidInputException.java +++ b/src/main/java/baseball/exception/InvalidInputException.java @@ -1,4 +1,4 @@ -package exception; +package baseball.exception; import lombok.Getter; diff --git a/src/main/java/model/ComputerNumber.java b/src/main/java/baseball/model/ComputerNumber.java similarity index 97% rename from src/main/java/model/ComputerNumber.java rename to src/main/java/baseball/model/ComputerNumber.java index 620dfba9..1fb2278b 100644 --- a/src/main/java/model/ComputerNumber.java +++ b/src/main/java/baseball/model/ComputerNumber.java @@ -1,4 +1,4 @@ -package model; +package baseball.model; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/model/Judge.java b/src/main/java/baseball/model/Judge.java similarity index 95% rename from src/main/java/model/Judge.java rename to src/main/java/baseball/model/Judge.java index 020be934..a2fa3749 100644 --- a/src/main/java/model/Judge.java +++ b/src/main/java/baseball/model/Judge.java @@ -1,4 +1,4 @@ -package model; +package baseball.model; public final class Judge { private Judge() { } diff --git a/src/main/java/model/Result.java b/src/main/java/baseball/model/Result.java similarity index 88% rename from src/main/java/model/Result.java rename to src/main/java/baseball/model/Result.java index c86300a5..eb1dc971 100644 --- a/src/main/java/model/Result.java +++ b/src/main/java/baseball/model/Result.java @@ -1,4 +1,4 @@ -package model; +package baseball.model; public record Result(int strike, int ball) { private static final int DIGIT_COUNT = 3; diff --git a/src/main/java/model/UserGuess.java b/src/main/java/baseball/model/UserGuess.java similarity index 92% rename from src/main/java/model/UserGuess.java rename to src/main/java/baseball/model/UserGuess.java index 04b2093f..ef283ee4 100644 --- a/src/main/java/model/UserGuess.java +++ b/src/main/java/baseball/model/UserGuess.java @@ -1,7 +1,7 @@ -package model; +package baseball.model; -import exception.CommonErrorCode; -import exception.InvalidInputException; +import baseball.exception.CommonErrorCode; +import baseball.exception.InvalidInputException; import lombok.AllArgsConstructor; import java.util.ArrayList; diff --git a/src/main/java/view/InputView.java b/src/main/java/baseball/view/InputView.java similarity index 95% rename from src/main/java/view/InputView.java rename to src/main/java/baseball/view/InputView.java index a8a4858d..a3ee55ac 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -1,4 +1,4 @@ -package view; +package baseball.view; import java.util.Scanner; diff --git a/src/main/java/view/OutputView.java b/src/main/java/baseball/view/OutputView.java similarity index 94% rename from src/main/java/view/OutputView.java rename to src/main/java/baseball/view/OutputView.java index 0af1967e..1dfd4579 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.Result; +import baseball.model.Result; public class OutputView { public void printStartMessage() { diff --git a/src/test/java/.gitkeep b/src/test/java/.gitkeep deleted file mode 100644 index e69de29b..00000000 From 05beac4d7e857edcfca2d87a29b3a831b133d3ee Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Sat, 7 Feb 2026 14:25:05 +0900 Subject: [PATCH 28/34] =?UTF-8?q?feat:=20=EB=B3=80=EC=88=98=EB=A5=BC=20?= =?UTF-8?q?=EA=B3=A0=EC=A0=95=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=B4=20Con?= =?UTF-8?q?troller=20=EB=82=B4=20=EC=A0=95=EB=8B=B5=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=20=ED=95=A8=EC=88=98=EB=A5=BC=20=EC=A3=BC=EC=9E=85=ED=95=B4?= =?UTF-8?q?=EC=A3=BC=EB=8A=94=20=EC=BD=94=EB=93=9C=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/Application.java | 3 ++- src/main/java/baseball/controller/BaseballGame.java | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index e883719f..a77514f2 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,11 +1,12 @@ import baseball.controller.BaseballGame; +import baseball.model.ComputerNumber; import baseball.view.InputView; import baseball.view.OutputView; public class Application { public static void main(String[] args) { - BaseballGame controller = new BaseballGame(new InputView(), new OutputView()); + BaseballGame controller = new BaseballGame(new InputView(), new OutputView(), ComputerNumber::createRandom); controller.run(); } } diff --git a/src/main/java/baseball/controller/BaseballGame.java b/src/main/java/baseball/controller/BaseballGame.java index a63b43ec..b0bfa40a 100644 --- a/src/main/java/baseball/controller/BaseballGame.java +++ b/src/main/java/baseball/controller/BaseballGame.java @@ -10,10 +10,13 @@ import baseball.view.InputView; import baseball.view.OutputView; +import java.util.function.Supplier; + @RequiredArgsConstructor public class BaseballGame { private final InputView inputView; private final OutputView outputView; + private final Supplier computerNumberSupplier; public void run() { while (true) { @@ -25,7 +28,7 @@ public void run() { } private void playSingleGame() { - ComputerNumber targetNum = ComputerNumber.createRandom(); + ComputerNumber targetNum = computerNumberSupplier.get(); outputView.printStartMessage(); From f39657f702ff179f501f951d3229f1cb9824d2c2 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Sat, 7 Feb 2026 14:41:06 +0900 Subject: [PATCH 29/34] =?UTF-8?q?test:=20UserGuess=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/baseball/model/UserGuessTest.java | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 src/test/java/baseball/model/UserGuessTest.java diff --git a/src/test/java/baseball/model/UserGuessTest.java b/src/test/java/baseball/model/UserGuessTest.java new file mode 100644 index 00000000..f2098b67 --- /dev/null +++ b/src/test/java/baseball/model/UserGuessTest.java @@ -0,0 +1,77 @@ +package baseball.model; + +import baseball.exception.CommonErrorCode; +import baseball.exception.InvalidInputException; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class UserGuessTest { + + @DisplayName("정상적인 3자리 숫자 입력이면 UserGuess가 생성된다") + @Test + void from_validInput_createsUserGuess() { + UserGuess guess = UserGuess.from("135"); + + assertEquals(1, guess.digitAt(0)); + assertEquals(3, guess.digitAt(1)); + assertEquals(5, guess.digitAt(2)); + } + + @DisplayName("입력이 null이면 EMPTY_INPUT 예외가 발생한다") + @Test + void from_nullInput_throwsException() { + InvalidInputException e = assertThrows( + InvalidInputException.class, + () -> UserGuess.from(null) + ); + + assertEquals(CommonErrorCode.EMPTY_INPUT, e.getCommonErrorCode()); + } + + @DisplayName("입력 길이가 3이 아니면 INVALID_LENGTH 예외가 발생한다") + @Test + void from_invalidLength_throwsException() { + InvalidInputException e = assertThrows( + InvalidInputException.class, + () -> UserGuess.from("12") + ); + + assertEquals(CommonErrorCode.INVALID_LENGTH, e.getCommonErrorCode()); + } + + @DisplayName("숫자가 아닌 문자가 포함되면 NOT_A_NUMBER 예외가 발생한다") + @Test + void from_nonDigit_throwsException() { + InvalidInputException e = assertThrows( + InvalidInputException.class, + () -> UserGuess.from("1a3") + ); + + assertEquals(CommonErrorCode.NOT_A_NUMBER, e.getCommonErrorCode()); + } + + @DisplayName("숫자가 1~9 범위를 벗어나면 NUMBER_OUT_OF_RANGE 예외가 발생한다") + @Test + void from_outOfRange_throwsException() { + InvalidInputException e = assertThrows( + InvalidInputException.class, + () -> UserGuess.from("109") + ); + + assertEquals(CommonErrorCode.NUMBER_OUT_OF_RANGE, e.getCommonErrorCode()); + } + + @DisplayName("중복된 숫자가 있으면 DUPLICATED_NUMBER 예외가 발생한다") + @Test + void from_duplicatedDigits_throwsException() { + InvalidInputException e = assertThrows( + InvalidInputException.class, + () -> UserGuess.from("113") + ); + + assertEquals(CommonErrorCode.DUPLICATED_NUMBER, e.getCommonErrorCode()); + } +} From 745ec9504a54bfe6b919b0ad74555ddd8cbf6d50 Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Sat, 7 Feb 2026 14:43:42 +0900 Subject: [PATCH 30/34] =?UTF-8?q?test:=20ComputerNumberTest=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=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 --- .../baseball/model/ComputerNumberTest.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/test/java/baseball/model/ComputerNumberTest.java diff --git a/src/test/java/baseball/model/ComputerNumberTest.java b/src/test/java/baseball/model/ComputerNumberTest.java new file mode 100644 index 00000000..677214f6 --- /dev/null +++ b/src/test/java/baseball/model/ComputerNumberTest.java @@ -0,0 +1,55 @@ +package baseball.model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.HashSet; +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.*; + +@DisplayName("ComputerNumber 생성 테스트") +class ComputerNumberTest { + + @DisplayName("컴퓨터 숫자는 항상 3자리로 생성된다") + @Test + void createRandom_createsThreeDigits() { + ComputerNumber number = ComputerNumber.createRandom(); + + assertEquals(3, number.size()); + } + + @DisplayName("컴퓨터 숫자는 1~9 범위의 숫자로만 구성된다") + @Test + void createRandom_digitsAreBetweenOneAndNine() { + ComputerNumber number = ComputerNumber.createRandom(); + + for (int i = 0; i < number.size(); i++) { + int digit = number.digitAt(i); + assertTrue(digit >= 1 && digit <= 9); + } + } + + @DisplayName("컴퓨터 숫자는 중복되지 않는다") + @Test + void createRandom_digitsAreUnique() { + ComputerNumber number = ComputerNumber.createRandom(); + + Set unique = new HashSet<>(); + for (int i = 0; i < number.size(); i++) { + unique.add(number.digitAt(i)); + } + + assertEquals(3, unique.size()); + } + + @DisplayName("contains는 포함된 숫자에 대해 true를 반환한다") + @Test + void contains_returnsTrueForExistingDigit() { + ComputerNumber number = ComputerNumber.createRandom(); + + int digit = number.digitAt(0); + + assertTrue(number.contains(digit)); + } +} From 95ca8106d6c8a6abcd5aa44235a7f8a1ef1cf02c Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Sat, 7 Feb 2026 14:46:05 +0900 Subject: [PATCH 31/34] =?UTF-8?q?feat:=20ComputerNumber=EC=97=90=20JudgeTe?= =?UTF-8?q?st=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=EC=9D=84=20=EC=9C=84=ED=95=9C=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EC=9A=A9=20=EC=83=9D=EC=84=B1=EC=9E=90=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 --- src/main/java/baseball/model/ComputerNumber.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/baseball/model/ComputerNumber.java b/src/main/java/baseball/model/ComputerNumber.java index 1fb2278b..48089a25 100644 --- a/src/main/java/baseball/model/ComputerNumber.java +++ b/src/main/java/baseball/model/ComputerNumber.java @@ -33,4 +33,8 @@ public boolean contains(int digit) { public int size() { return digits.size(); } + + public static ComputerNumber of(List digits) { + return new ComputerNumber(digits); + } } From 8b21baade5bc77bf032ad4f99e182ce5d372dc3a Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Sat, 7 Feb 2026 14:46:40 +0900 Subject: [PATCH 32/34] =?UTF-8?q?test:=20JudgeTest=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/baseball/model/JudgeTest.java | 73 +++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/test/java/baseball/model/JudgeTest.java diff --git a/src/test/java/baseball/model/JudgeTest.java b/src/test/java/baseball/model/JudgeTest.java new file mode 100644 index 00000000..db30eb1b --- /dev/null +++ b/src/test/java/baseball/model/JudgeTest.java @@ -0,0 +1,73 @@ +package baseball.model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@DisplayName("Judge 스트라이크/볼 판정 테스트") +class JudgeTest { + + @DisplayName("모든 숫자와 자리가 같으면 3스트라이크이다") + @Test + void judge_allMatch_returnsThreeStrike() { + ComputerNumber answer = ComputerNumber.of(List.of(1, 3, 7)); + UserGuess guess = UserGuess.from("137"); + + Result result = Judge.judge(answer, guess); + + assertEquals(3, result.strike()); + assertEquals(0, result.ball()); + assertTrue(result.isThreeStrike()); + } + + @DisplayName("숫자는 같지만 자리가 다르면 볼로 판정한다") + @Test + void judge_sameDigitsDifferentPosition_returnsBalls() { + ComputerNumber answer = ComputerNumber.of(List.of(1, 3, 7)); + UserGuess guess = UserGuess.from("731"); + + Result result = Judge.judge(answer, guess); + + assertEquals(0, result.strike()); + assertEquals(3, result.ball()); + } + + @DisplayName("스트라이크와 볼이 함께 존재할 수 있다") + @Test + void judge_strikeAndBallMixed() { + ComputerNumber answer = ComputerNumber.of(List.of(1, 3, 7)); + UserGuess guess = UserGuess.from("173"); + + Result result = Judge.judge(answer, guess); + + assertEquals(1, result.strike()); // 1 + assertEquals(2, result.ball()); // 7, 3 + } + + @DisplayName("공통 숫자가 없으면 스트라이크와 볼은 0이다") + @Test + void judge_noMatchingDigits_returnsNothing() { + ComputerNumber answer = ComputerNumber.of(List.of(1, 3, 7)); + UserGuess guess = UserGuess.from("258"); + + Result result = Judge.judge(answer, guess); + + assertEquals(0, result.strike()); + assertEquals(0, result.ball()); + } + + @DisplayName("일부만 같은 경우 스트라이크만 판정될 수 있다") + @Test + void judge_onlyStrike() { + ComputerNumber answer = ComputerNumber.of(List.of(1, 3, 7)); + UserGuess guess = UserGuess.from("128"); + + Result result = Judge.judge(answer, guess); + + assertEquals(1, result.strike()); // 1 + assertEquals(0, result.ball()); + } +} From 7eebd767199d6a9e51412f897fc5c506f828d95c Mon Sep 17 00:00:00 2001 From: kakao-daniel-hoon Date: Sat, 7 Feb 2026 14:47:40 +0900 Subject: [PATCH 33/34] =?UTF-8?q?test:=20ResultTest=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/baseball/model/ResultTest.java | 26 ++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/test/java/baseball/model/ResultTest.java diff --git a/src/test/java/baseball/model/ResultTest.java b/src/test/java/baseball/model/ResultTest.java new file mode 100644 index 00000000..4002f625 --- /dev/null +++ b/src/test/java/baseball/model/ResultTest.java @@ -0,0 +1,26 @@ +package baseball.model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +@DisplayName("Result 결과 상태 테스트") +class ResultTest { + + @DisplayName("스트라이크가 3이면 isThreeStrike는 true를 반환한다") + @Test + void isThreeStrike_whenStrikeIsThree_returnsTrue() { + Result result = new Result(3, 0); + + assertTrue(result.isThreeStrike()); + } + + @DisplayName("스트라이크가 3이 아니면 isThreeStrike는 false를 반환한다") + @Test + void isThreeStrike_whenStrikeIsNotThree_returnsFalse() { + Result result = new Result(2, 1); + + assertFalse(result.isThreeStrike()); + } +} From 52378d32bec53d1d4e3ffaea48a9df4bdda3cd8e Mon Sep 17 00:00:00 2001 From: kdaehun00 Date: Sat, 7 Feb 2026 15:44:03 +0900 Subject: [PATCH 34/34] =?UTF-8?q?docs:=20README=20=EB=82=B4=20UML=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ea77745a..45018dbb 100644 --- a/README.md +++ b/README.md @@ -41,4 +41,7 @@ - 2 입력 시 프로그램을 완전히 종료한다. - 재시작/종료 입력값이 잘못된 경우에도 예외 처리한다. - [ERROR]로 시작하는 메시지를 출력한다. -- 다시 입력을 받는다. \ No newline at end of file +- 다시 입력을 받는다. + +## UML +Image