From aa0d27f7fe46cd21c442e539ccaeadc1c8faef95 Mon Sep 17 00:00:00 2001 From: songhansol Date: Mon, 2 Feb 2026 16:00:29 +0900 Subject: [PATCH 1/7] =?UTF-8?q?2026/02/02=2016:00=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Application.java | 7 +++++++ src/main/java/InputHandler.java | 2 ++ src/main/java/OutputView.java | 4 ++++ src/main/java/computer/Computer.java | 2 ++ 4 files changed, 15 insertions(+) create mode 100644 src/main/java/Application.java create mode 100644 src/main/java/InputHandler.java create mode 100644 src/main/java/OutputView.java create mode 100644 src/main/java/computer/Computer.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 000000000..75119550a --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,7 @@ +public class Main { + public static void main(String[] args) { + // 숫자 야구 게임 + + + }; +}; diff --git a/src/main/java/InputHandler.java b/src/main/java/InputHandler.java new file mode 100644 index 000000000..e66dc5a73 --- /dev/null +++ b/src/main/java/InputHandler.java @@ -0,0 +1,2 @@ +public class InputView { +} diff --git a/src/main/java/OutputView.java b/src/main/java/OutputView.java new file mode 100644 index 000000000..d8f9743cc --- /dev/null +++ b/src/main/java/OutputView.java @@ -0,0 +1,4 @@ +package view; + +public class OutputView { +} diff --git a/src/main/java/computer/Computer.java b/src/main/java/computer/Computer.java new file mode 100644 index 000000000..2d6a943cf --- /dev/null +++ b/src/main/java/computer/Computer.java @@ -0,0 +1,2 @@ +public class Computer { +} From 2c1c6410f2f956b4027f06e03dbad8aa2842a01d Mon Sep 17 00:00:00 2001 From: songhansol Date: Mon, 2 Feb 2026 16:00:33 +0900 Subject: [PATCH 2/7] =?UTF-8?q?2026/02/02=2016:00=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 - src/main/java/Application.java | 13 +++--- src/main/java/InputHandler.java | 2 - src/main/java/OutputView.java | 4 -- src/main/java/computer/Computer.java | 42 +++++++++++++++++++ .../java/gameController/GameController.java | 42 +++++++++++++++++++ src/main/java/handler/InputHandler.java | 41 ++++++++++++++++++ src/main/java/view/OutputView.java | 29 +++++++++++++ 8 files changed, 161 insertions(+), 13 deletions(-) delete mode 100644 src/main/java/InputHandler.java delete mode 100644 src/main/java/OutputView.java create mode 100644 src/main/java/gameController/GameController.java create mode 100644 src/main/java/handler/InputHandler.java create mode 100644 src/main/java/view/OutputView.java diff --git a/build.gradle b/build.gradle index 8172fb73f..bd111ae07 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,6 @@ dependencies { testImplementation "org.junit.jupiter:junit-jupiter:5.7.2" testImplementation "org.assertj:assertj-core:3.19.0" } - test { useJUnitPlatform() } diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 75119550a..875c3f01f 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,7 +1,8 @@ -public class Main { - public static void main(String[] args) { - // 숫자 야구 게임 - +import gameController.GameController; - }; -}; +public class Application { + public static void main(String[] args) { + GameController gameController = new GameController(); + gameController.start(); + } +} diff --git a/src/main/java/InputHandler.java b/src/main/java/InputHandler.java deleted file mode 100644 index e66dc5a73..000000000 --- a/src/main/java/InputHandler.java +++ /dev/null @@ -1,2 +0,0 @@ -public class InputView { -} diff --git a/src/main/java/OutputView.java b/src/main/java/OutputView.java deleted file mode 100644 index d8f9743cc..000000000 --- a/src/main/java/OutputView.java +++ /dev/null @@ -1,4 +0,0 @@ -package view; - -public class OutputView { -} diff --git a/src/main/java/computer/Computer.java b/src/main/java/computer/Computer.java index 2d6a943cf..9b1112b46 100644 --- a/src/main/java/computer/Computer.java +++ b/src/main/java/computer/Computer.java @@ -1,2 +1,44 @@ +package computer; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + public class Computer { + private List numbers; + private final Random random; + + public Computer() { + this.numbers = new ArrayList<>(); + this.random = new Random(); + } + + public void generateNumbers() { + for (int i = 0; i < 3; i++) { + int num = random.nextInt(9) + 1; // 1-9 + if (!numbers.contains(num)) { + numbers.add(num); + } + } + } + + public int[] compare(String userInput) { + int strike = 0; + int ball = 0; + + for (int i = 0; i < 3; i++) { + int userNum = userInput.charAt(i) - '0'; + if (userNum == numbers.get(i)) { + strike++; + } else if (numbers.contains(userNum)) { + ball++; + } + } + return new int[]{strike, ball}; + } + + // 테스트 + public List getNumbers() { + return numbers; + } } diff --git a/src/main/java/gameController/GameController.java b/src/main/java/gameController/GameController.java new file mode 100644 index 000000000..3a7cc36bd --- /dev/null +++ b/src/main/java/gameController/GameController.java @@ -0,0 +1,42 @@ +package gameController; + +import computer.Computer; +import handler.InputHandler; +import view.OutputView; + +public class GameController { + private final Computer computer; + private final InputHandler inputHandler; + private final OutputView outputView; + private int failCount; + + public GameController() { + this.computer = new Computer(); + this.inputHandler = new InputHandler(); + this.outputView = new OutputView(); + this.failCount = 0; + } + + public void start() { + computer.generateNumbers(); + outputView.printGameStart(); + + while (true) { + String userInput = inputHandler.getUserInput(); + int[] result = computer.compare(userInput); + + int strike = result[0]; + int ball = result[1]; + + if (strike == 3) { + outputView.printWin(); + break; + } + + failCount++; + outputView.printResult(strike, ball, failCount); + } + + inputHandler.close(); + } +} diff --git a/src/main/java/handler/InputHandler.java b/src/main/java/handler/InputHandler.java new file mode 100644 index 000000000..352646a75 --- /dev/null +++ b/src/main/java/handler/InputHandler.java @@ -0,0 +1,41 @@ +package handler; + +import java.util.Scanner; + +public class InputHandler { + private final Scanner scanner; + + public InputHandler() { + this.scanner = new Scanner(System.in); + } + + public String getUserInput() { + System.out.print("숫자를 입력하세요: "); + String input = scanner.nextLine(); + validate(input); + return input; + } + + private void validate(String input) { + // 자릿수 체크 + if (input.length() != 3) { + throw new IllegalArgumentException("3자리 숫자를 입력하세요."); + } + // 1-9 숫자 확인 + for (int i = 0; i < 3; i++) { + char c = input.charAt(i); + if (c < '1' || c > '9') { + throw new IllegalArgumentException("1-9 사이 숫자만 입력하세요."); + } + } + // 중복 체크 + if (input.chars().distinct().count() != 3) { + throw new IllegalArgumentException("중복된 숫자는 입력할 수 없습니다."); + } + + } + + public void close() { + scanner.close(); + } +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 000000000..cfc3bec2d --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,29 @@ +package view; + +public class OutputView { + + public void printGameStart() { + System.out.println("숫자 야구 게임을 시작"); + } + + public void printResult(int strike, int ball, int failCount) { + StringBuilder text = new StringBuilder(); + + if (strike > 0) { + text.append(strike).append("스트라이크 "); + } + if (ball > 0) { + text.append(ball).append("볼 "); + } + if (strike == 0 && ball == 0) { + text.append("실패 "); + } + + text.append("(").append(failCount).append("번 실패)"); + System.out.println(text.toString()); + } + + public void printWin() { + System.out.println("정답!"); + } +} From e0ea7d5440137c9cfbf05a0a285ed2dd66c7c412 Mon Sep 17 00:00:00 2001 From: songhansol Date: Mon, 2 Feb 2026 17:31:27 +0900 Subject: [PATCH 3/7] =?UTF-8?q?2026/02/02=2017:31=20=EC=99=84=EC=84=B1=3F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/computer/Computer.java | 6 ++-- .../java/gameController/GameController.java | 29 ++++++++++--------- src/main/java/handler/InputHandler.java | 2 +- src/main/java/view/OutputView.java | 4 +-- 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/src/main/java/computer/Computer.java b/src/main/java/computer/Computer.java index 9b1112b46..98b93a6ce 100644 --- a/src/main/java/computer/Computer.java +++ b/src/main/java/computer/Computer.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Random; + public class Computer { private List numbers; private final Random random; @@ -14,7 +15,8 @@ public Computer() { } public void generateNumbers() { - for (int i = 0; i < 3; i++) { + numbers.clear(); // 게임 재시작 시 필요 + while (numbers.size() < 3) { int num = random.nextInt(9) + 1; // 1-9 if (!numbers.contains(num)) { numbers.add(num); @@ -27,7 +29,7 @@ public int[] compare(String userInput) { int ball = 0; for (int i = 0; i < 3; i++) { - int userNum = userInput.charAt(i) - '0'; + int userNum = Character.getNumericValue(userInput.charAt(i)); if (userNum == numbers.get(i)) { strike++; } else if (numbers.contains(userNum)) { diff --git a/src/main/java/gameController/GameController.java b/src/main/java/gameController/GameController.java index 3a7cc36bd..47dce59cb 100644 --- a/src/main/java/gameController/GameController.java +++ b/src/main/java/gameController/GameController.java @@ -20,23 +20,26 @@ public GameController() { public void start() { computer.generateNumbers(); outputView.printGameStart(); + try { + while (true) { + String userInput = inputHandler.getUserInput(); + int[] result = computer.compare(userInput); - while (true) { - String userInput = inputHandler.getUserInput(); - int[] result = computer.compare(userInput); + int strike = result[0]; + int ball = result[1]; - int strike = result[0]; - int ball = result[1]; + if (strike == 3) { + outputView.printWin(); + break; + } - if (strike == 3) { - outputView.printWin(); - break; + failCount++; + outputView.printResult(strike, ball, failCount); } - - failCount++; - outputView.printResult(strike, ball, failCount); + inputHandler.close(); + } catch (IllegalArgumentException error) { + System.out.println(error.getMessage()); + System.exit(0); } - - inputHandler.close(); } } diff --git a/src/main/java/handler/InputHandler.java b/src/main/java/handler/InputHandler.java index 352646a75..86383b905 100644 --- a/src/main/java/handler/InputHandler.java +++ b/src/main/java/handler/InputHandler.java @@ -4,7 +4,6 @@ public class InputHandler { private final Scanner scanner; - public InputHandler() { this.scanner = new Scanner(System.in); } @@ -35,6 +34,7 @@ private void validate(String input) { } + // 재시작 로직이 public void close() { scanner.close(); } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index cfc3bec2d..8ea35322a 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -3,7 +3,7 @@ public class OutputView { public void printGameStart() { - System.out.println("숫자 야구 게임을 시작"); + System.out.println("숫자 야구 게임 시작"); } public void printResult(int strike, int ball, int failCount) { @@ -16,7 +16,7 @@ public void printResult(int strike, int ball, int failCount) { text.append(ball).append("볼 "); } if (strike == 0 && ball == 0) { - text.append("실패 "); + text.append("일치값 없음 "); } text.append("(").append(failCount).append("번 실패)"); From 922b834ae13f660a564aedefca1029f437c1b1ec Mon Sep 17 00:00:00 2001 From: songhansol Date: Mon, 2 Feb 2026 18:31:03 +0900 Subject: [PATCH 4/7] =?UTF-8?q?2026/02/02=2018:30=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=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/computer/Computer.java | 46 ---------------- .../generator/RandomNumberGenerator.java | 24 +++++++++ .../java/domain/model/BaseBallNumbers.java | 53 +++++++++++++++++++ src/main/java/domain/model/GameResult.java | 27 ++++++++++ src/main/java/domain/service/Referee.java | 22 ++++++++ .../java/gameController/GameController.java | 26 +++++---- 6 files changed, 141 insertions(+), 57 deletions(-) delete mode 100644 src/main/java/computer/Computer.java create mode 100644 src/main/java/domain/generator/RandomNumberGenerator.java create mode 100644 src/main/java/domain/model/BaseBallNumbers.java create mode 100644 src/main/java/domain/model/GameResult.java create mode 100644 src/main/java/domain/service/Referee.java diff --git a/src/main/java/computer/Computer.java b/src/main/java/computer/Computer.java deleted file mode 100644 index 98b93a6ce..000000000 --- a/src/main/java/computer/Computer.java +++ /dev/null @@ -1,46 +0,0 @@ -package computer; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - - -public class Computer { - private List numbers; - private final Random random; - - public Computer() { - this.numbers = new ArrayList<>(); - this.random = new Random(); - } - - public void generateNumbers() { - numbers.clear(); // 게임 재시작 시 필요 - while (numbers.size() < 3) { - int num = random.nextInt(9) + 1; // 1-9 - if (!numbers.contains(num)) { - numbers.add(num); - } - } - } - - public int[] compare(String userInput) { - int strike = 0; - int ball = 0; - - for (int i = 0; i < 3; i++) { - int userNum = Character.getNumericValue(userInput.charAt(i)); - if (userNum == numbers.get(i)) { - strike++; - } else if (numbers.contains(userNum)) { - ball++; - } - } - return new int[]{strike, ball}; - } - - // 테스트 - public List getNumbers() { - return numbers; - } -} diff --git a/src/main/java/domain/generator/RandomNumberGenerator.java b/src/main/java/domain/generator/RandomNumberGenerator.java new file mode 100644 index 000000000..0e3f0aaa8 --- /dev/null +++ b/src/main/java/domain/generator/RandomNumberGenerator.java @@ -0,0 +1,24 @@ +package domain.generator; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class RandomNumberGenerator { + private final Random random; + + public RandomNumberGenerator() { + this.random = new Random(); + } + + public List problemNumbersGenerate() { + List numbers = new ArrayList<>(); + while (numbers.size() < 3) { + int num = random.nextInt(9) + 1; + if (!numbers.contains(num)) { + numbers.add(num); + } + } + return numbers; + } +} diff --git a/src/main/java/domain/model/BaseBallNumbers.java b/src/main/java/domain/model/BaseBallNumbers.java new file mode 100644 index 000000000..9235a51c1 --- /dev/null +++ b/src/main/java/domain/model/BaseBallNumbers.java @@ -0,0 +1,53 @@ +package domain.model; + +import java.util.ArrayList; +import java.util.List; + +public class BaseBallNumbers { + private final List numbers; + + public BaseBallNumbers(List numbers) { + validate(numbers); + this.numbers = numbers; + } + + private void validate(List numbers) { + if (numbers.size() != 3) { + throw new IllegalArgumentException("숫자는 3개여야 합니다."); + } + if (numbers.stream().distinct().count() != 3) { + throw new IllegalArgumentException("중복된 숫자가 있습니다."); + } + for (int num : numbers) { + if (num < 1 || num > 9) { + throw new IllegalArgumentException("숫자는 1-9 사이여야 합니다."); + } + } + } + + public int get(int index) { + return numbers.get(index); + } + + public boolean contains(int num) { + return numbers.contains(num); + } + + public int size() { + return numbers.size(); + } + + public static BaseBallNumbers parseIntegerList(String input) { + List numbers = new ArrayList<>(); + for (char c : input.toCharArray()) { + numbers.add(Character.getNumericValue(c)); + } + return new BaseBallNumbers(numbers); + } + + // 값 확인용 + @Override + public String toString() { + return numbers.toString(); + } +} diff --git a/src/main/java/domain/model/GameResult.java b/src/main/java/domain/model/GameResult.java new file mode 100644 index 000000000..6398422c1 --- /dev/null +++ b/src/main/java/domain/model/GameResult.java @@ -0,0 +1,27 @@ +package domain.model; + +public class GameResult { + private final int strike; + private final int ball; + + public GameResult(int strike, int ball) { + this.strike = strike; + this.ball = ball; + } + + public boolean isWin() { + return strike == 3; + } + + public boolean isNothing() { + return strike == 0 && ball == 0; + } + + public int getStrike() { + return strike; + } + + public int getBall() { + return ball; + } +} diff --git a/src/main/java/domain/service/Referee.java b/src/main/java/domain/service/Referee.java new file mode 100644 index 000000000..19d20f4ef --- /dev/null +++ b/src/main/java/domain/service/Referee.java @@ -0,0 +1,22 @@ +package domain.service; + +import domain.model.BaseBallNumbers; +import domain.model.GameResult; + +public class Referee { + + public GameResult decides(BaseBallNumbers problemNumbers, BaseBallNumbers inputNumber) { + int strike = 0; + int ball = 0; + + for (int i = 0; i < problemNumbers.size(); i++) { + int guessNum = inputNumber.get(i); + if (guessNum == problemNumbers.get(i)) { + strike++; + } else if (problemNumbers.contains(guessNum)) { + ball++; + } + } + return new GameResult(strike, ball); + } +} diff --git a/src/main/java/gameController/GameController.java b/src/main/java/gameController/GameController.java index 47dce59cb..e8d434a5d 100644 --- a/src/main/java/gameController/GameController.java +++ b/src/main/java/gameController/GameController.java @@ -1,40 +1,44 @@ package gameController; -import computer.Computer; +import domain.model.BaseBallNumbers; +import domain.model.GameResult; +import domain.service.Referee; +import domain.generator.RandomNumberGenerator; import handler.InputHandler; import view.OutputView; + public class GameController { - private final Computer computer; private final InputHandler inputHandler; private final OutputView outputView; + private final Referee referee; private int failCount; public GameController() { - this.computer = new Computer(); this.inputHandler = new InputHandler(); this.outputView = new OutputView(); + this.referee = new Referee(); this.failCount = 0; } public void start() { - computer.generateNumbers(); + RandomNumberGenerator numberGenerator = new RandomNumberGenerator(); + BaseBallNumbers problemNumbers = new BaseBallNumbers(numberGenerator.problemNumbersGenerate()); + outputView.printGameStart(); try { while (true) { - String userInput = inputHandler.getUserInput(); - int[] result = computer.compare(userInput); - int strike = result[0]; - int ball = result[1]; + String userInput = inputHandler.getUserInput(); + BaseBallNumbers userNumbers = BaseBallNumbers.parseIntegerList(userInput); - if (strike == 3) { + GameResult gameResult = referee.decides(problemNumbers, userNumbers); + if (gameResult.isWin()) { outputView.printWin(); break; } - failCount++; - outputView.printResult(strike, ball, failCount); + outputView.printResult(gameResult.getStrike(), gameResult.getBall(), failCount); } inputHandler.close(); } catch (IllegalArgumentException error) { From 6264c5b86f1ba2b741c4f1327ac6e89caa0e5013 Mon Sep 17 00:00:00 2001 From: songhansol Date: Fri, 6 Feb 2026 16:22:27 +0900 Subject: [PATCH 5/7] =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B0=80?= =?UTF-8?q?=EB=8A=A5=ED=95=98=EA=B2=8C=20NumberGenerator=EC=B6=94=EC=83=81?= =?UTF-8?q?=ED=99=94=20+=20=EB=AA=A8=EB=8D=B8=EC=97=90=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=EC=97=90=20=EC=82=AC=EC=9A=A9=ED=95=A0=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=20=EA=B0=AF=EC=88=98=20=EC=83=81=EC=88=98=20=EC=84=A0?= =?UTF-8?q?=EC=96=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../generator/BaseBallNumbersGenerator.java | 25 ++++++++++++ .../domain/generator/NumberGenerator.java | 5 +++ .../generator/RandomNumberGenerator.java | 24 ------------ .../generator/RandomNumbersGenerator.java | 12 ++++++ .../java/domain/model/BaseBallNumbers.java | 26 +++++++------ src/main/java/domain/model/GameResult.java | 2 +- .../java/gameController/GameController.java | 10 ++--- src/main/java/view/OutputView.java | 1 - .../BaseBallNumbersGeneratorTest.java | 39 +++++++++++++++++++ .../domain/generator/TestNumberGenerator.java | 15 +++++++ 10 files changed, 115 insertions(+), 44 deletions(-) create mode 100644 src/main/java/domain/generator/BaseBallNumbersGenerator.java create mode 100644 src/main/java/domain/generator/NumberGenerator.java delete mode 100644 src/main/java/domain/generator/RandomNumberGenerator.java create mode 100644 src/main/java/domain/generator/RandomNumbersGenerator.java create mode 100644 src/test/java/domain/generator/BaseBallNumbersGeneratorTest.java create mode 100644 src/test/java/domain/generator/TestNumberGenerator.java diff --git a/src/main/java/domain/generator/BaseBallNumbersGenerator.java b/src/main/java/domain/generator/BaseBallNumbersGenerator.java new file mode 100644 index 000000000..745dbaa1c --- /dev/null +++ b/src/main/java/domain/generator/BaseBallNumbersGenerator.java @@ -0,0 +1,25 @@ +package domain.generator; + +import domain.model.BaseBallNumbers; + +import java.util.ArrayList; +import java.util.List; + +public class BaseBallNumbersGenerator { + private final NumberGenerator numberGenerator; + + public BaseBallNumbersGenerator(NumberGenerator numberGenerator) { + this.numberGenerator = numberGenerator; + } + + public List generate() { + List numbers = new ArrayList<>(); + while (numbers.size() < BaseBallNumbers.NumberSize) { + int num = numberGenerator.generate(); + if (!numbers.contains(num)) { + numbers.add(num); + } + } + return numbers; + } +} diff --git a/src/main/java/domain/generator/NumberGenerator.java b/src/main/java/domain/generator/NumberGenerator.java new file mode 100644 index 000000000..c9af3a2db --- /dev/null +++ b/src/main/java/domain/generator/NumberGenerator.java @@ -0,0 +1,5 @@ +package domain.generator; + +public interface NumberGenerator { + int generate(); +} \ No newline at end of file diff --git a/src/main/java/domain/generator/RandomNumberGenerator.java b/src/main/java/domain/generator/RandomNumberGenerator.java deleted file mode 100644 index 0e3f0aaa8..000000000 --- a/src/main/java/domain/generator/RandomNumberGenerator.java +++ /dev/null @@ -1,24 +0,0 @@ -package domain.generator; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -public class RandomNumberGenerator { - private final Random random; - - public RandomNumberGenerator() { - this.random = new Random(); - } - - public List problemNumbersGenerate() { - List numbers = new ArrayList<>(); - while (numbers.size() < 3) { - int num = random.nextInt(9) + 1; - if (!numbers.contains(num)) { - numbers.add(num); - } - } - return numbers; - } -} diff --git a/src/main/java/domain/generator/RandomNumbersGenerator.java b/src/main/java/domain/generator/RandomNumbersGenerator.java new file mode 100644 index 000000000..a913b22cf --- /dev/null +++ b/src/main/java/domain/generator/RandomNumbersGenerator.java @@ -0,0 +1,12 @@ +package domain.generator; + +import java.util.Random; + +public class RandomNumbersGenerator implements NumberGenerator { + private final Random random = new Random(); + + @Override + public int generate() { + return random.nextInt(9) + 1; + } +} diff --git a/src/main/java/domain/model/BaseBallNumbers.java b/src/main/java/domain/model/BaseBallNumbers.java index 9235a51c1..b1eae4d1d 100644 --- a/src/main/java/domain/model/BaseBallNumbers.java +++ b/src/main/java/domain/model/BaseBallNumbers.java @@ -4,18 +4,29 @@ import java.util.List; public class BaseBallNumbers { + public static final int NumberSize = 3; private final List numbers; + + + public static BaseBallNumbers parseIntegerList(String input) { + List numbers = new ArrayList<>(); + for (char c : input.toCharArray()) { + numbers.add(Character.getNumericValue(c)); + } + return new BaseBallNumbers(numbers); + } + public BaseBallNumbers(List numbers) { validate(numbers); this.numbers = numbers; } private void validate(List numbers) { - if (numbers.size() != 3) { - throw new IllegalArgumentException("숫자는 3개여야 합니다."); + if (numbers.size() != NumberSize) { + throw new IllegalArgumentException("숫자는 " + NumberSize + "개여야 합니다."); } - if (numbers.stream().distinct().count() != 3) { + if (numbers.stream().distinct().count() != NumberSize) { throw new IllegalArgumentException("중복된 숫자가 있습니다."); } for (int num : numbers) { @@ -36,15 +47,6 @@ public boolean contains(int num) { public int size() { return numbers.size(); } - - public static BaseBallNumbers parseIntegerList(String input) { - List numbers = new ArrayList<>(); - for (char c : input.toCharArray()) { - numbers.add(Character.getNumericValue(c)); - } - return new BaseBallNumbers(numbers); - } - // 값 확인용 @Override public String toString() { diff --git a/src/main/java/domain/model/GameResult.java b/src/main/java/domain/model/GameResult.java index 6398422c1..6730658df 100644 --- a/src/main/java/domain/model/GameResult.java +++ b/src/main/java/domain/model/GameResult.java @@ -24,4 +24,4 @@ public int getStrike() { public int getBall() { return ball; } -} +} \ No newline at end of file diff --git a/src/main/java/gameController/GameController.java b/src/main/java/gameController/GameController.java index e8d434a5d..459475abb 100644 --- a/src/main/java/gameController/GameController.java +++ b/src/main/java/gameController/GameController.java @@ -3,7 +3,8 @@ import domain.model.BaseBallNumbers; import domain.model.GameResult; import domain.service.Referee; -import domain.generator.RandomNumberGenerator; +import domain.generator.BaseBallNumbersGenerator; +import domain.generator.RandomNumbersGenerator; import handler.InputHandler; import view.OutputView; @@ -22,16 +23,13 @@ public GameController() { } public void start() { - RandomNumberGenerator numberGenerator = new RandomNumberGenerator(); - BaseBallNumbers problemNumbers = new BaseBallNumbers(numberGenerator.problemNumbersGenerate()); - + BaseBallNumbersGenerator numberGenerator = new BaseBallNumbersGenerator(new RandomNumbersGenerator()); + BaseBallNumbers problemNumbers = new BaseBallNumbers(numberGenerator.generate()); outputView.printGameStart(); try { while (true) { - String userInput = inputHandler.getUserInput(); BaseBallNumbers userNumbers = BaseBallNumbers.parseIntegerList(userInput); - GameResult gameResult = referee.decides(problemNumbers, userNumbers); if (gameResult.isWin()) { outputView.printWin(); diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 8ea35322a..fc733b19a 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -8,7 +8,6 @@ public void printGameStart() { public void printResult(int strike, int ball, int failCount) { StringBuilder text = new StringBuilder(); - if (strike > 0) { text.append(strike).append("스트라이크 "); } diff --git a/src/test/java/domain/generator/BaseBallNumbersGeneratorTest.java b/src/test/java/domain/generator/BaseBallNumbersGeneratorTest.java new file mode 100644 index 000000000..bcd308ae5 --- /dev/null +++ b/src/test/java/domain/generator/BaseBallNumbersGeneratorTest.java @@ -0,0 +1,39 @@ +package domain.generator; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class BaseBallNumbersGeneratorTest { + + @Test + void Numbers123Test() { + NumberGenerator fixedGenerator = new TestNumberGenerator(1, 2, 3); + BaseBallNumbersGenerator generator = new BaseBallNumbersGenerator(fixedGenerator); + List result = generator.generate(); + assertThat(result).containsExactly(1, 2, 3); + // assertThat(result) => 검사할 값 + // containsExactly > 배열이 일치하는지 확인(가변 배열을 인자로 받음) + System.out.println("Number123Test Check Complete"); + } + + @Test + void Numbers459() { + NumberGenerator fixedGenerator = new TestNumberGenerator(4, 5, 9); + BaseBallNumbersGenerator generator = new BaseBallNumbersGenerator(fixedGenerator); + List result = generator.generate(); + assertThat(result).containsExactly(4, 5, 9); + System.out.println("Numbers459 Check Complete"); + } + + @Test + void duplicateNumbersCheck() { + NumberGenerator fixedGenerator = new TestNumberGenerator(1, 1, 2, 3); + BaseBallNumbersGenerator generator = new BaseBallNumbersGenerator(fixedGenerator); + List result = generator.generate(); + assertThat(result).containsExactly(1, 2, 3); + assertThat(result).hasSize(3); + } +} diff --git a/src/test/java/domain/generator/TestNumberGenerator.java b/src/test/java/domain/generator/TestNumberGenerator.java new file mode 100644 index 000000000..f87e52056 --- /dev/null +++ b/src/test/java/domain/generator/TestNumberGenerator.java @@ -0,0 +1,15 @@ +package domain.generator; + +public class TestNumberGenerator implements NumberGenerator { + private final int[] numbers; + private int index = 0; + + public TestNumberGenerator(int... numbers) { + this.numbers = numbers; + } + + @Override + public int generate() { + return numbers[index++]; + } +} From 9981a13f9253c25febcc61fb19af1c73f31b5557 Mon Sep 17 00:00:00 2001 From: songhansol Date: Mon, 9 Feb 2026 08:50:58 +0900 Subject: [PATCH 6/7] =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B0=80?= =?UTF-8?q?=EB=8A=A5=ED=95=98=EA=B2=8C=20NumberGenerator=EC=B6=94=EC=83=81?= =?UTF-8?q?=ED=99=94=20+=20=EB=AA=A8=EB=8D=B8=EC=97=90=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=EC=97=90=20=EC=82=AC=EC=9A=A9=ED=95=A0=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=20=EA=B0=AF=EC=88=98=20=EC=83=81=EC=88=98=20=EC=84=A0?= =?UTF-8?q?=EC=96=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/model/BaseBallNumbers.java | 10 +++++----- src/main/java/gameController/GameController.java | 5 ++--- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/domain/model/BaseBallNumbers.java b/src/main/java/domain/model/BaseBallNumbers.java index b1eae4d1d..fa2218e38 100644 --- a/src/main/java/domain/model/BaseBallNumbers.java +++ b/src/main/java/domain/model/BaseBallNumbers.java @@ -6,10 +6,10 @@ public class BaseBallNumbers { public static final int NumberSize = 3; private final List numbers; - - - - public static BaseBallNumbers parseIntegerList(String input) { + public static BaseBallNumbers from(List numbers) { + return new BaseBallNumbers(numbers); + } + public static BaseBallNumbers parse(String input) { List numbers = new ArrayList<>(); for (char c : input.toCharArray()) { numbers.add(Character.getNumericValue(c)); @@ -17,7 +17,7 @@ public static BaseBallNumbers parseIntegerList(String input) { return new BaseBallNumbers(numbers); } - public BaseBallNumbers(List numbers) { + private BaseBallNumbers(List numbers) { validate(numbers); this.numbers = numbers; } diff --git a/src/main/java/gameController/GameController.java b/src/main/java/gameController/GameController.java index 459475abb..21cd8ea63 100644 --- a/src/main/java/gameController/GameController.java +++ b/src/main/java/gameController/GameController.java @@ -24,12 +24,12 @@ public GameController() { public void start() { BaseBallNumbersGenerator numberGenerator = new BaseBallNumbersGenerator(new RandomNumbersGenerator()); - BaseBallNumbers problemNumbers = new BaseBallNumbers(numberGenerator.generate()); + BaseBallNumbers problemNumbers = BaseBallNumbers.from(numberGenerator.generate()); outputView.printGameStart(); try { while (true) { String userInput = inputHandler.getUserInput(); - BaseBallNumbers userNumbers = BaseBallNumbers.parseIntegerList(userInput); + BaseBallNumbers userNumbers = BaseBallNumbers.parse(userInput); GameResult gameResult = referee.decides(problemNumbers, userNumbers); if (gameResult.isWin()) { outputView.printWin(); @@ -41,7 +41,6 @@ public void start() { inputHandler.close(); } catch (IllegalArgumentException error) { System.out.println(error.getMessage()); - System.exit(0); } } } From f937024fe32ccd1e5f1a6f3eac34ec29b3eede08 Mon Sep 17 00:00:00 2001 From: songhansol Date: Mon, 9 Feb 2026 10:04:21 +0900 Subject: [PATCH 7/7] =?UTF-8?q?=EA=B2=8C=EC=9E=84=EC=97=90=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=A0=20=EC=88=AB=EC=9E=90=20=EA=B0=AF=EC=88=98=20?= =?UTF-8?q?=EC=83=81=EC=88=98=20=EC=84=A0=EC=96=B8=20=EB=AF=B8=EC=A0=81?= =?UTF-8?q?=EC=9A=A9=EB=90=9C=20=EB=B6=80=EB=B6=84=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/domain/model/GameResult.java | 2 +- src/main/java/handler/InputHandler.java | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/domain/model/GameResult.java b/src/main/java/domain/model/GameResult.java index 6730658df..75270158e 100644 --- a/src/main/java/domain/model/GameResult.java +++ b/src/main/java/domain/model/GameResult.java @@ -10,7 +10,7 @@ public GameResult(int strike, int ball) { } public boolean isWin() { - return strike == 3; + return strike == BaseBallNumbers.NumberSize; } public boolean isNothing() { diff --git a/src/main/java/handler/InputHandler.java b/src/main/java/handler/InputHandler.java index 86383b905..6465720f5 100644 --- a/src/main/java/handler/InputHandler.java +++ b/src/main/java/handler/InputHandler.java @@ -1,5 +1,7 @@ package handler; +import domain.model.BaseBallNumbers; + import java.util.Scanner; public class InputHandler { @@ -17,18 +19,18 @@ public String getUserInput() { private void validate(String input) { // 자릿수 체크 - if (input.length() != 3) { + if (input.length() != BaseBallNumbers.NumberSize) { throw new IllegalArgumentException("3자리 숫자를 입력하세요."); } // 1-9 숫자 확인 - for (int i = 0; i < 3; i++) { + for (int i = 0; i < BaseBallNumbers.NumberSize; i++) { char c = input.charAt(i); if (c < '1' || c > '9') { throw new IllegalArgumentException("1-9 사이 숫자만 입력하세요."); } } // 중복 체크 - if (input.chars().distinct().count() != 3) { + if (input.chars().distinct().count() != BaseBallNumbers.NumberSize) { throw new IllegalArgumentException("중복된 숫자는 입력할 수 없습니다."); }