From a5b8549e9844309b2a3b7bc31ef5d1ac7d1e8fe5 Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Tue, 16 Feb 2021 03:26:00 +0900 Subject: [PATCH 01/42] =?UTF-8?q?docs(guide):=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/README.md b/README.md index d5b0084..b50e60a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,88 @@ # 미션 - 숫자 야구 게임 +## 📄 구현 기능 목록 + +### 게임 관리자 + +- 게임의 전체적 순서를 보장한다. +- 게임의 종료 여부를 결정한다. +- 한 게임 내에서 전역적으로 유지 되어야 할 상태를 유지시킨다. + - 숫자 생성기에 의해 생성된 숫자 + +### 숫자 생성기 + +- 임의의 3자리 숫자를 생성한다. + - 각 자리의 숫자는 1-9사이의 숫자이다. + - 각 자리의 숫자는 서로 다르다. + +- 생성된 숫자는 한 게임 동안 유지될 수 있도록 한다. + +### 게임 내 사용자 입력기 + +- 게임 내에서 진행되는 숫자를 입력받는 입력기이다. +- 표준 입력으로부터 사용자 입력을 받는다. + + - 사용자 입력은 3자리 수이어야만 한다. + - [Option] 3자리 이상일 경우 + - 오류를 출력하고 입력을 다시 받는다. + - 혹은, 앞의 3자리만 잘라서 받는다. + - 3자리 미만일 경우 + - 오류를 출력하고 입력을 다시 받는다. + - 숫자가 아닐 경우 + - 오류를 출력하고 입력을 다시 받는다. + - [Option] 한 자리의 숫자가 다른 자리의 것과 같은 숫자인 경우 + - ex) 777, 121, 334, 515 + - 오류를 출력하고 입력을 다시 받는다. + - 혹은, 정상적으로 게임을 진행한다. + - [Option] 생성 숫자가 751이고, 사용자 입력 숫자가 777인 경우 + - 1스트라이크 2볼을 출력한다. + - 혹은, 1스트라이크를 출력한다. + + - 잘못된 입력으로 인한 예외는 IllegalArgumentException을 발생시킨다. + - 입력된 숫자는 비교 결과가 생성되어 출력될 때까지 유지한다. + +### 게임 외 사용자 입력기 + +- 게임 종료후 새로운 게임을 시작하는 이벤트를 발생시키거나 프로그램을 종료시킬 수 있는 이벤트를 발생시킬 수 있는 입력기이다. + - 입력으로 "yes"를 받을 경우 출력기에게 다시시작 메시지를 전달한다. + - 입력으로 "no"를 받을 경우 출력기에게 종료 메시지를 전달한다. + - 둘 중 어느 것에도 포함되지 않는 입력을 받을 경우 에러 메시지를 전달한다. + +### 결과 출력기 + +- 비교기로부터 넘겨받은 비교 결과를 출력한다. + - 스트라이크 카운트에 "스트라이크" 문자열을 이어 출력한다. + - 볼 카운트에 "볼" 문자열을 이어 출력한다. + - 스트라이크 카운트 혹은 볼 카운트가 0일 경우 출력하지 않는다. + - ex) 스트라이크 카운트가 0이고, 볼 카운트가 1일 경우, "1볼"만 출력한다. + - 스트라이크 카운트가 0이고, 볼 카운트가 0일 경우 "낫싱"을 출력한다. + +- 3스트라이크일 경우 게임 외 출력기에게 메시지를 출력하도록 이벤트를 발생시킨다. + +### 게임 외 출력기 + +- 게임을 종료하는 메시지를 출력한다. + - 다른 게임 시작 의사 여부를 묻는 메시지를 출력한다. + - ex) "다시 시작하시겠습니까? (yes/no)" + +- 게임 외 사용자 입력기에게 입력을 받도록 이벤트를 발생시킨다. +- 게임 외 사용자 입력기로부터 메시지를 전달받으면 적절한 메시지를 출력하고 처리를 진행한다. + - 다시시작 메시지라면 "게임을 다시시작합니다."를 출력하고 게임 관리자에게 다시시작하는 메시지를 전달한다. + - 종료 메시지라면 "종료합니다."를 출력하고 게임 관리자에게 종료하는 메시지를 전달한다. + - 에러 메시지라면 "다시 시작하시겠습니까? (yes/no)"를 다시 출력하고 반복한다. + + + +### 입력 비교기 + +- 생성기로부터 유지된 생성값을 사용자 입력과 비교한다. + - 같은 자리에 같은 숫자가 있는 경우 스트라이크 카운트를 증가시킨다. + - 다른 자리에 생성된 숫자가 포함하는 숫자를 가지고 있는 경우 볼 카운트를 증가시킨다. + +- 비교 결과는 결과 출력기에 넘겨줄 수 있다. + + + ## 🚀 기능 요구사항 - 이 게임은 프로그램이 1에서 9까지 서로 다른 임의의 수 3개를 정하고 이를 플레이어가 맞추는 게임이다. - 정답을 맞추기 위해 3자리수를 입력하고 힌트를 받는다. @@ -11,6 +94,7 @@ - 아래의 프로그래밍 실행 결과 예시와 동일하게 입력과 출력이 이루어져야 한다.
+ ## ✍🏻 입출력 요구사항 ### ⌨️ 입력 From 1649c59f153d9ee5af0f665a0ac5af8eea752b86 Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Thu, 18 Feb 2021 18:12:04 +0900 Subject: [PATCH 02/42] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=A0=84?= =?UTF-8?q?=EC=B2=B4=20=EA=B3=A8=EA=B2=A9=20=EC=84=A4=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Application.java | 5 ++ src/main/java/baseball/GameManager.java | 62 +++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 src/main/java/baseball/GameManager.java diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index d484dad..c23f488 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -1,10 +1,15 @@ package baseball; +import utils.RandomUtils; + import java.util.Scanner; public class Application { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // TODO 구현 진행 + + GameManager manager = new GameManager(scanner); + manager.run(); } } diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java new file mode 100644 index 0000000..e8d201c --- /dev/null +++ b/src/main/java/baseball/GameManager.java @@ -0,0 +1,62 @@ +package baseball; + +import baseball.generator.RandomNumberGenerator; +import baseball.inputer.InnerGameInputer; +import baseball.inputer.OuterGameInputer; +import baseball.number.SeedNumber; +import baseball.number.UserNumber; +import baseball.printer.InnerGamePrinter; +import baseball.printer.OuterGamePrinter; +import baseball.result.Result; + +import java.util.Scanner; + +public class GameManager { + private RandomNumberGenerator generator; + private InnerGamePrinter innerGamePrinter; + private OuterGamePrinter outerGamePrinter; + private InnerGameInputer innerGameInputer; + private OuterGameInputer outerGameInputer; + private SeedNumber seedNumber; + private UserNumber userNumber; + + public GameManager(Scanner scanner) { + generator = new RandomNumberGenerator(); + innerGamePrinter = new InnerGamePrinter(); + outerGamePrinter = new OuterGamePrinter(); + innerGameInputer = new InnerGameInputer(scanner); + outerGameInputer = new OuterGameInputer(scanner); + } + + public void run() { + Result result = new Result(); + boolean continueGame = true; + + outerGamePrinter.greet(); + continueGame = outerGameInputer.getGameStart(); + while(continueGame) { + //새로운게임 시작 + generator.generate(seedNumber); + //반복 + startGame(result); + //맞으면 탈출 + //재시작 의사 확인 + outerGamePrinter.askRestartGame(); + continueGame = outerGameInputer.getGameStart(); + } + } + + private void startGame(Result result) { + + while(result.isThreeStrike()) { + innerGamePrinter.requestUserNumber(); + //입력받고 + innerGameInputer.getUserNumber(userNumber); + //비교 + seedNumber.compare(userNumber, result); + //결과 출력 + innerGamePrinter.printResult(result); + //틀리면 반복 + } + } +} From 34cbe188a5f01f04bbdad07b63159eea9ac11450 Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Thu, 18 Feb 2021 22:42:25 +0900 Subject: [PATCH 03/42] =?UTF-8?q?feat:=20=ED=94=84=EB=A6=B0=ED=84=B0=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 게임 내부 & 외부 프린터 구현 --- .../baseball/printer/InnerGamePrinter.java | 10 ++++++++++ .../baseball/printer/OuterGamePrinter.java | 20 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 src/main/java/baseball/printer/InnerGamePrinter.java create mode 100644 src/main/java/baseball/printer/OuterGamePrinter.java diff --git a/src/main/java/baseball/printer/InnerGamePrinter.java b/src/main/java/baseball/printer/InnerGamePrinter.java new file mode 100644 index 0000000..3047077 --- /dev/null +++ b/src/main/java/baseball/printer/InnerGamePrinter.java @@ -0,0 +1,10 @@ +package baseball.printer; + +public class InnerGamePrinter { + public InnerGamePrinter() { + } + + public void requestUserNumber() { + System.out.println("숫자를 입렧해주세요 : "); + } +} diff --git a/src/main/java/baseball/printer/OuterGamePrinter.java b/src/main/java/baseball/printer/OuterGamePrinter.java new file mode 100644 index 0000000..48afdfa --- /dev/null +++ b/src/main/java/baseball/printer/OuterGamePrinter.java @@ -0,0 +1,20 @@ +package baseball.printer; + +public class OuterGamePrinter { + + private final String greetMessage = + "숫자 야구 게임입니다.\n" + + "게임을 시작하시겠습니까?"; + private final String startCheckMessage = + "시작하려면 1, 종료하려면 2를 입력하세요."; + + public OuterGamePrinter() { + } + + public void greet() { + System.out.println(greetMessage); + } + public void askStartGame() { + System.out.println(startCheckMessage); + } +} From 85863a6db75a2eb09584118a444b20403db96d52 Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Thu, 18 Feb 2021 23:00:04 +0900 Subject: [PATCH 04/42] =?UTF-8?q?refactor:=20=ED=94=84=EB=A6=B0=ED=84=B0?= =?UTF-8?q?=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 출력 방식의 변경을 수월하게 할 수 있게 인터페이스 추출 - 게임 내/외부의 측면에서 책임을 나누는 것이 과도한 분리라고 생각됨 --- src/main/java/baseball/GameManager.java | 35 ++++++++---------- .../java/baseball/printer/ConsolePrinter.java | 36 +++++++++++++++++++ src/main/java/baseball/printer/Printer.java | 13 +++++++ 3 files changed, 63 insertions(+), 21 deletions(-) create mode 100644 src/main/java/baseball/printer/ConsolePrinter.java create mode 100644 src/main/java/baseball/printer/Printer.java diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index e8d201c..6c64656 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -5,16 +5,15 @@ import baseball.inputer.OuterGameInputer; import baseball.number.SeedNumber; import baseball.number.UserNumber; -import baseball.printer.InnerGamePrinter; -import baseball.printer.OuterGamePrinter; +import baseball.printer.ConsolePrinter; +import baseball.printer.Printer; import baseball.result.Result; import java.util.Scanner; public class GameManager { - private RandomNumberGenerator generator; - private InnerGamePrinter innerGamePrinter; - private OuterGamePrinter outerGamePrinter; + private final RandomNumberGenerator generator; + private final Printer printer; private InnerGameInputer innerGameInputer; private OuterGameInputer outerGameInputer; private SeedNumber seedNumber; @@ -22,41 +21,35 @@ public class GameManager { public GameManager(Scanner scanner) { generator = new RandomNumberGenerator(); - innerGamePrinter = new InnerGamePrinter(); - outerGamePrinter = new OuterGamePrinter(); + printer = new ConsolePrinter(); innerGameInputer = new InnerGameInputer(scanner); outerGameInputer = new OuterGameInputer(scanner); + seedNumber = new SeedNumber(); + userNumber = new UserNumber(); } public void run() { Result result = new Result(); boolean continueGame = true; - outerGamePrinter.greet(); - continueGame = outerGameInputer.getGameStart(); + printer.greet(); + printer.askStartGame(); + continueGame = outerGameInputer.checkContinueGame(); while(continueGame) { - //새로운게임 시작 generator.generate(seedNumber); - //반복 startGame(result); - //맞으면 탈출 - //재시작 의사 확인 - outerGamePrinter.askRestartGame(); - continueGame = outerGameInputer.getGameStart(); + printer.askStartGame(); + continueGame = outerGameInputer.checkContinueGame(); } } private void startGame(Result result) { while(result.isThreeStrike()) { - innerGamePrinter.requestUserNumber(); - //입력받고 + printer.requestUserNumber(); innerGameInputer.getUserNumber(userNumber); - //비교 seedNumber.compare(userNumber, result); - //결과 출력 - innerGamePrinter.printResult(result); - //틀리면 반복 + printer.printResult(result); } } } diff --git a/src/main/java/baseball/printer/ConsolePrinter.java b/src/main/java/baseball/printer/ConsolePrinter.java new file mode 100644 index 0000000..3749e89 --- /dev/null +++ b/src/main/java/baseball/printer/ConsolePrinter.java @@ -0,0 +1,36 @@ +package baseball.printer; + +import baseball.result.Result; + +public class ConsolePrinter implements Printer { + + @Override + public void greet() { + System.out.println("숫자 야구 게임입니다.\n" + + "게임을 시작하시겠습니까?"); + } + + @Override + public void askStartGame() { + System.out.println("시작하려면 1, 종료하려면 2를 입력하세요."); + } + + @Override + public void requestUserNumber() { + System.out.println("숫자를 입렧해주세요 : "); + } + + @Override + public void printResult(Result result) { + if(result.isNothing()) { + System.out.println("낫싱"); + return ; + } + + if(result.getBallCount() != 0) + System.out.print(result.getBallCount() + "볼 "); + + if(result.getStrikeCount() != 0) + System.out.print(result.getStrikeCount() + "스트라이크"); + } +} diff --git a/src/main/java/baseball/printer/Printer.java b/src/main/java/baseball/printer/Printer.java new file mode 100644 index 0000000..a05a74d --- /dev/null +++ b/src/main/java/baseball/printer/Printer.java @@ -0,0 +1,13 @@ +package baseball.printer; + +import baseball.result.Result; + +public interface Printer { + void greet(); + + void askStartGame(); + + void requestUserNumber(); + + void printResult(Result result); +} From d5f104162515571fadd738afdb2649f6de07b15b Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Thu, 18 Feb 2021 23:54:26 +0900 Subject: [PATCH 05/42] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=EA=B8=B0=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 초기 설계와 다른 점이 있다: - 게임 내/외부 입력기의 구분을 없앰 - 확장성을 고려하여 InputReceiver 인터페이스를 선언함 --- src/main/java/baseball/GameManager.java | 33 +++++------ .../baseball/printer/InnerGamePrinter.java | 10 ---- .../baseball/printer/OuterGamePrinter.java | 20 ------- .../receiver/ConsoleInputReceiver.java | 55 +++++++++++++++++++ .../java/baseball/receiver/InputReceiver.java | 10 ++++ 5 files changed, 82 insertions(+), 46 deletions(-) delete mode 100644 src/main/java/baseball/printer/InnerGamePrinter.java delete mode 100644 src/main/java/baseball/printer/OuterGamePrinter.java create mode 100644 src/main/java/baseball/receiver/ConsoleInputReceiver.java create mode 100644 src/main/java/baseball/receiver/InputReceiver.java diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index 6c64656..760ff20 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -1,10 +1,9 @@ package baseball; import baseball.generator.RandomNumberGenerator; -import baseball.inputer.InnerGameInputer; -import baseball.inputer.OuterGameInputer; -import baseball.number.SeedNumber; -import baseball.number.UserNumber; +import baseball.receiver.ConsoleInputReceiver; +import baseball.receiver.InputReceiver; +import baseball.number.GameNumber; import baseball.printer.ConsolePrinter; import baseball.printer.Printer; import baseball.result.Result; @@ -14,18 +13,16 @@ public class GameManager { private final RandomNumberGenerator generator; private final Printer printer; - private InnerGameInputer innerGameInputer; - private OuterGameInputer outerGameInputer; - private SeedNumber seedNumber; - private UserNumber userNumber; + private final InputReceiver receiver; + private GameNumber seedNumber; + private GameNumber userNumber; public GameManager(Scanner scanner) { generator = new RandomNumberGenerator(); printer = new ConsolePrinter(); - innerGameInputer = new InnerGameInputer(scanner); - outerGameInputer = new OuterGameInputer(scanner); - seedNumber = new SeedNumber(); - userNumber = new UserNumber(); + receiver = new ConsoleInputReceiver(scanner); + seedNumber = new GameNumber(); + userNumber = new GameNumber(); } public void run() { @@ -34,22 +31,26 @@ public void run() { printer.greet(); printer.askStartGame(); - continueGame = outerGameInputer.checkContinueGame(); + continueGame = receiver.checkContinueGame(); while(continueGame) { generator.generate(seedNumber); startGame(result); printer.askStartGame(); - continueGame = outerGameInputer.checkContinueGame(); + continueGame = receiver.checkContinueGame(); } } private void startGame(Result result) { while(result.isThreeStrike()) { - printer.requestUserNumber(); - innerGameInputer.getUserNumber(userNumber); + receiveUserInput(); seedNumber.compare(userNumber, result); printer.printResult(result); } } + + private void receiveUserInput() { + printer.requestUserNumber(); + receiver.receiveUserNumber(userNumber); + } } diff --git a/src/main/java/baseball/printer/InnerGamePrinter.java b/src/main/java/baseball/printer/InnerGamePrinter.java deleted file mode 100644 index 3047077..0000000 --- a/src/main/java/baseball/printer/InnerGamePrinter.java +++ /dev/null @@ -1,10 +0,0 @@ -package baseball.printer; - -public class InnerGamePrinter { - public InnerGamePrinter() { - } - - public void requestUserNumber() { - System.out.println("숫자를 입렧해주세요 : "); - } -} diff --git a/src/main/java/baseball/printer/OuterGamePrinter.java b/src/main/java/baseball/printer/OuterGamePrinter.java deleted file mode 100644 index 48afdfa..0000000 --- a/src/main/java/baseball/printer/OuterGamePrinter.java +++ /dev/null @@ -1,20 +0,0 @@ -package baseball.printer; - -public class OuterGamePrinter { - - private final String greetMessage = - "숫자 야구 게임입니다.\n" + - "게임을 시작하시겠습니까?"; - private final String startCheckMessage = - "시작하려면 1, 종료하려면 2를 입력하세요."; - - public OuterGamePrinter() { - } - - public void greet() { - System.out.println(greetMessage); - } - public void askStartGame() { - System.out.println(startCheckMessage); - } -} diff --git a/src/main/java/baseball/receiver/ConsoleInputReceiver.java b/src/main/java/baseball/receiver/ConsoleInputReceiver.java new file mode 100644 index 0000000..cc820cc --- /dev/null +++ b/src/main/java/baseball/receiver/ConsoleInputReceiver.java @@ -0,0 +1,55 @@ +package baseball.receiver; + +import baseball.number.GameNumber; + +import java.util.Scanner; + +public class ConsoleInputReceiver implements InputReceiver { + + private final Scanner scanner; + private final int START_GAME = 1; + + public ConsoleInputReceiver(Scanner scanner) { + this.scanner = scanner; + } + + @Override + public boolean checkContinueGame() { + int select = 0; + + try { + select = receiveInputByIntAndClean(); + throwIfInputIsNotOneOrTwo(select); + } catch (IllegalArgumentException exception) { + cleanScannerBuffer(); + System.out.println("잘못된 입력입니다. 다시 입력해주세요."); + return checkContinueGame(); + } + + return select == START_GAME; + } + + @Override + public void receiveUserNumber(GameNumber userNumber) { + int number = receiveInputByIntAndClean(); + if(!GameNumber.validateNumber(number)) + throw new IllegalArgumentException(); + userNumber.setValue(Integer.toString(number)); + } + + private int receiveInputByIntAndClean() { + int input = scanner.nextInt(); + cleanScannerBuffer(); + return input; + } + + private void cleanScannerBuffer() { + if(scanner.hasNext()) + scanner.nextLine(); + } + + private void throwIfInputIsNotOneOrTwo(int select) { + if(select != 1 && select != 2) + throw new IllegalArgumentException(); + } +} diff --git a/src/main/java/baseball/receiver/InputReceiver.java b/src/main/java/baseball/receiver/InputReceiver.java new file mode 100644 index 0000000..b2e292c --- /dev/null +++ b/src/main/java/baseball/receiver/InputReceiver.java @@ -0,0 +1,10 @@ +package baseball.receiver; + +import baseball.number.GameNumber; + +public interface InputReceiver { + + boolean checkContinueGame(); + + void receiveUserNumber(GameNumber userNumber); +} From f5b9d9109028207c44e94d9130a81bffd6d9e04e Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Fri, 19 Feb 2021 00:02:06 +0900 Subject: [PATCH 06/42] =?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=88=AB=EC=9E=90=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=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/baseball/number/GameNumber.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/main/java/baseball/number/GameNumber.java diff --git a/src/main/java/baseball/number/GameNumber.java b/src/main/java/baseball/number/GameNumber.java new file mode 100644 index 0000000..9b856c3 --- /dev/null +++ b/src/main/java/baseball/number/GameNumber.java @@ -0,0 +1,49 @@ +package baseball.number; + +import baseball.result.Result; + +public class GameNumber { + private String value; + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public GameNumber() { + value = ""; + } + public GameNumber(String number) { + if(!validateNumber(Integer.parseInt(number))) + throw new IllegalArgumentException(); + this.value = number; + } + + public void compare(GameNumber userNumber, Result result) { + + } + + public static boolean validateNumber(int number) { + if(number <= 122 || number >=988) + return false; + + boolean[] digits = new boolean[10]; + String strNumber = Integer.toString(number); + + for (char digit : strNumber.toCharArray()) { + + int integerDigit = Integer.parseInt(String.valueOf(digit)); + if (!digits[integerDigit]) { + digits[integerDigit] = true; + continue; + } + + return false; + } + + return true; + } +} From 32974a8392f6ea44a84a1db84a57ba7367f86461 Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Fri, 19 Feb 2021 00:18:20 +0900 Subject: [PATCH 07/42] =?UTF-8?q?feat:=20=EC=98=AC=EB=B0=94=EB=A5=B4?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EC=9D=80=20=EC=9E=85=EB=A0=A5=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=EA=B2=BD=EA=B3=A0=20=EB=A9=94=EC=8B=9C?= =?UTF-8?q?=EC=A7=80=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/baseball/printer/ConsolePrinter.java | 6 ++++++ src/main/java/baseball/printer/Printer.java | 2 ++ 2 files changed, 8 insertions(+) diff --git a/src/main/java/baseball/printer/ConsolePrinter.java b/src/main/java/baseball/printer/ConsolePrinter.java index 3749e89..a4ac7eb 100644 --- a/src/main/java/baseball/printer/ConsolePrinter.java +++ b/src/main/java/baseball/printer/ConsolePrinter.java @@ -20,6 +20,12 @@ public void requestUserNumber() { System.out.println("숫자를 입렧해주세요 : "); } + @Override + public void warnInvalidInput() { + System.out.println("올바르지 않은 입력입니다.\n" + + "서로 다른 숫자 세 자리를 입력해주세요."); + } + @Override public void printResult(Result result) { if(result.isNothing()) { diff --git a/src/main/java/baseball/printer/Printer.java b/src/main/java/baseball/printer/Printer.java index a05a74d..c141297 100644 --- a/src/main/java/baseball/printer/Printer.java +++ b/src/main/java/baseball/printer/Printer.java @@ -9,5 +9,7 @@ public interface Printer { void requestUserNumber(); + void warnInvalidInput(); + void printResult(Result result); } From e35e434f477727863d1a1fbff7c283fc4e1bf632 Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Fri, 19 Feb 2021 00:19:41 +0900 Subject: [PATCH 08/42] =?UTF-8?q?refactor:=20try-catch=20=EB=AC=B8=20?= =?UTF-8?q?=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 인덴트 깊이를 증가시키는 try-catch 문 추출 --- src/main/java/baseball/GameManager.java | 16 ++++++++++++---- .../baseball/receiver/ConsoleInputReceiver.java | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index 760ff20..83b8365 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -43,14 +43,22 @@ public void run() { private void startGame(Result result) { while(result.isThreeStrike()) { - receiveUserInput(); + boolean isValidInput = false; + isValidInput = receiveUserInput(); + if(isValidInput) continue; seedNumber.compare(userNumber, result); printer.printResult(result); } } - private void receiveUserInput() { - printer.requestUserNumber(); - receiver.receiveUserNumber(userNumber); + private boolean receiveUserInput() { + try { + printer.requestUserNumber(); + receiver.receiveUserNumber(userNumber); + } catch (IllegalArgumentException e) { + printer.warnInvalidInput(); + return false; + } + return true; } } diff --git a/src/main/java/baseball/receiver/ConsoleInputReceiver.java b/src/main/java/baseball/receiver/ConsoleInputReceiver.java index cc820cc..6af5628 100644 --- a/src/main/java/baseball/receiver/ConsoleInputReceiver.java +++ b/src/main/java/baseball/receiver/ConsoleInputReceiver.java @@ -30,7 +30,7 @@ public boolean checkContinueGame() { } @Override - public void receiveUserNumber(GameNumber userNumber) { + public void receiveUserNumber(GameNumber userNumber) throws IllegalArgumentException { int number = receiveInputByIntAndClean(); if(!GameNumber.validateNumber(number)) throw new IllegalArgumentException(); From d5eeeaf2838429aee152922b7ccf299ee38c91e2 Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Fri, 19 Feb 2021 00:49:18 +0900 Subject: [PATCH 09/42] =?UTF-8?q?test:=20=EC=9E=85=EB=A0=A5=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=20=EA=B2=80=EC=A6=9D=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BC=80=EC=9D=B4=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 세자리 수 입력이 아니면 false를 반환한다. - 세자리 수이지만 각 자리가 서로 다른 숫자가 아니면 false를 반환한다. - 세자리 수이면서 각 자리 숫자가 서로 다른 숫자이면 true를 반환한다. --- .../java/baseball/number/GameNumberTest.java | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/test/java/baseball/number/GameNumberTest.java diff --git a/src/test/java/baseball/number/GameNumberTest.java b/src/test/java/baseball/number/GameNumberTest.java new file mode 100644 index 0000000..f676990 --- /dev/null +++ b/src/test/java/baseball/number/GameNumberTest.java @@ -0,0 +1,61 @@ +package baseball.number; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class GameNumberTest { + + @Test + void compare() { + } + + @Test + void 세자리수_입력이_아니면_false() { + //given + int input1 = 1000; + int input2 = -1; + int input3 = 23; + int input4 = 99; + + //when, then + assertFalse(GameNumber.validateNumber(input1)); + assertFalse(GameNumber.validateNumber(input2)); + assertFalse(GameNumber.validateNumber(input3)); + assertFalse(GameNumber.validateNumber(input4)); + } + + @Test + public void 세자리_수이지만_서로_다른_숫자가_아니면_false() { + //given + int input1 = 110; + int input2 = 122; + int input3 = 999; + int input4 = 575; + int input5 = 100; + + //when, then + assertFalse(GameNumber.validateNumber(input1)); + assertFalse(GameNumber.validateNumber(input2)); + assertFalse(GameNumber.validateNumber(input3)); + assertFalse(GameNumber.validateNumber(input4)); + assertFalse(GameNumber.validateNumber(input5)); + } + + @Test + public void 세자리_수이면서_각_자리_숫자가_서로_다른_숫자이면_true() { + //given + int input1 = 564; + int input2 = 679; + int input3 = 541; + int input4 = 908; + int input5 = 543; + + //when, then + assertTrue(GameNumber.validateNumber(input2)); + assertTrue(GameNumber.validateNumber(input1)); + assertTrue(GameNumber.validateNumber(input3)); + assertTrue(GameNumber.validateNumber(input4)); + assertTrue(GameNumber.validateNumber(input5)); + } +} \ No newline at end of file From 02bd97d673f17d1f84658f419073684056d55c49 Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Fri, 19 Feb 2021 04:16:34 +0900 Subject: [PATCH 10/42] =?UTF-8?q?feat:=20=EC=BB=B4=ED=93=A8=ED=84=B0?= =?UTF-8?q?=EC=9D=98=20=EC=84=B8=EC=9E=90=EB=A6=AC=20=EB=82=9C=EC=88=98=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=A9=94=EC=84=9C=EB=93=9C=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 --- .../generator/RandomNumberGenerator.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/baseball/generator/RandomNumberGenerator.java diff --git a/src/main/java/baseball/generator/RandomNumberGenerator.java b/src/main/java/baseball/generator/RandomNumberGenerator.java new file mode 100644 index 0000000..e580b83 --- /dev/null +++ b/src/main/java/baseball/generator/RandomNumberGenerator.java @@ -0,0 +1,23 @@ +package baseball.generator; + +import baseball.number.GameNumber; +import utils.RandomUtils; + +public class RandomNumberGenerator { + + public void generate(GameNumber seedNumber) { + + int newSeed = 0; + for (int exponent = 0; exponent < 3; exponent++) { + int randomDigit = RandomUtils.nextInt(1, 9); + newSeed += (Math.pow(10.0, exponent) * randomDigit); + } + + if(!GameNumber.validateNumber(newSeed)){ + generate(seedNumber); + return ; + } + + seedNumber.setValue(Integer.toString(newSeed)); + } +} From fef00e113ebd7e5bfdedf03ff0b566fde8f2620e Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Fri, 19 Feb 2021 04:23:05 +0900 Subject: [PATCH 11/42] =?UTF-8?q?refactor:=20=EB=82=9C=EC=88=98=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=A9=94=EC=84=9C=EB=93=9C=20static=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 난수 생성 클래스인 RandomNumberGenerator 클래스는 유일한 메서드 generate를 가지고 있고, 인스턴스 변수의 활용이 없기 때문에 static 메서드로 둬서 GameManager의 인스턴스 변수 개수를 줄였다. --- src/main/java/baseball/GameManager.java | 4 +--- src/main/java/baseball/generator/RandomNumberGenerator.java | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index 83b8365..d756771 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -11,14 +11,12 @@ import java.util.Scanner; public class GameManager { - private final RandomNumberGenerator generator; private final Printer printer; private final InputReceiver receiver; private GameNumber seedNumber; private GameNumber userNumber; public GameManager(Scanner scanner) { - generator = new RandomNumberGenerator(); printer = new ConsolePrinter(); receiver = new ConsoleInputReceiver(scanner); seedNumber = new GameNumber(); @@ -33,7 +31,7 @@ public void run() { printer.askStartGame(); continueGame = receiver.checkContinueGame(); while(continueGame) { - generator.generate(seedNumber); + RandomNumberGenerator.generate(seedNumber); startGame(result); printer.askStartGame(); continueGame = receiver.checkContinueGame(); diff --git a/src/main/java/baseball/generator/RandomNumberGenerator.java b/src/main/java/baseball/generator/RandomNumberGenerator.java index e580b83..a247156 100644 --- a/src/main/java/baseball/generator/RandomNumberGenerator.java +++ b/src/main/java/baseball/generator/RandomNumberGenerator.java @@ -5,7 +5,7 @@ public class RandomNumberGenerator { - public void generate(GameNumber seedNumber) { + public static void generate(GameNumber seedNumber) { int newSeed = 0; for (int exponent = 0; exponent < 3; exponent++) { From 7612ab7170109757386a910bd2e84a3b69aa93ff Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Fri, 19 Feb 2021 04:30:59 +0900 Subject: [PATCH 12/42] =?UTF-8?q?test:=20=EB=82=9C=EC=88=98=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EA=B8=B0=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 값을 임의로 줄 수 없어서 생성하고 검증하는 절차를 100회 반복 --- .../generator/RandomNumberGeneratorTest.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/test/java/baseball/generator/RandomNumberGeneratorTest.java diff --git a/src/test/java/baseball/generator/RandomNumberGeneratorTest.java b/src/test/java/baseball/generator/RandomNumberGeneratorTest.java new file mode 100644 index 0000000..f825397 --- /dev/null +++ b/src/test/java/baseball/generator/RandomNumberGeneratorTest.java @@ -0,0 +1,24 @@ +package baseball.generator; + +import baseball.number.GameNumber; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class RandomNumberGeneratorTest { + + @Test + void 생성된_난수가_게임_숫자_생성규칙에_부합하는지_100회_검증() { + + GameNumber randomNumber = new GameNumber(); + + for (int loop = 0; loop < 100; loop++) { + //given + RandomNumberGenerator.generate(randomNumber); + int integerRandomNumber = Integer.parseInt(randomNumber.getValue()); + + //when, then + assertTrue(GameNumber.validateNumber(integerRandomNumber)); + } + } +} \ No newline at end of file From 2b113366c78c099cb7de601842cddcb14ca4efb6 Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Fri, 19 Feb 2021 04:33:45 +0900 Subject: [PATCH 13/42] =?UTF-8?q?feat:=20=EA=B2=B0=EA=B3=BC=20=ED=81=B4?= =?UTF-8?q?=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 결과를 담아두는 Result 클래스 구현 - 스트라이크 카운트와 볼 카운트를 상태로 갖고 있음 - 결과 출력에 사용됨 - 게임 종료 조건 확인에 사용되기도 함 --- src/main/java/baseball/result/Result.java | 38 +++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/main/java/baseball/result/Result.java diff --git a/src/main/java/baseball/result/Result.java b/src/main/java/baseball/result/Result.java new file mode 100644 index 0000000..8556e0d --- /dev/null +++ b/src/main/java/baseball/result/Result.java @@ -0,0 +1,38 @@ +package baseball.result; + +public class Result { + private int strikeCount; + private int ballCount; + public Result() { + this.strikeCount = 0; + this.ballCount = 0; + } + public Result(int strikeCount, int ballCount) { + this.strikeCount = strikeCount; + this.ballCount = ballCount; + } + + public boolean isThreeStrike() { + return strikeCount == 3; + } + + public boolean isNothing() { + return strikeCount == 0 && ballCount == 0; + } + + public int getStrikeCount() { + return strikeCount; + } + + public void setStrikeCount(int strikeCount) { + this.strikeCount = strikeCount; + } + + public int getBallCount() { + return ballCount; + } + + public void setBallCount(int ballCount) { + this.ballCount = ballCount; + } +} From 6f9cf8f32d2051975b261948636bf0329534e8ce Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Fri, 19 Feb 2021 04:51:44 +0900 Subject: [PATCH 14/42] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=88=AB=EC=9E=90=EC=99=80=20=EB=82=9C=EC=88=98=EB=A5=BC=20?= =?UTF-8?q?=EB=B9=84=EA=B5=90=ED=95=98=EB=8A=94=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=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/baseball/number/GameNumber.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/main/java/baseball/number/GameNumber.java b/src/main/java/baseball/number/GameNumber.java index 9b856c3..b721fa0 100644 --- a/src/main/java/baseball/number/GameNumber.java +++ b/src/main/java/baseball/number/GameNumber.java @@ -24,6 +24,28 @@ public GameNumber(String number) { public void compare(GameNumber userNumber, Result result) { + int strikeCount =0, ballCount = 0; + boolean[] digits = new boolean[10]; + String userValue = userNumber.getValue(); + + for (int index = 0; index < value.length(); index++) { + char userCharAtIndex = userValue.charAt(index); + if(userCharAtIndex == value.charAt(index)) { + strikeCount++; + continue; + } + + digits[userCharAtIndex] = true; + } + + for (char digit : userValue.toCharArray()) { + if (digits[digit]) { + ballCount++; + } + } + + result.setBallCount(ballCount); + result.setStrikeCount(strikeCount); } public static boolean validateNumber(int number) { From 58835efb67eabe92d3af38faae5e6209e0819482 Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Fri, 19 Feb 2021 05:08:14 +0900 Subject: [PATCH 15/42] =?UTF-8?q?fix:=20digits=20=EC=A0=91=EA=B7=BC=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before: - digits의 인덱스에 char 형으로 접근 - digits의 인덱스에 사용자 숫자를 마킹하고 볼 카운팅할때 사용자 숫자를 비교 After: - digits의 인덱스에 접근하기 전에 대응되는 int 값으로 변환 - digits의 인덱스에 컴퓨터 생성 난수의 숫자를 마킹하도록 변경 --- src/main/java/baseball/number/GameNumber.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/baseball/number/GameNumber.java b/src/main/java/baseball/number/GameNumber.java index b721fa0..473f86e 100644 --- a/src/main/java/baseball/number/GameNumber.java +++ b/src/main/java/baseball/number/GameNumber.java @@ -29,17 +29,19 @@ public void compare(GameNumber userNumber, Result result) { String userValue = userNumber.getValue(); for (int index = 0; index < value.length(); index++) { - char userCharAtIndex = userValue.charAt(index); - if(userCharAtIndex == value.charAt(index)) { + char seedCharAtIndex = value.charAt(index); + if(userValue.charAt(index) == seedCharAtIndex) { strikeCount++; continue; } - digits[userCharAtIndex] = true; + int seedCharIndex = Integer.parseInt(String.valueOf(seedCharAtIndex)); + digits[seedCharIndex] = true; } for (char digit : userValue.toCharArray()) { - if (digits[digit]) { + int digitIndex = Integer.parseInt(String.valueOf(digit)); + if (digits[digitIndex]) { ballCount++; } } From d252b821d21fcb2a596e68b63e7427f136f6581e Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Fri, 19 Feb 2021 05:24:35 +0900 Subject: [PATCH 16/42] =?UTF-8?q?test:=20=EB=B9=84=EA=B5=90=ED=95=98?= =?UTF-8?q?=EC=97=AC=20=EA=B2=B0=EA=B3=BC=20=EC=84=A4=EC=A0=95=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=AA=A8=EB=93=A0=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BC=80=EC=9D=B4=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 각 테스트 메서드 상황: - 노카운트 case - 1스트라이크 case - 1스트라이크 1볼 case - 1스트라이크 2볼 case - 2스트라이크 case - 3스트라이크 case --- .../java/baseball/number/GameNumberTest.java | 197 +++++++++++++++++- 1 file changed, 196 insertions(+), 1 deletion(-) diff --git a/src/test/java/baseball/number/GameNumberTest.java b/src/test/java/baseball/number/GameNumberTest.java index f676990..871d483 100644 --- a/src/test/java/baseball/number/GameNumberTest.java +++ b/src/test/java/baseball/number/GameNumberTest.java @@ -1,5 +1,6 @@ package baseball.number; +import baseball.result.Result; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; @@ -7,7 +8,201 @@ class GameNumberTest { @Test - void compare() { + void case_노카운트_검증() { + //given + final int TEST_CASE_NUM = 4; + GameNumber[] userNumbers = new GameNumber[TEST_CASE_NUM]; + GameNumber[] seedNumbers = new GameNumber[TEST_CASE_NUM]; + Result[] results = new Result[TEST_CASE_NUM]; + + userNumbers[0] = new GameNumber("123"); + seedNumbers[0] = new GameNumber("456"); + results[0] = new Result(); + + userNumbers[1] = new GameNumber("984"); + seedNumbers[1] = new GameNumber("712"); + results[1] = new Result(); + + userNumbers[2] = new GameNumber("921"); + seedNumbers[2] = new GameNumber("743"); + results[2] = new Result(); + + userNumbers[3] = new GameNumber("652"); + seedNumbers[3] = new GameNumber("981"); + results[3] = new Result(); + + for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { + //when + seedNumbers[testCase].compare(userNumbers[testCase], results[testCase]); + //then + assertEquals(results[testCase].getBallCount(), 0); + assertEquals(results[testCase].getStrikeCount(), 0); + } + } + + @Test + void case_1스트라이크_검증() { + //given + final int TEST_CASE_NUM = 4; + GameNumber[] userNumbers = new GameNumber[TEST_CASE_NUM]; + GameNumber[] seedNumbers = new GameNumber[TEST_CASE_NUM]; + Result[] results = new Result[TEST_CASE_NUM]; + + userNumbers[0] = new GameNumber("783"); + seedNumbers[0] = new GameNumber("582"); + results[0] = new Result(); + + userNumbers[1] = new GameNumber("987"); + seedNumbers[1] = new GameNumber("237"); + results[1] = new Result(); + + userNumbers[2] = new GameNumber("127"); + seedNumbers[2] = new GameNumber("597"); + results[2] = new Result(); + + userNumbers[3] = new GameNumber("386"); + seedNumbers[3] = new GameNumber("746"); + results[3] = new Result(); + + for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { + //when + seedNumbers[testCase].compare(userNumbers[testCase], results[testCase]); + //then + assertEquals(results[testCase].getBallCount(), 0); + assertEquals(results[testCase].getStrikeCount(), 1); + } + } + + @Test + void case_1스트라이크_1볼_검증() { + //given + final int TEST_CASE_NUM = 4; + GameNumber[] userNumbers = new GameNumber[TEST_CASE_NUM]; + GameNumber[] seedNumbers = new GameNumber[TEST_CASE_NUM]; + Result[] results = new Result[TEST_CASE_NUM]; + + userNumbers[0] = new GameNumber("783"); + seedNumbers[0] = new GameNumber("287"); + results[0] = new Result(); + + userNumbers[1] = new GameNumber("987"); + seedNumbers[1] = new GameNumber("497"); + results[1] = new Result(); + + userNumbers[2] = new GameNumber("127"); + seedNumbers[2] = new GameNumber("917"); + results[2] = new Result(); + + userNumbers[3] = new GameNumber("386"); + seedNumbers[3] = new GameNumber("236"); + results[3] = new Result(); + + for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { + //when + seedNumbers[testCase].compare(userNumbers[testCase], results[testCase]); + //then + assertEquals(results[testCase].getBallCount(), 1); + assertEquals(results[testCase].getStrikeCount(), 1); + } + } + + @Test + void case_1스트라이크_2볼_검증() { + //given + final int TEST_CASE_NUM = 4; + GameNumber[] userNumbers = new GameNumber[TEST_CASE_NUM]; + GameNumber[] seedNumbers = new GameNumber[TEST_CASE_NUM]; + Result[] results = new Result[TEST_CASE_NUM]; + + userNumbers[0] = new GameNumber("783"); + seedNumbers[0] = new GameNumber("387"); + results[0] = new Result(); + + userNumbers[1] = new GameNumber("987"); + seedNumbers[1] = new GameNumber("897"); + results[1] = new Result(); + + userNumbers[2] = new GameNumber("127"); + seedNumbers[2] = new GameNumber("217"); + results[2] = new Result(); + + userNumbers[3] = new GameNumber("386"); + seedNumbers[3] = new GameNumber("836"); + results[3] = new Result(); + + for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { + //when + seedNumbers[testCase].compare(userNumbers[testCase], results[testCase]); + //then + assertEquals(results[testCase].getBallCount(), 2); + assertEquals(results[testCase].getStrikeCount(), 1); + } + } + + @Test + void case_2스트라이크_검증() { + //given + final int TEST_CASE_NUM = 4; + GameNumber[] userNumbers = new GameNumber[TEST_CASE_NUM]; + GameNumber[] seedNumbers = new GameNumber[TEST_CASE_NUM]; + Result[] results = new Result[TEST_CASE_NUM]; + + userNumbers[0] = new GameNumber("783"); + seedNumbers[0] = new GameNumber("583"); + results[0] = new Result(); + + userNumbers[1] = new GameNumber("987"); + seedNumbers[1] = new GameNumber("287"); + results[1] = new Result(); + + userNumbers[2] = new GameNumber("127"); + seedNumbers[2] = new GameNumber("137"); + results[2] = new Result(); + + userNumbers[3] = new GameNumber("386"); + seedNumbers[3] = new GameNumber("382"); + results[3] = new Result(); + + for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { + //when + seedNumbers[testCase].compare(userNumbers[testCase], results[testCase]); + //then + assertEquals(results[testCase].getBallCount(), 0); + assertEquals(results[testCase].getStrikeCount(), 2); + } + } + + @Test + void case_3스트라이크_검증() { + //given + final int TEST_CASE_NUM = 4; + GameNumber[] userNumbers = new GameNumber[TEST_CASE_NUM]; + GameNumber[] seedNumbers = new GameNumber[TEST_CASE_NUM]; + Result[] results = new Result[TEST_CASE_NUM]; + + userNumbers[0] = new GameNumber("783"); + seedNumbers[0] = new GameNumber("783"); + results[0] = new Result(); + + userNumbers[1] = new GameNumber("987"); + seedNumbers[1] = new GameNumber("987"); + results[1] = new Result(); + + userNumbers[2] = new GameNumber("127"); + seedNumbers[2] = new GameNumber("127"); + results[2] = new Result(); + + userNumbers[3] = new GameNumber("386"); + seedNumbers[3] = new GameNumber("386"); + results[3] = new Result(); + + for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { + //when + seedNumbers[testCase].compare(userNumbers[testCase], results[testCase]); + //then + assertEquals(results[testCase].getBallCount(), 0); + assertEquals(results[testCase].getStrikeCount(), 3); + } } @Test From 8ed095f5f74f043f6ec1f89f19c0a3d1f3e47928 Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Fri, 19 Feb 2021 05:46:44 +0900 Subject: [PATCH 17/42] =?UTF-8?q?fix:=20=EC=B0=B8=EC=A1=B0=ED=98=95=20?= =?UTF-8?q?=EB=A7=A4=EA=B0=9C=EB=B3=80=EC=88=98=EC=9D=98=20=EB=84=90?= =?UTF-8?q?=EA=B0=92=20=EA=B2=80=EC=82=AC=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/baseball/GameManager.java | 11 ++++++++--- .../baseball/generator/RandomNumberGenerator.java | 2 ++ src/main/java/baseball/number/GameNumber.java | 5 +++++ .../java/baseball/receiver/ConsoleInputReceiver.java | 3 +++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index d756771..933e637 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -13,10 +13,13 @@ public class GameManager { private final Printer printer; private final InputReceiver receiver; - private GameNumber seedNumber; - private GameNumber userNumber; + private final GameNumber seedNumber; + private final GameNumber userNumber; public GameManager(Scanner scanner) { + if(scanner == null) + throw new NullPointerException(); + printer = new ConsolePrinter(); receiver = new ConsoleInputReceiver(scanner); seedNumber = new GameNumber(); @@ -42,8 +45,10 @@ private void startGame(Result result) { while(result.isThreeStrike()) { boolean isValidInput = false; + isValidInput = receiveUserInput(); - if(isValidInput) continue; + if(!isValidInput) continue; + seedNumber.compare(userNumber, result); printer.printResult(result); } diff --git a/src/main/java/baseball/generator/RandomNumberGenerator.java b/src/main/java/baseball/generator/RandomNumberGenerator.java index a247156..63de7c8 100644 --- a/src/main/java/baseball/generator/RandomNumberGenerator.java +++ b/src/main/java/baseball/generator/RandomNumberGenerator.java @@ -6,6 +6,8 @@ public class RandomNumberGenerator { public static void generate(GameNumber seedNumber) { + if(seedNumber == null) + throw new NullPointerException(); int newSeed = 0; for (int exponent = 0; exponent < 3; exponent++) { diff --git a/src/main/java/baseball/number/GameNumber.java b/src/main/java/baseball/number/GameNumber.java index 473f86e..330de4a 100644 --- a/src/main/java/baseball/number/GameNumber.java +++ b/src/main/java/baseball/number/GameNumber.java @@ -23,6 +23,11 @@ public GameNumber(String number) { } public void compare(GameNumber userNumber, Result result) { + if(userNumber == null) + throw new NullPointerException(); + + if(result == null) + throw new NullPointerException(); int strikeCount =0, ballCount = 0; boolean[] digits = new boolean[10]; diff --git a/src/main/java/baseball/receiver/ConsoleInputReceiver.java b/src/main/java/baseball/receiver/ConsoleInputReceiver.java index 6af5628..c94e910 100644 --- a/src/main/java/baseball/receiver/ConsoleInputReceiver.java +++ b/src/main/java/baseball/receiver/ConsoleInputReceiver.java @@ -31,6 +31,9 @@ public boolean checkContinueGame() { @Override public void receiveUserNumber(GameNumber userNumber) throws IllegalArgumentException { + if(userNumber == null) + throw new NullPointerException(); + int number = receiveInputByIntAndClean(); if(!GameNumber.validateNumber(number)) throw new IllegalArgumentException(); From 52121bef39df6ba2d4f8101660c02888fb8fb1bd Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Fri, 19 Feb 2021 05:58:56 +0900 Subject: [PATCH 18/42] =?UTF-8?q?fix:=20=EA=B2=8C=EC=9E=84=EB=82=B4=20?= =?UTF-8?q?=EC=88=AB=EC=9E=90=20=EA=B2=80=EC=A6=9D=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0은 입력값이 될 수 없음 - integerDigit이 0일 경우 false 반환 --- src/main/java/baseball/number/GameNumber.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/baseball/number/GameNumber.java b/src/main/java/baseball/number/GameNumber.java index 330de4a..8c41798 100644 --- a/src/main/java/baseball/number/GameNumber.java +++ b/src/main/java/baseball/number/GameNumber.java @@ -65,6 +65,7 @@ public static boolean validateNumber(int number) { for (char digit : strNumber.toCharArray()) { int integerDigit = Integer.parseInt(String.valueOf(digit)); + if (integerDigit == 0) return false; if (!digits[integerDigit]) { digits[integerDigit] = true; continue; From 6dde9e5de2e5f35ea9e699db0112ff51ad5386d6 Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Fri, 19 Feb 2021 09:24:26 +0900 Subject: [PATCH 19/42] =?UTF-8?q?fix:=20Scanner=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=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 InputMismatchException 예외 처리 추가 - InputMismatchException은 IllegalArumentException의 자식이 아닌 RuntimeException의 자식 클래스 --- src/main/java/baseball/GameManager.java | 3 ++- src/main/java/baseball/receiver/ConsoleInputReceiver.java | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index 933e637..16ca807 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -8,6 +8,7 @@ import baseball.printer.Printer; import baseball.result.Result; +import java.util.InputMismatchException; import java.util.Scanner; public class GameManager { @@ -58,7 +59,7 @@ private boolean receiveUserInput() { try { printer.requestUserNumber(); receiver.receiveUserNumber(userNumber); - } catch (IllegalArgumentException e) { + } catch (IllegalArgumentException | InputMismatchException e) { printer.warnInvalidInput(); return false; } diff --git a/src/main/java/baseball/receiver/ConsoleInputReceiver.java b/src/main/java/baseball/receiver/ConsoleInputReceiver.java index c94e910..9f8bc03 100644 --- a/src/main/java/baseball/receiver/ConsoleInputReceiver.java +++ b/src/main/java/baseball/receiver/ConsoleInputReceiver.java @@ -2,6 +2,7 @@ import baseball.number.GameNumber; +import java.util.InputMismatchException; import java.util.Scanner; public class ConsoleInputReceiver implements InputReceiver { @@ -24,13 +25,17 @@ public boolean checkContinueGame() { cleanScannerBuffer(); System.out.println("잘못된 입력입니다. 다시 입력해주세요."); return checkContinueGame(); + } catch (InputMismatchException e) { + cleanScannerBuffer(); + System.out.println("잘못된 입력입니다. 숫자만 입력해주세요."); + return checkContinueGame(); } return select == START_GAME; } @Override - public void receiveUserNumber(GameNumber userNumber) throws IllegalArgumentException { + public void receiveUserNumber(GameNumber userNumber) throws IllegalArgumentException, InputMismatchException { if(userNumber == null) throw new NullPointerException(); From c0f94c932932f5fef4ff1a4cf3ac100b5f27c7dc Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Fri, 19 Feb 2021 09:26:42 +0900 Subject: [PATCH 20/42] =?UTF-8?q?fix:=20root=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EC=97=90=20NullPointerException=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - try~catch 구문 추가 - scanner는 항상 close 할 수 있도록 try-with-resources로 변경 --- src/main/java/baseball/Application.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index c23f488..2a6f709 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -1,15 +1,14 @@ package baseball; -import utils.RandomUtils; - import java.util.Scanner; public class Application { public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - // TODO 구현 진행 - - GameManager manager = new GameManager(scanner); - manager.run(); + try (Scanner scanner = new Scanner(System.in)) { + GameManager manager = new GameManager(scanner); + manager.run(); + } catch (NullPointerException e) { + System.out.println(e.getMessage()); + } } } From 098f663ed39d1f6bf72012a7ef17480e0919f446 Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Fri, 19 Feb 2021 09:35:40 +0900 Subject: [PATCH 21/42] =?UTF-8?q?fix:=20=EA=B2=8C=EC=9E=84=20=EC=8B=9C?= =?UTF-8?q?=EC=9E=91/=EC=A2=85=EB=A3=8C=20=EC=A1=B0=EA=B1=B4=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before: - result.isThreeStrike 로 3스트라이크인 경우에만 게임을 시작하는 버그 발생 After: - !result.isThreeStrike 로 변경 --- src/main/java/baseball/GameManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index 16ca807..fc24d53 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -44,7 +44,7 @@ public void run() { private void startGame(Result result) { - while(result.isThreeStrike()) { + while(!result.isThreeStrike()) { boolean isValidInput = false; isValidInput = receiveUserInput(); From 40d4fb757a97bab2fed938a988cf1dfb65efd8b6 Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Fri, 19 Feb 2021 10:11:15 +0900 Subject: [PATCH 22/42] =?UTF-8?q?fix:=20=EC=B6=9C=EB=A0=A5=20=EC=96=91?= =?UTF-8?q?=EC=8B=9D=EC=97=90=20=EB=A7=9E=EC=B6=B0=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=EB=AC=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 게임 승리 알림 - 숫자 입력 요청에 개행 x - 결과 출력에 개행 --- src/main/java/baseball/GameManager.java | 2 ++ src/main/java/baseball/printer/ConsolePrinter.java | 8 +++++++- src/main/java/baseball/printer/Printer.java | 2 ++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index fc24d53..e3218c5 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -37,6 +37,8 @@ public void run() { while(continueGame) { RandomNumberGenerator.generate(seedNumber); startGame(result); + + printer.noticeWin(); printer.askStartGame(); continueGame = receiver.checkContinueGame(); } diff --git a/src/main/java/baseball/printer/ConsolePrinter.java b/src/main/java/baseball/printer/ConsolePrinter.java index a4ac7eb..7ec6f82 100644 --- a/src/main/java/baseball/printer/ConsolePrinter.java +++ b/src/main/java/baseball/printer/ConsolePrinter.java @@ -17,7 +17,7 @@ public void askStartGame() { @Override public void requestUserNumber() { - System.out.println("숫자를 입렧해주세요 : "); + System.out.print("숫자를 입렧해주세요 : "); } @Override @@ -38,5 +38,11 @@ public void printResult(Result result) { if(result.getStrikeCount() != 0) System.out.print(result.getStrikeCount() + "스트라이크"); + System.out.println(); + } + + @Override + public void noticeWin() { + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); } } diff --git a/src/main/java/baseball/printer/Printer.java b/src/main/java/baseball/printer/Printer.java index c141297..9a78225 100644 --- a/src/main/java/baseball/printer/Printer.java +++ b/src/main/java/baseball/printer/Printer.java @@ -12,4 +12,6 @@ public interface Printer { void warnInvalidInput(); void printResult(Result result); + + void noticeWin(); } From 0ca42fcf6636a3d0bce1f7b34e218aa734cb2edc Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Fri, 19 Feb 2021 10:17:23 +0900 Subject: [PATCH 23/42] =?UTF-8?q?fix:=20=EC=9E=85=EB=A0=A5=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=EC=8B=9C=20=ED=95=9C=EB=B2=88=20=EB=8D=94=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=EC=9D=84=20=EB=B0=9B=EC=95=84=EC=95=BC=20=EC=A0=95?= =?UTF-8?q?=EC=83=81=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EC=9E=91=EB=8F=99?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before: - hasNext와 nextLine의 혼용 - 예외 발생시 버퍼 비우기를 두번 실행, 여러번 입력을 기다림 After: - haNext -> hasNextLine - receiveInputByIntAndClean 메서드를 지우고 scanner.nextInt로 축소 --- .../java/baseball/receiver/ConsoleInputReceiver.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/main/java/baseball/receiver/ConsoleInputReceiver.java b/src/main/java/baseball/receiver/ConsoleInputReceiver.java index 9f8bc03..04b75d3 100644 --- a/src/main/java/baseball/receiver/ConsoleInputReceiver.java +++ b/src/main/java/baseball/receiver/ConsoleInputReceiver.java @@ -19,10 +19,9 @@ public boolean checkContinueGame() { int select = 0; try { - select = receiveInputByIntAndClean(); + select = scanner.nextInt(); throwIfInputIsNotOneOrTwo(select); } catch (IllegalArgumentException exception) { - cleanScannerBuffer(); System.out.println("잘못된 입력입니다. 다시 입력해주세요."); return checkContinueGame(); } catch (InputMismatchException e) { @@ -39,20 +38,15 @@ public void receiveUserNumber(GameNumber userNumber) throws IllegalArgumentExce if(userNumber == null) throw new NullPointerException(); - int number = receiveInputByIntAndClean(); + int number = scanner.nextInt(); if(!GameNumber.validateNumber(number)) throw new IllegalArgumentException(); userNumber.setValue(Integer.toString(number)); } - private int receiveInputByIntAndClean() { - int input = scanner.nextInt(); - cleanScannerBuffer(); - return input; - } private void cleanScannerBuffer() { - if(scanner.hasNext()) + if(scanner.hasNextLine()) scanner.nextLine(); } From f657de3d015ee8b414e52f3cf0038e75756586a6 Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Fri, 19 Feb 2021 10:22:12 +0900 Subject: [PATCH 24/42] =?UTF-8?q?fix:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EB=B0=9B=EB=8A=94=20=EB=8F=84=EC=A4=91=20?= =?UTF-8?q?=EB=B9=84=EC=A0=95=EC=83=81=20=EC=9E=85=EB=A0=A5=20=EB=B0=9C?= =?UTF-8?q?=EC=83=9D=EC=8B=9C=20=EB=AC=B4=ED=95=9C=20=EB=A3=A8=ED=94=84?= =?UTF-8?q?=EB=A5=BC=20=EB=8F=84=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit class GameManager: - 예외 처리문에 버퍼 비우기가 실행되지 않음 - 입력 관련 메서드는 InputReceiver가 하기 때문에 버퍼 비우기를 InputReceiver에게 위임 interface InputReceiver: - 인터페이스에 dealWithExceptionalInput 메서드 추가 class ConsoleInputReceiver - dealWithExceptionalInput 메서드는 ConsoleInputReceiver 구현체에서 cleanScannerBuffer에게 위임 --- src/main/java/baseball/GameManager.java | 1 + src/main/java/baseball/receiver/ConsoleInputReceiver.java | 4 ++++ src/main/java/baseball/receiver/InputReceiver.java | 2 ++ 3 files changed, 7 insertions(+) diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index e3218c5..b3b5c0f 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -62,6 +62,7 @@ private boolean receiveUserInput() { printer.requestUserNumber(); receiver.receiveUserNumber(userNumber); } catch (IllegalArgumentException | InputMismatchException e) { + receiver.dealWithExceptionalInput(); printer.warnInvalidInput(); return false; } diff --git a/src/main/java/baseball/receiver/ConsoleInputReceiver.java b/src/main/java/baseball/receiver/ConsoleInputReceiver.java index 04b75d3..7fa4eb2 100644 --- a/src/main/java/baseball/receiver/ConsoleInputReceiver.java +++ b/src/main/java/baseball/receiver/ConsoleInputReceiver.java @@ -44,6 +44,10 @@ public void receiveUserNumber(GameNumber userNumber) throws IllegalArgumentExce userNumber.setValue(Integer.toString(number)); } + @Override + public void dealWithExceptionalInput() { + cleanScannerBuffer(); + } private void cleanScannerBuffer() { if(scanner.hasNextLine()) diff --git a/src/main/java/baseball/receiver/InputReceiver.java b/src/main/java/baseball/receiver/InputReceiver.java index b2e292c..4f59cae 100644 --- a/src/main/java/baseball/receiver/InputReceiver.java +++ b/src/main/java/baseball/receiver/InputReceiver.java @@ -7,4 +7,6 @@ public interface InputReceiver { boolean checkContinueGame(); void receiveUserNumber(GameNumber userNumber); + + void dealWithExceptionalInput(); } From eac391e67bd644572dd8ed07060ca06e9d80cf08 Mon Sep 17 00:00:00 2001 From: pkalsh <42990709+pkalsh@users.noreply.github.com> Date: Mon, 22 Feb 2021 14:28:04 +0900 Subject: [PATCH 25/42] Update src/main/java/baseball/GameManager.java Co-authored-by: Gyeongjun Kim --- src/main/java/baseball/GameManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index b3b5c0f..ee9e959 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -29,7 +29,7 @@ public GameManager(Scanner scanner) { public void run() { Result result = new Result(); - boolean continueGame = true; + boolean continueGame; printer.greet(); printer.askStartGame(); From 38297df2c74cd43e5a575b194e42be544c174ced Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Mon, 22 Feb 2021 14:23:16 +0900 Subject: [PATCH 26/42] =?UTF-8?q?style:=20=EC=A4=91=EA=B4=84=ED=98=B8+?= =?UTF-8?q?=EA=B3=B5=EB=B0=B1=EC=82=BD=EC=9E=85=20=EC=BB=A8=EB=B2=A4?= =?UTF-8?q?=EC=85=98=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/GameManager.java | 7 +++++-- .../generator/RandomNumberGenerator.java | 3 ++- src/main/java/baseball/number/GameNumber.java | 18 +++++++++++------- .../java/baseball/printer/ConsolePrinter.java | 6 ++++-- .../receiver/ConsoleInputReceiver.java | 12 ++++++++---- 5 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index ee9e959..e5f2ce0 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -18,8 +18,9 @@ public class GameManager { private final GameNumber userNumber; public GameManager(Scanner scanner) { - if(scanner == null) + if(scanner == null) { throw new NullPointerException(); + } printer = new ConsolePrinter(); receiver = new ConsoleInputReceiver(scanner); @@ -50,7 +51,9 @@ private void startGame(Result result) { boolean isValidInput = false; isValidInput = receiveUserInput(); - if(!isValidInput) continue; + if(!isValidInput) { + continue; + } seedNumber.compare(userNumber, result); printer.printResult(result); diff --git a/src/main/java/baseball/generator/RandomNumberGenerator.java b/src/main/java/baseball/generator/RandomNumberGenerator.java index 63de7c8..124b5eb 100644 --- a/src/main/java/baseball/generator/RandomNumberGenerator.java +++ b/src/main/java/baseball/generator/RandomNumberGenerator.java @@ -6,8 +6,9 @@ public class RandomNumberGenerator { public static void generate(GameNumber seedNumber) { - if(seedNumber == null) + if(seedNumber == null) { throw new NullPointerException(); + } int newSeed = 0; for (int exponent = 0; exponent < 3; exponent++) { diff --git a/src/main/java/baseball/number/GameNumber.java b/src/main/java/baseball/number/GameNumber.java index 8c41798..6c49fcd 100644 --- a/src/main/java/baseball/number/GameNumber.java +++ b/src/main/java/baseball/number/GameNumber.java @@ -17,18 +17,20 @@ public GameNumber() { value = ""; } public GameNumber(String number) { - if(!validateNumber(Integer.parseInt(number))) + if(!validateNumber(Integer.parseInt(number))) { throw new IllegalArgumentException(); + } this.value = number; } public void compare(GameNumber userNumber, Result result) { - if(userNumber == null) + if(userNumber == null) { throw new NullPointerException(); + } - if(result == null) + if(result == null) { throw new NullPointerException(); - + } int strikeCount =0, ballCount = 0; boolean[] digits = new boolean[10]; String userValue = userNumber.getValue(); @@ -56,8 +58,9 @@ public void compare(GameNumber userNumber, Result result) { } public static boolean validateNumber(int number) { - if(number <= 122 || number >=988) + if(number <= 122 || number >=988) { return false; + } boolean[] digits = new boolean[10]; String strNumber = Integer.toString(number); @@ -65,12 +68,13 @@ public static boolean validateNumber(int number) { for (char digit : strNumber.toCharArray()) { int integerDigit = Integer.parseInt(String.valueOf(digit)); - if (integerDigit == 0) return false; + if (integerDigit == 0) { + return false; + } if (!digits[integerDigit]) { digits[integerDigit] = true; continue; } - return false; } diff --git a/src/main/java/baseball/printer/ConsolePrinter.java b/src/main/java/baseball/printer/ConsolePrinter.java index 7ec6f82..5afcee5 100644 --- a/src/main/java/baseball/printer/ConsolePrinter.java +++ b/src/main/java/baseball/printer/ConsolePrinter.java @@ -33,11 +33,13 @@ public void printResult(Result result) { return ; } - if(result.getBallCount() != 0) + if(result.getBallCount() != 0) { System.out.print(result.getBallCount() + "볼 "); + } - if(result.getStrikeCount() != 0) + if(result.getStrikeCount() != 0) { System.out.print(result.getStrikeCount() + "스트라이크"); + } System.out.println(); } diff --git a/src/main/java/baseball/receiver/ConsoleInputReceiver.java b/src/main/java/baseball/receiver/ConsoleInputReceiver.java index 7fa4eb2..afdcfa4 100644 --- a/src/main/java/baseball/receiver/ConsoleInputReceiver.java +++ b/src/main/java/baseball/receiver/ConsoleInputReceiver.java @@ -35,12 +35,14 @@ public boolean checkContinueGame() { @Override public void receiveUserNumber(GameNumber userNumber) throws IllegalArgumentException, InputMismatchException { - if(userNumber == null) + if(userNumber == null) { throw new NullPointerException(); + } int number = scanner.nextInt(); - if(!GameNumber.validateNumber(number)) + if(!GameNumber.validateNumber(number)) { throw new IllegalArgumentException(); + } userNumber.setValue(Integer.toString(number)); } @@ -50,12 +52,14 @@ public void dealWithExceptionalInput() { } private void cleanScannerBuffer() { - if(scanner.hasNextLine()) + if(scanner.hasNextLine()) { scanner.nextLine(); + } } private void throwIfInputIsNotOneOrTwo(int select) { - if(select != 1 && select != 2) + if(select != 1 && select != 2) { throw new IllegalArgumentException(); + } } } From 02816f93d255832898e4392a7560202ceb14b8d6 Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Mon, 22 Feb 2021 14:27:31 +0900 Subject: [PATCH 27/42] =?UTF-8?q?style:=20[=EC=A0=9C=EC=96=B4=EB=AC=B8=20?= =?UTF-8?q?=ED=82=A4=EC=9B=8C=EB=93=9C=EC=99=80=20=EC=97=AC=EB=8A=94=20?= =?UTF-8?q?=EC=86=8C=EA=B4=84=ED=98=B8=20=EC=82=AC=EC=9D=B4=EC=97=90=20?= =?UTF-8?q?=EA=B3=B5=EB=B0=B1=20=EC=82=BD=EC=9E=85]=20=EC=BB=A8=EB=B2=A4?= =?UTF-8?q?=EC=85=98=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 네이버 핵데이 Java 코딩 컨벤션 #8.4 --- src/main/java/baseball/GameManager.java | 6 +++--- .../java/baseball/generator/RandomNumberGenerator.java | 4 ++-- src/main/java/baseball/number/GameNumber.java | 10 +++++----- src/main/java/baseball/printer/ConsolePrinter.java | 6 +++--- .../java/baseball/receiver/ConsoleInputReceiver.java | 6 +++--- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index e5f2ce0..720d2c5 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -35,7 +35,7 @@ public void run() { printer.greet(); printer.askStartGame(); continueGame = receiver.checkContinueGame(); - while(continueGame) { + while (continueGame) { RandomNumberGenerator.generate(seedNumber); startGame(result); @@ -47,11 +47,11 @@ public void run() { private void startGame(Result result) { - while(!result.isThreeStrike()) { + while (!result.isThreeStrike()) { boolean isValidInput = false; isValidInput = receiveUserInput(); - if(!isValidInput) { + if (!isValidInput) { continue; } diff --git a/src/main/java/baseball/generator/RandomNumberGenerator.java b/src/main/java/baseball/generator/RandomNumberGenerator.java index 124b5eb..211c6cc 100644 --- a/src/main/java/baseball/generator/RandomNumberGenerator.java +++ b/src/main/java/baseball/generator/RandomNumberGenerator.java @@ -6,7 +6,7 @@ public class RandomNumberGenerator { public static void generate(GameNumber seedNumber) { - if(seedNumber == null) { + if (seedNumber == null) { throw new NullPointerException(); } @@ -16,7 +16,7 @@ public static void generate(GameNumber seedNumber) { newSeed += (Math.pow(10.0, exponent) * randomDigit); } - if(!GameNumber.validateNumber(newSeed)){ + if (!GameNumber.validateNumber(newSeed)){ generate(seedNumber); return ; } diff --git a/src/main/java/baseball/number/GameNumber.java b/src/main/java/baseball/number/GameNumber.java index 6c49fcd..42230ea 100644 --- a/src/main/java/baseball/number/GameNumber.java +++ b/src/main/java/baseball/number/GameNumber.java @@ -17,18 +17,18 @@ public GameNumber() { value = ""; } public GameNumber(String number) { - if(!validateNumber(Integer.parseInt(number))) { + if (!validateNumber(Integer.parseInt(number))) { throw new IllegalArgumentException(); } this.value = number; } public void compare(GameNumber userNumber, Result result) { - if(userNumber == null) { + if (userNumber == null) { throw new NullPointerException(); } - if(result == null) { + if (result == null) { throw new NullPointerException(); } int strikeCount =0, ballCount = 0; @@ -37,7 +37,7 @@ public void compare(GameNumber userNumber, Result result) { for (int index = 0; index < value.length(); index++) { char seedCharAtIndex = value.charAt(index); - if(userValue.charAt(index) == seedCharAtIndex) { + if (userValue.charAt(index) == seedCharAtIndex) { strikeCount++; continue; } @@ -58,7 +58,7 @@ public void compare(GameNumber userNumber, Result result) { } public static boolean validateNumber(int number) { - if(number <= 122 || number >=988) { + if (number <= 122 || number >=988) { return false; } diff --git a/src/main/java/baseball/printer/ConsolePrinter.java b/src/main/java/baseball/printer/ConsolePrinter.java index 5afcee5..db7e255 100644 --- a/src/main/java/baseball/printer/ConsolePrinter.java +++ b/src/main/java/baseball/printer/ConsolePrinter.java @@ -28,16 +28,16 @@ public void warnInvalidInput() { @Override public void printResult(Result result) { - if(result.isNothing()) { + if (result.isNothing()) { System.out.println("낫싱"); return ; } - if(result.getBallCount() != 0) { + if (result.getBallCount() != 0) { System.out.print(result.getBallCount() + "볼 "); } - if(result.getStrikeCount() != 0) { + if (result.getStrikeCount() != 0) { System.out.print(result.getStrikeCount() + "스트라이크"); } System.out.println(); diff --git a/src/main/java/baseball/receiver/ConsoleInputReceiver.java b/src/main/java/baseball/receiver/ConsoleInputReceiver.java index afdcfa4..ecf8cc3 100644 --- a/src/main/java/baseball/receiver/ConsoleInputReceiver.java +++ b/src/main/java/baseball/receiver/ConsoleInputReceiver.java @@ -35,12 +35,12 @@ public boolean checkContinueGame() { @Override public void receiveUserNumber(GameNumber userNumber) throws IllegalArgumentException, InputMismatchException { - if(userNumber == null) { + if (userNumber == null) { throw new NullPointerException(); } int number = scanner.nextInt(); - if(!GameNumber.validateNumber(number)) { + if (!GameNumber.validateNumber(number)) { throw new IllegalArgumentException(); } userNumber.setValue(Integer.toString(number)); @@ -52,7 +52,7 @@ public void dealWithExceptionalInput() { } private void cleanScannerBuffer() { - if(scanner.hasNextLine()) { + if (scanner.hasNextLine()) { scanner.nextLine(); } } From e3a49c37e82313c025187090e52f5d5ee7083b6c Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Mon, 22 Feb 2021 14:42:23 +0900 Subject: [PATCH 28/42] =?UTF-8?q?style:=20=EB=AA=85=EC=8B=9C=EC=A0=81=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=20=EC=B4=88=EA=B8=B0=ED=99=94=20=EB=B6=88?= =?UTF-8?q?=ED=95=84=EC=9A=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/GameManager.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index 720d2c5..62d8824 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -31,14 +31,13 @@ public GameManager(Scanner scanner) { public void run() { Result result = new Result(); boolean continueGame; - printer.greet(); printer.askStartGame(); continueGame = receiver.checkContinueGame(); + while (continueGame) { RandomNumberGenerator.generate(seedNumber); startGame(result); - printer.noticeWin(); printer.askStartGame(); continueGame = receiver.checkContinueGame(); @@ -46,15 +45,12 @@ public void run() { } private void startGame(Result result) { - while (!result.isThreeStrike()) { - boolean isValidInput = false; - + boolean isValidInput; isValidInput = receiveUserInput(); if (!isValidInput) { continue; } - seedNumber.compare(userNumber, result); printer.printResult(result); } From 24372663e8c43efea043b4a4db4dc295db9f7172 Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Mon, 22 Feb 2021 14:43:17 +0900 Subject: [PATCH 29/42] =?UTF-8?q?style:=20=EC=83=81=EC=88=98=EC=9D=98=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=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/baseball/receiver/ConsoleInputReceiver.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/baseball/receiver/ConsoleInputReceiver.java b/src/main/java/baseball/receiver/ConsoleInputReceiver.java index ecf8cc3..ffa4d0c 100644 --- a/src/main/java/baseball/receiver/ConsoleInputReceiver.java +++ b/src/main/java/baseball/receiver/ConsoleInputReceiver.java @@ -3,12 +3,13 @@ import baseball.number.GameNumber; import java.util.InputMismatchException; +import java.util.Objects; import java.util.Scanner; public class ConsoleInputReceiver implements InputReceiver { + private final int START_GAME = 1; private final Scanner scanner; - private final int START_GAME = 1; public ConsoleInputReceiver(Scanner scanner) { this.scanner = scanner; From f47285cec4561332b63ed1d71ac0e85ae3a48b41 Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Mon, 22 Feb 2021 17:23:01 +0900 Subject: [PATCH 30/42] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EB=82=B4=20=EC=88=AB=EC=9E=90=EB=A5=BC=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=ED=95=98=EA=B3=A0=20=EC=9E=85=EB=A0=A5=EB=B0=9B=EB=8A=94=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=EC=97=90=EC=84=9C=20GameNumber=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=EB=A5=BC=20=EC=83=9D=EC=84=B1=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=B0=A9=EB=B2=95=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit class GameNumber: Before: - 생성자로 인스턴스를 생성하였다. - 외부에서 GameNumber 객체를 얻기 위해서는 생성자를 호출해야 한다. After: - 정적 팩토리 메소드 패턴을 적용해 외부에서 GameNumber 객체를 얻기 위해서는 명시적인 팩토리 메소드를 호출해야 한다. - 생성자는 private으로 한정하여 외부에 노출시키지 않았다. class ConsoleInputReceiver: Before: - 매개변수로 GameNumber 객체 userNumber를 받아왔다. - GameNumber라는 외부 객체의 내부 상태를 설정해주고 있다. After: - 매개변수로 어떤 객체도 받고 있지 않다. - GameNumber의 정적 팩토리 메소드를 이용해 GameNumber 객체를 반환한다. - 외부 객체의 내부 상태를 변경하는 것이 아닌 새로운 객체를 생성하고 있다. class RandomnumberGenerator Before: - 매개변수로 GameNumber 객체 seedNumber를 받아온다. - GameNumber라는 외부 객체의 내부 상태를 설정해주고 있다. After: - 난수를 담은 새로운 객체를 생성해 반환한다. class GameManager, GameNumberTest: 새로운 객체 생성 방식에 맞게 코드 수정 class --- src/main/java/baseball/GameManager.java | 15 ++- .../generator/RandomNumberGenerator.java | 12 +-- src/main/java/baseball/number/GameNumber.java | 20 ++-- .../receiver/ConsoleInputReceiver.java | 9 +- .../java/baseball/receiver/InputReceiver.java | 2 +- .../generator/RandomNumberGeneratorTest.java | 4 +- .../java/baseball/number/GameNumberTest.java | 96 +++++++++---------- 7 files changed, 72 insertions(+), 86 deletions(-) diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index 62d8824..7aff150 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -14,8 +14,8 @@ public class GameManager { private final Printer printer; private final InputReceiver receiver; - private final GameNumber seedNumber; - private final GameNumber userNumber; + private GameNumber seedNumber; + private GameNumber userNumber; public GameManager(Scanner scanner) { if(scanner == null) { @@ -24,19 +24,18 @@ public GameManager(Scanner scanner) { printer = new ConsolePrinter(); receiver = new ConsoleInputReceiver(scanner); - seedNumber = new GameNumber(); - userNumber = new GameNumber(); } public void run() { Result result = new Result(); boolean continueGame; + printer.greet(); printer.askStartGame(); continueGame = receiver.checkContinueGame(); while (continueGame) { - RandomNumberGenerator.generate(seedNumber); + seedNumber = RandomNumberGenerator.generate(); startGame(result); printer.noticeWin(); printer.askStartGame(); @@ -46,8 +45,8 @@ public void run() { private void startGame(Result result) { while (!result.isThreeStrike()) { - boolean isValidInput; - isValidInput = receiveUserInput(); + boolean isValidInput = receiveUserInput(); + if (!isValidInput) { continue; } @@ -59,7 +58,7 @@ private void startGame(Result result) { private boolean receiveUserInput() { try { printer.requestUserNumber(); - receiver.receiveUserNumber(userNumber); + userNumber = receiver.receiveUserNumber(); } catch (IllegalArgumentException | InputMismatchException e) { receiver.dealWithExceptionalInput(); printer.warnInvalidInput(); diff --git a/src/main/java/baseball/generator/RandomNumberGenerator.java b/src/main/java/baseball/generator/RandomNumberGenerator.java index 211c6cc..3e1695f 100644 --- a/src/main/java/baseball/generator/RandomNumberGenerator.java +++ b/src/main/java/baseball/generator/RandomNumberGenerator.java @@ -5,22 +5,18 @@ public class RandomNumberGenerator { - public static void generate(GameNumber seedNumber) { - if (seedNumber == null) { - throw new NullPointerException(); - } - + public static GameNumber generate() { int newSeed = 0; + for (int exponent = 0; exponent < 3; exponent++) { int randomDigit = RandomUtils.nextInt(1, 9); newSeed += (Math.pow(10.0, exponent) * randomDigit); } if (!GameNumber.validateNumber(newSeed)){ - generate(seedNumber); - return ; + return generate(); } - seedNumber.setValue(Integer.toString(newSeed)); + return GameNumber.from(String.valueOf(newSeed)); } } diff --git a/src/main/java/baseball/number/GameNumber.java b/src/main/java/baseball/number/GameNumber.java index 42230ea..02fae13 100644 --- a/src/main/java/baseball/number/GameNumber.java +++ b/src/main/java/baseball/number/GameNumber.java @@ -4,23 +4,15 @@ public class GameNumber { private String value; - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; + private GameNumber(String number) { + value = number; } - public GameNumber() { - value = ""; - } - public GameNumber(String number) { + public static GameNumber from(String number) { if (!validateNumber(Integer.parseInt(number))) { throw new IllegalArgumentException(); } - this.value = number; + return new GameNumber(number); } public void compare(GameNumber userNumber, Result result) { @@ -80,4 +72,8 @@ public static boolean validateNumber(int number) { return true; } + + public String getValue() { + return value; + } } diff --git a/src/main/java/baseball/receiver/ConsoleInputReceiver.java b/src/main/java/baseball/receiver/ConsoleInputReceiver.java index ffa4d0c..f08bc98 100644 --- a/src/main/java/baseball/receiver/ConsoleInputReceiver.java +++ b/src/main/java/baseball/receiver/ConsoleInputReceiver.java @@ -3,7 +3,6 @@ import baseball.number.GameNumber; import java.util.InputMismatchException; -import java.util.Objects; import java.util.Scanner; public class ConsoleInputReceiver implements InputReceiver { @@ -35,16 +34,12 @@ public boolean checkContinueGame() { } @Override - public void receiveUserNumber(GameNumber userNumber) throws IllegalArgumentException, InputMismatchException { - if (userNumber == null) { - throw new NullPointerException(); - } - + public GameNumber receiveUserNumber() throws IllegalArgumentException, InputMismatchException { int number = scanner.nextInt(); if (!GameNumber.validateNumber(number)) { throw new IllegalArgumentException(); } - userNumber.setValue(Integer.toString(number)); + return GameNumber.from(Integer.toString(number)); } @Override diff --git a/src/main/java/baseball/receiver/InputReceiver.java b/src/main/java/baseball/receiver/InputReceiver.java index 4f59cae..c6a0c44 100644 --- a/src/main/java/baseball/receiver/InputReceiver.java +++ b/src/main/java/baseball/receiver/InputReceiver.java @@ -6,7 +6,7 @@ public interface InputReceiver { boolean checkContinueGame(); - void receiveUserNumber(GameNumber userNumber); + GameNumber receiveUserNumber(); void dealWithExceptionalInput(); } diff --git a/src/test/java/baseball/generator/RandomNumberGeneratorTest.java b/src/test/java/baseball/generator/RandomNumberGeneratorTest.java index f825397..0da4412 100644 --- a/src/test/java/baseball/generator/RandomNumberGeneratorTest.java +++ b/src/test/java/baseball/generator/RandomNumberGeneratorTest.java @@ -10,11 +10,11 @@ class RandomNumberGeneratorTest { @Test void 생성된_난수가_게임_숫자_생성규칙에_부합하는지_100회_검증() { - GameNumber randomNumber = new GameNumber(); + GameNumber randomNumber; for (int loop = 0; loop < 100; loop++) { //given - RandomNumberGenerator.generate(randomNumber); + randomNumber = RandomNumberGenerator.generate(); int integerRandomNumber = Integer.parseInt(randomNumber.getValue()); //when, then diff --git a/src/test/java/baseball/number/GameNumberTest.java b/src/test/java/baseball/number/GameNumberTest.java index 871d483..65d3322 100644 --- a/src/test/java/baseball/number/GameNumberTest.java +++ b/src/test/java/baseball/number/GameNumberTest.java @@ -15,20 +15,20 @@ class GameNumberTest { GameNumber[] seedNumbers = new GameNumber[TEST_CASE_NUM]; Result[] results = new Result[TEST_CASE_NUM]; - userNumbers[0] = new GameNumber("123"); - seedNumbers[0] = new GameNumber("456"); + userNumbers[0] = GameNumber.from("123"); + seedNumbers[0] = GameNumber.from("456"); results[0] = new Result(); - userNumbers[1] = new GameNumber("984"); - seedNumbers[1] = new GameNumber("712"); + userNumbers[1] = GameNumber.from("984"); + seedNumbers[1] = GameNumber.from("712"); results[1] = new Result(); - userNumbers[2] = new GameNumber("921"); - seedNumbers[2] = new GameNumber("743"); + userNumbers[2] = GameNumber.from("921"); + seedNumbers[2] = GameNumber.from("743"); results[2] = new Result(); - userNumbers[3] = new GameNumber("652"); - seedNumbers[3] = new GameNumber("981"); + userNumbers[3] = GameNumber.from("652"); + seedNumbers[3] = GameNumber.from("981"); results[3] = new Result(); for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { @@ -48,20 +48,20 @@ class GameNumberTest { GameNumber[] seedNumbers = new GameNumber[TEST_CASE_NUM]; Result[] results = new Result[TEST_CASE_NUM]; - userNumbers[0] = new GameNumber("783"); - seedNumbers[0] = new GameNumber("582"); + userNumbers[0] = GameNumber.from("783"); + seedNumbers[0] = GameNumber.from("582"); results[0] = new Result(); - userNumbers[1] = new GameNumber("987"); - seedNumbers[1] = new GameNumber("237"); + userNumbers[1] = GameNumber.from("987"); + seedNumbers[1] = GameNumber.from("237"); results[1] = new Result(); - userNumbers[2] = new GameNumber("127"); - seedNumbers[2] = new GameNumber("597"); + userNumbers[2] = GameNumber.from("127"); + seedNumbers[2] = GameNumber.from("597"); results[2] = new Result(); - userNumbers[3] = new GameNumber("386"); - seedNumbers[3] = new GameNumber("746"); + userNumbers[3] = GameNumber.from("386"); + seedNumbers[3] = GameNumber.from("746"); results[3] = new Result(); for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { @@ -81,20 +81,20 @@ class GameNumberTest { GameNumber[] seedNumbers = new GameNumber[TEST_CASE_NUM]; Result[] results = new Result[TEST_CASE_NUM]; - userNumbers[0] = new GameNumber("783"); - seedNumbers[0] = new GameNumber("287"); + userNumbers[0] = GameNumber.from("783"); + seedNumbers[0] = GameNumber.from("287"); results[0] = new Result(); - userNumbers[1] = new GameNumber("987"); - seedNumbers[1] = new GameNumber("497"); + userNumbers[1] = GameNumber.from("987"); + seedNumbers[1] = GameNumber.from("497"); results[1] = new Result(); - userNumbers[2] = new GameNumber("127"); - seedNumbers[2] = new GameNumber("917"); + userNumbers[2] = GameNumber.from("127"); + seedNumbers[2] = GameNumber.from("917"); results[2] = new Result(); - userNumbers[3] = new GameNumber("386"); - seedNumbers[3] = new GameNumber("236"); + userNumbers[3] = GameNumber.from("386"); + seedNumbers[3] = GameNumber.from("236"); results[3] = new Result(); for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { @@ -114,20 +114,20 @@ class GameNumberTest { GameNumber[] seedNumbers = new GameNumber[TEST_CASE_NUM]; Result[] results = new Result[TEST_CASE_NUM]; - userNumbers[0] = new GameNumber("783"); - seedNumbers[0] = new GameNumber("387"); + userNumbers[0] = GameNumber.from("783"); + seedNumbers[0] = GameNumber.from("387"); results[0] = new Result(); - userNumbers[1] = new GameNumber("987"); - seedNumbers[1] = new GameNumber("897"); + userNumbers[1] = GameNumber.from("987"); + seedNumbers[1] = GameNumber.from("897"); results[1] = new Result(); - userNumbers[2] = new GameNumber("127"); - seedNumbers[2] = new GameNumber("217"); + userNumbers[2] = GameNumber.from("127"); + seedNumbers[2] = GameNumber.from("217"); results[2] = new Result(); - userNumbers[3] = new GameNumber("386"); - seedNumbers[3] = new GameNumber("836"); + userNumbers[3] = GameNumber.from("386"); + seedNumbers[3] = GameNumber.from("836"); results[3] = new Result(); for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { @@ -147,20 +147,20 @@ class GameNumberTest { GameNumber[] seedNumbers = new GameNumber[TEST_CASE_NUM]; Result[] results = new Result[TEST_CASE_NUM]; - userNumbers[0] = new GameNumber("783"); - seedNumbers[0] = new GameNumber("583"); + userNumbers[0] = GameNumber.from("783"); + seedNumbers[0] = GameNumber.from("583"); results[0] = new Result(); - userNumbers[1] = new GameNumber("987"); - seedNumbers[1] = new GameNumber("287"); + userNumbers[1] = GameNumber.from("987"); + seedNumbers[1] = GameNumber.from("287"); results[1] = new Result(); - userNumbers[2] = new GameNumber("127"); - seedNumbers[2] = new GameNumber("137"); + userNumbers[2] = GameNumber.from("127"); + seedNumbers[2] = GameNumber.from("137"); results[2] = new Result(); - userNumbers[3] = new GameNumber("386"); - seedNumbers[3] = new GameNumber("382"); + userNumbers[3] = GameNumber.from("386"); + seedNumbers[3] = GameNumber.from("382"); results[3] = new Result(); for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { @@ -180,20 +180,20 @@ class GameNumberTest { GameNumber[] seedNumbers = new GameNumber[TEST_CASE_NUM]; Result[] results = new Result[TEST_CASE_NUM]; - userNumbers[0] = new GameNumber("783"); - seedNumbers[0] = new GameNumber("783"); + userNumbers[0] = GameNumber.from("783"); + seedNumbers[0] = GameNumber.from("783"); results[0] = new Result(); - userNumbers[1] = new GameNumber("987"); - seedNumbers[1] = new GameNumber("987"); + userNumbers[1] = GameNumber.from("987"); + seedNumbers[1] = GameNumber.from("987"); results[1] = new Result(); - userNumbers[2] = new GameNumber("127"); - seedNumbers[2] = new GameNumber("127"); + userNumbers[2] = GameNumber.from("127"); + seedNumbers[2] = GameNumber.from("127"); results[2] = new Result(); - userNumbers[3] = new GameNumber("386"); - seedNumbers[3] = new GameNumber("386"); + userNumbers[3] = GameNumber.from("386"); + seedNumbers[3] = GameNumber.from("386"); results[3] = new Result(); for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { From d1a6dd7a1a6224a44c25457e94104637d7eea4f9 Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Tue, 23 Feb 2021 00:47:01 +0900 Subject: [PATCH 31/42] =?UTF-8?q?refactor:=20InputReceiver=EA=B0=80=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=EC=9D=84=20=EB=8B=A4=EC=8B=9C=20=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=ED=95=98=EB=8A=94=EA=B0=80=EB=A5=BC=20=ED=8C=90?= =?UTF-8?q?=EB=8B=A8=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit InputReceiver는 단순히 표준 입력 스트림으로부터 사용자 입력을 받는 책임을 가짐 기존의 게임을 다시 시작/시작하는가는 게임의 비즈니스 로직 class ConsoleInputReceiver: Before: - 게임을 진행할지 여부를 판단하는 1이라는 상수가 InputReceiver의 구현체인 이 클래스에 위치 - 그에 따라 checkContinueGame이라는 메소드가 입력도 받고 게임을 진행할지 판단도 하는 책임이 얽힌 메소드가 됨 After: - 기존 checkContinueGame 메소드를 receiveContinueGameSelect로 바꿈 - receiveContinueGameSelect는 단지 사용자의 입력을 받아 숫자인지 검증하고 반환함 - 그에 따라 게임을 계속할지 판단하는 throwIfInputIsNotOneOrTwo 메소드가 사라짐 class GameManager: Before: - continueGame이라는 boolean 변수에 할당하는 checkContinueGame이 비즈니스 로직까지 처리함 After: - 기존에 ConsoleInputReceiver에 위치하던 START_GAME 상수가 게임 전체 로직을 담당하는 컨트롤러 클래스인 GameManager에 위치 - isContinueGame이라는 메소드 추가 - isContinueGame에서는 사용자 입력을 받고 1이나 2가 아니면 예외를 던짐. 또한 START_GAME과 같은지를 반환하여 계속할지 판단함 - throwIfInputIsNotOneOrTwo 메소드도 이 클래스에 옮겨짐 interface InputReceiver: boolean checkContinueGame() -> int receiveContinueGameSelect() --- src/main/java/baseball/GameManager.java | 25 ++++++++++++++++--- .../receiver/ConsoleInputReceiver.java | 20 +++------------ .../java/baseball/receiver/InputReceiver.java | 2 +- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index 7aff150..6a28643 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -12,6 +12,8 @@ import java.util.Scanner; public class GameManager { + private final int START_GAME = 1; + private final Printer printer; private final InputReceiver receiver; private GameNumber seedNumber; @@ -28,18 +30,35 @@ public GameManager(Scanner scanner) { public void run() { Result result = new Result(); - boolean continueGame; printer.greet(); printer.askStartGame(); - continueGame = receiver.checkContinueGame(); + + boolean continueGame = isContinueGame(); while (continueGame) { seedNumber = RandomNumberGenerator.generate(); startGame(result); printer.noticeWin(); printer.askStartGame(); - continueGame = receiver.checkContinueGame(); + continueGame = isContinueGame(); + } + } + + private boolean isContinueGame() { + int select = receiver.receiveContinueGameSelect(); + try { + throwIfInputIsNotOneOrTwo(select); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return isContinueGame(); + } + return (select == START_GAME); + } + + private void throwIfInputIsNotOneOrTwo(int select) { + if (select != 1 && select != 2) { + throw new IllegalArgumentException("올바르지 않은 입력입니다.\n시작은 1, 종료는 2 입니다."); } } diff --git a/src/main/java/baseball/receiver/ConsoleInputReceiver.java b/src/main/java/baseball/receiver/ConsoleInputReceiver.java index f08bc98..7f856da 100644 --- a/src/main/java/baseball/receiver/ConsoleInputReceiver.java +++ b/src/main/java/baseball/receiver/ConsoleInputReceiver.java @@ -6,7 +6,6 @@ import java.util.Scanner; public class ConsoleInputReceiver implements InputReceiver { - private final int START_GAME = 1; private final Scanner scanner; @@ -15,22 +14,17 @@ public ConsoleInputReceiver(Scanner scanner) { } @Override - public boolean checkContinueGame() { - int select = 0; - + public int receiveContinueGameSelect() { + int select; try { select = scanner.nextInt(); - throwIfInputIsNotOneOrTwo(select); - } catch (IllegalArgumentException exception) { - System.out.println("잘못된 입력입니다. 다시 입력해주세요."); - return checkContinueGame(); } catch (InputMismatchException e) { cleanScannerBuffer(); System.out.println("잘못된 입력입니다. 숫자만 입력해주세요."); - return checkContinueGame(); + return receiveContinueGameSelect(); } - return select == START_GAME; + return select; } @Override @@ -52,10 +46,4 @@ private void cleanScannerBuffer() { scanner.nextLine(); } } - - private void throwIfInputIsNotOneOrTwo(int select) { - if(select != 1 && select != 2) { - throw new IllegalArgumentException(); - } - } } diff --git a/src/main/java/baseball/receiver/InputReceiver.java b/src/main/java/baseball/receiver/InputReceiver.java index c6a0c44..9c2cfe7 100644 --- a/src/main/java/baseball/receiver/InputReceiver.java +++ b/src/main/java/baseball/receiver/InputReceiver.java @@ -4,7 +4,7 @@ public interface InputReceiver { - boolean checkContinueGame(); + int receiveContinueGameSelect(); GameNumber receiveUserNumber(); From 6f894decaffd189637bf40c53dabb539a36784a3 Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Tue, 23 Feb 2021 00:48:09 +0900 Subject: [PATCH 32/42] =?UTF-8?q?fix:=20=EA=B2=8C=EC=9E=84=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=EA=B0=80=20=EC=B4=88=EA=B8=B0=ED=99=94=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EC=95=84=20=EA=B2=8C=EC=9E=84=EC=9D=84=20?= =?UTF-8?q?=EC=9E=AC=EC=8B=9C=EC=9E=91=ED=95=B4=EB=8F=84=20=EC=8A=B9?= =?UTF-8?q?=EB=A6=AC=ED=95=98=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/GameManager.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index 6a28643..38feff7 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -29,14 +29,13 @@ public GameManager(Scanner scanner) { } public void run() { - Result result = new Result(); - printer.greet(); printer.askStartGame(); boolean continueGame = isContinueGame(); while (continueGame) { + Result result = new Result(); seedNumber = RandomNumberGenerator.generate(); startGame(result); printer.noticeWin(); From cc08041c7ada234df3244c61018bd401a81bbafb Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Tue, 23 Feb 2021 00:50:59 +0900 Subject: [PATCH 33/42] =?UTF-8?q?refactor:=20=EB=A1=9C=EC=A7=81=EC=9D=84?= =?UTF-8?q?=20=EB=93=9C=EB=9F=AC=EB=82=B4=EB=8A=94=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=EB=AA=85=EC=9D=B4=20=EC=95=84=EB=8B=8C=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=20=EC=B9=9C=ED=99=94=EC=A0=81=EC=9D=B8=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=EB=AA=85=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/GameManager.java | 2 +- src/main/java/baseball/result/Result.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index 38feff7..94182eb 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -62,7 +62,7 @@ private void throwIfInputIsNotOneOrTwo(int select) { } private void startGame(Result result) { - while (!result.isThreeStrike()) { + while (!result.isWin()) { boolean isValidInput = receiveUserInput(); if (!isValidInput) { diff --git a/src/main/java/baseball/result/Result.java b/src/main/java/baseball/result/Result.java index 8556e0d..cafdd2a 100644 --- a/src/main/java/baseball/result/Result.java +++ b/src/main/java/baseball/result/Result.java @@ -12,7 +12,7 @@ public Result(int strikeCount, int ballCount) { this.ballCount = ballCount; } - public boolean isThreeStrike() { + public boolean isWin() { return strikeCount == 3; } From 98e2b6492498ecf75c46a8abfd9b397d0fe1fcd9 Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Tue, 23 Feb 2021 00:55:31 +0900 Subject: [PATCH 34/42] =?UTF-8?q?refactor:=20NPE=20throw=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=AA=A8=EB=91=90=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit NPE에 대한 특별한 예외처리 로직이 없기 때문에 디버깅의 편의를 위해서라도 NPE throw 및 try~catch 문 삭제함 --- src/main/java/baseball/Application.java | 10 ++++------ src/main/java/baseball/GameManager.java | 6 ++---- src/main/java/baseball/number/GameNumber.java | 7 ------- 3 files changed, 6 insertions(+), 17 deletions(-) diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index 2a6f709..248c5ec 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -4,11 +4,9 @@ public class Application { public static void main(String[] args) { - try (Scanner scanner = new Scanner(System.in)) { - GameManager manager = new GameManager(scanner); - manager.run(); - } catch (NullPointerException e) { - System.out.println(e.getMessage()); - } + Scanner scanner = new Scanner(System.in); + GameManager manager = new GameManager(scanner); + manager.run(); + scanner.close(); } } diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index 94182eb..9d54fb7 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -9,6 +9,7 @@ import baseball.result.Result; import java.util.InputMismatchException; +import java.util.Objects; import java.util.Scanner; public class GameManager { @@ -20,10 +21,7 @@ public class GameManager { private GameNumber userNumber; public GameManager(Scanner scanner) { - if(scanner == null) { - throw new NullPointerException(); - } - + Objects.requireNonNull(scanner); printer = new ConsolePrinter(); receiver = new ConsoleInputReceiver(scanner); } diff --git a/src/main/java/baseball/number/GameNumber.java b/src/main/java/baseball/number/GameNumber.java index 02fae13..028830c 100644 --- a/src/main/java/baseball/number/GameNumber.java +++ b/src/main/java/baseball/number/GameNumber.java @@ -16,13 +16,6 @@ public static GameNumber from(String number) { } public void compare(GameNumber userNumber, Result result) { - if (userNumber == null) { - throw new NullPointerException(); - } - - if (result == null) { - throw new NullPointerException(); - } int strikeCount =0, ballCount = 0; boolean[] digits = new boolean[10]; String userValue = userNumber.getValue(); From 35fa32eb7b6c71b71e77a9941cd020bb2b780a5c Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Tue, 23 Feb 2021 01:54:35 +0900 Subject: [PATCH 35/42] =?UTF-8?q?refactor:=20=EC=8B=9C=EB=93=9C=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=EC=99=80=20=EC=9E=85=EB=A0=A5=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EB=B9=84=EA=B5=90=20=EB=A1=9C=EC=A7=81=20=EC=B1=85?= =?UTF-8?q?=EC=9E=84=20=EC=9E=AC=EB=B6=84=EB=B0=B0=20=EB=B0=8F=20=EC=AA=BC?= =?UTF-8?q?=EA=B0=9C=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존에 두 번호를 비교하여 스트라이크와 볼 카운트를 계산하고 할당하는 모든 책임이 GameNumber의 메소드 compare에 뭉쳐 있었던 악취 SRP로 제거 class GameNumber: Before: - compare 메소드가 두 번호를 비교하여 스트라이크/볼 카운트를 게산하고 Result 객체에 할당함 - GameNumber라는 외부 객체가 Result의 상태를 변경시키고 있음 After: - Result를 계산해야 하는 비즈니스 로직상 GameNumber에 비교하는 로직이 위치해서는 안됨 - compare 메소드 제거 class Result: Before: - 자신의 상태를 GameNumber가 변경하도록 했음 - 그에 따라 set 메소드가 존재 After - 두 번호를 받아 비교하고 스트라이크 카운트를 계산하는 calculateStrikeCount 메소드 추가 - 볼 카운트를 계산하는 calculateBallCount 메소드 추가. Java8 스트림 적용 시도. - 볼 카운트 계산은 스트라이크 카운트에 의존하기 때문에 스트라이크 카운트를 먼저 카운팅 하도록 순서를 보장하는 calculateResult만 외부에 노출시키고 calculateStrikeCount와 calculateBallCount 메소드는 private로 접근 한정 --- src/main/java/baseball/GameManager.java | 2 +- src/main/java/baseball/number/GameNumber.java | 29 --------------- src/main/java/baseball/result/Result.java | 36 +++++++++++++------ .../java/baseball/number/GameNumberTest.java | 16 ++++----- 4 files changed, 35 insertions(+), 48 deletions(-) diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index 9d54fb7..b3a7777 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -66,7 +66,7 @@ private void startGame(Result result) { if (!isValidInput) { continue; } - seedNumber.compare(userNumber, result); + result.calculateResult(seedNumber, userNumber); printer.printResult(result); } } diff --git a/src/main/java/baseball/number/GameNumber.java b/src/main/java/baseball/number/GameNumber.java index 028830c..2b170aa 100644 --- a/src/main/java/baseball/number/GameNumber.java +++ b/src/main/java/baseball/number/GameNumber.java @@ -1,7 +1,5 @@ package baseball.number; -import baseball.result.Result; - public class GameNumber { private String value; private GameNumber(String number) { @@ -15,33 +13,6 @@ public static GameNumber from(String number) { return new GameNumber(number); } - public void compare(GameNumber userNumber, Result result) { - int strikeCount =0, ballCount = 0; - boolean[] digits = new boolean[10]; - String userValue = userNumber.getValue(); - - for (int index = 0; index < value.length(); index++) { - char seedCharAtIndex = value.charAt(index); - if (userValue.charAt(index) == seedCharAtIndex) { - strikeCount++; - continue; - } - - int seedCharIndex = Integer.parseInt(String.valueOf(seedCharAtIndex)); - digits[seedCharIndex] = true; - } - - for (char digit : userValue.toCharArray()) { - int digitIndex = Integer.parseInt(String.valueOf(digit)); - if (digits[digitIndex]) { - ballCount++; - } - } - - result.setBallCount(ballCount); - result.setStrikeCount(strikeCount); - } - public static boolean validateNumber(int number) { if (number <= 122 || number >=988) { return false; diff --git a/src/main/java/baseball/result/Result.java b/src/main/java/baseball/result/Result.java index cafdd2a..300b687 100644 --- a/src/main/java/baseball/result/Result.java +++ b/src/main/java/baseball/result/Result.java @@ -1,5 +1,7 @@ package baseball.result; +import baseball.number.GameNumber; + public class Result { private int strikeCount; private int ballCount; @@ -7,9 +9,31 @@ public Result() { this.strikeCount = 0; this.ballCount = 0; } - public Result(int strikeCount, int ballCount) { + + public void calculateResult(GameNumber seedNumber, GameNumber userNumber) { + calculateStrikeCount(seedNumber, userNumber); + calculateBallCount(seedNumber, userNumber); + } + + private void calculateStrikeCount(GameNumber seedNumber, GameNumber userNumber) { + int strikeCount =0; + String seedValue = seedNumber.getValue(); + String userValue = userNumber.getValue(); + + for (int index = 0; index < seedValue.length(); index++) { + if (userValue.charAt(index) == seedValue.charAt(index)) { + strikeCount++; + } + } this.strikeCount = strikeCount; - this.ballCount = ballCount; + } + + private void calculateBallCount(GameNumber seedNumber, GameNumber userNumber) { + String seedValue = seedNumber.getValue(); + String userValue = userNumber.getValue(); + int ballCount = (int) seedValue.codePoints().mapToObj(digit -> (char)digit) + .filter(digit -> userValue.indexOf(digit) != -1).count(); + this.ballCount = ballCount - strikeCount; } public boolean isWin() { @@ -24,15 +48,7 @@ public int getStrikeCount() { return strikeCount; } - public void setStrikeCount(int strikeCount) { - this.strikeCount = strikeCount; - } - public int getBallCount() { return ballCount; } - - public void setBallCount(int ballCount) { - this.ballCount = ballCount; - } } diff --git a/src/test/java/baseball/number/GameNumberTest.java b/src/test/java/baseball/number/GameNumberTest.java index 65d3322..d597f36 100644 --- a/src/test/java/baseball/number/GameNumberTest.java +++ b/src/test/java/baseball/number/GameNumberTest.java @@ -33,7 +33,7 @@ class GameNumberTest { for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { //when - seedNumbers[testCase].compare(userNumbers[testCase], results[testCase]); + results[testCase].calculateResult(seedNumbers[testCase], userNumbers[testCase]); //then assertEquals(results[testCase].getBallCount(), 0); assertEquals(results[testCase].getStrikeCount(), 0); @@ -66,7 +66,7 @@ class GameNumberTest { for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { //when - seedNumbers[testCase].compare(userNumbers[testCase], results[testCase]); + results[testCase].calculateResult(seedNumbers[testCase], userNumbers[testCase]); //then assertEquals(results[testCase].getBallCount(), 0); assertEquals(results[testCase].getStrikeCount(), 1); @@ -99,7 +99,7 @@ class GameNumberTest { for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { //when - seedNumbers[testCase].compare(userNumbers[testCase], results[testCase]); + results[testCase].calculateResult(seedNumbers[testCase], userNumbers[testCase]); //then assertEquals(results[testCase].getBallCount(), 1); assertEquals(results[testCase].getStrikeCount(), 1); @@ -132,7 +132,7 @@ class GameNumberTest { for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { //when - seedNumbers[testCase].compare(userNumbers[testCase], results[testCase]); + results[testCase].calculateResult(seedNumbers[testCase], userNumbers[testCase]); //then assertEquals(results[testCase].getBallCount(), 2); assertEquals(results[testCase].getStrikeCount(), 1); @@ -165,7 +165,7 @@ class GameNumberTest { for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { //when - seedNumbers[testCase].compare(userNumbers[testCase], results[testCase]); + results[testCase].calculateResult(seedNumbers[testCase], userNumbers[testCase]); //then assertEquals(results[testCase].getBallCount(), 0); assertEquals(results[testCase].getStrikeCount(), 2); @@ -198,7 +198,7 @@ class GameNumberTest { for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { //when - seedNumbers[testCase].compare(userNumbers[testCase], results[testCase]); + results[testCase].calculateResult(seedNumbers[testCase], userNumbers[testCase]); //then assertEquals(results[testCase].getBallCount(), 0); assertEquals(results[testCase].getStrikeCount(), 3); @@ -243,12 +243,12 @@ class GameNumberTest { int input1 = 564; int input2 = 679; int input3 = 541; - int input4 = 908; + int input4 = 918; int input5 = 543; //when, then - assertTrue(GameNumber.validateNumber(input2)); assertTrue(GameNumber.validateNumber(input1)); + assertTrue(GameNumber.validateNumber(input2)); assertTrue(GameNumber.validateNumber(input3)); assertTrue(GameNumber.validateNumber(input4)); assertTrue(GameNumber.validateNumber(input5)); From 9aabea9a9c85995e796c1607bf751c6cd771021f Mon Sep 17 00:00:00 2001 From: DongMin-Lee Date: Tue, 23 Feb 2021 01:58:23 +0900 Subject: [PATCH 36/42] =?UTF-8?q?refactor:=20InputReceiver=EC=9D=98=20rece?= =?UTF-8?q?iveUserNumber=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=20=ED=83=80=EC=9E=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit InputReceiver의 책임은 입력을 받는 것뿐이기 때문에 GameNumber 객체를 생성하는 책임을 분리시킴 --- src/main/java/baseball/GameManager.java | 3 ++- src/main/java/baseball/receiver/ConsoleInputReceiver.java | 4 ++-- src/main/java/baseball/receiver/InputReceiver.java | 4 +--- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index b3a7777..cd7ebea 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -74,7 +74,8 @@ private void startGame(Result result) { private boolean receiveUserInput() { try { printer.requestUserNumber(); - userNumber = receiver.receiveUserNumber(); + String userInput = receiver.receiveUserNumber(); + userNumber = GameNumber.from(userInput); } catch (IllegalArgumentException | InputMismatchException e) { receiver.dealWithExceptionalInput(); printer.warnInvalidInput(); diff --git a/src/main/java/baseball/receiver/ConsoleInputReceiver.java b/src/main/java/baseball/receiver/ConsoleInputReceiver.java index 7f856da..42d3c38 100644 --- a/src/main/java/baseball/receiver/ConsoleInputReceiver.java +++ b/src/main/java/baseball/receiver/ConsoleInputReceiver.java @@ -28,12 +28,12 @@ public int receiveContinueGameSelect() { } @Override - public GameNumber receiveUserNumber() throws IllegalArgumentException, InputMismatchException { + public String receiveUserNumber() throws IllegalArgumentException, InputMismatchException { int number = scanner.nextInt(); if (!GameNumber.validateNumber(number)) { throw new IllegalArgumentException(); } - return GameNumber.from(Integer.toString(number)); + return Integer.toString(number); } @Override diff --git a/src/main/java/baseball/receiver/InputReceiver.java b/src/main/java/baseball/receiver/InputReceiver.java index 9c2cfe7..003abb9 100644 --- a/src/main/java/baseball/receiver/InputReceiver.java +++ b/src/main/java/baseball/receiver/InputReceiver.java @@ -1,12 +1,10 @@ package baseball.receiver; -import baseball.number.GameNumber; - public interface InputReceiver { int receiveContinueGameSelect(); - GameNumber receiveUserNumber(); + String receiveUserNumber(); void dealWithExceptionalInput(); } From 1652c2b1f221609aeea31e2bf789d0b57bafa469 Mon Sep 17 00:00:00 2001 From: pkalsh <42990709+pkalsh@users.noreply.github.com> Date: Thu, 25 Feb 2021 10:13:59 +0900 Subject: [PATCH 37/42] =?UTF-8?q?refactor:=20=EC=83=81=EC=88=98=EB=A5=BC?= =?UTF-8?q?=20private=20static=20final=EB=A1=9C=20=EC=84=A0=EC=96=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 상수는 변경되지 않는 변수이므로 JVM에 한번 올려두고 같은 주소의 값을 참조해도 문제가 되지 않는다. static으로 선언하면 하나의 JVM이나 WAS 인스턴스에서는 같은 주소에 존재하는 겂을 참조한다. 그러므로 static을 잘 사용하면 성능을 뛰어나게 향상시킬 수 있지만, 잘못 사용하면 예기치 못한 결과를 초래하게 된다. [자바 성능 튜닝 이야기, 이상민] Co-authored-by: Gyeongjun Kim --- src/main/java/baseball/GameManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index cd7ebea..6d07366 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -13,7 +13,7 @@ import java.util.Scanner; public class GameManager { - private final int START_GAME = 1; + private static final int START_GAME = 1; private final Printer printer; private final InputReceiver receiver; From 46e34c898eb0d43c1aa10d6c71ec8b3238f958dc Mon Sep 17 00:00:00 2001 From: pkalsh <42990709+pkalsh@users.noreply.github.com> Date: Thu, 25 Feb 2021 10:14:49 +0900 Subject: [PATCH 38/42] =?UTF-8?q?style:=20=ED=95=84=EB=93=9C=EC=99=80=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C,=20=EB=A9=94=EC=86=8C=EB=93=9C?= =?UTF-8?q?=EC=99=80=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=82=AC=EC=9D=B4?= =?UTF-8?q?=EC=97=90=20=EB=B9=88=20=EB=9D=BC=EC=9D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Gyeongjun Kim --- src/main/java/baseball/number/GameNumber.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/baseball/number/GameNumber.java b/src/main/java/baseball/number/GameNumber.java index 2b170aa..6e3c960 100644 --- a/src/main/java/baseball/number/GameNumber.java +++ b/src/main/java/baseball/number/GameNumber.java @@ -2,6 +2,7 @@ public class GameNumber { private String value; + private GameNumber(String number) { value = number; } From 0037ff60d4c89535e3897364176643427c4ef485 Mon Sep 17 00:00:00 2001 From: pkalsh <42990709+pkalsh@users.noreply.github.com> Date: Thu, 25 Feb 2021 10:15:15 +0900 Subject: [PATCH 39/42] =?UTF-8?q?style:=20=ED=95=84=EB=93=9C=EC=99=80=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=82=AC=EC=9D=B4=EC=97=90=20?= =?UTF-8?q?=EB=B9=88=20=EB=9D=BC=EC=9D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Gyeongjun Kim --- src/main/java/baseball/result/Result.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/baseball/result/Result.java b/src/main/java/baseball/result/Result.java index 300b687..382b137 100644 --- a/src/main/java/baseball/result/Result.java +++ b/src/main/java/baseball/result/Result.java @@ -5,6 +5,7 @@ public class Result { private int strikeCount; private int ballCount; + public Result() { this.strikeCount = 0; this.ballCount = 0; From 6f3ca995c89d0ce6eddb6286e1f6ae77a0d16e1d Mon Sep 17 00:00:00 2001 From: pkalsh <42990709+pkalsh@users.noreply.github.com> Date: Thu, 25 Feb 2021 10:22:36 +0900 Subject: [PATCH 40/42] =?UTF-8?q?style:=20=ED=95=A0=EB=8B=B9=20=EC=97=B0?= =?UTF-8?q?=EC=82=B0=EC=9E=90=20=EC=95=9E=EB=92=A4=EC=97=90=EB=8A=94=20?= =?UTF-8?q?=EA=B3=B5=EB=B0=B1=20=EC=82=BD=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Gyeongjun Kim --- src/main/java/baseball/result/Result.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/baseball/result/Result.java b/src/main/java/baseball/result/Result.java index 382b137..40729b8 100644 --- a/src/main/java/baseball/result/Result.java +++ b/src/main/java/baseball/result/Result.java @@ -17,7 +17,7 @@ public void calculateResult(GameNumber seedNumber, GameNumber userNumber) { } private void calculateStrikeCount(GameNumber seedNumber, GameNumber userNumber) { - int strikeCount =0; + int strikeCount = 0; String seedValue = seedNumber.getValue(); String userValue = userNumber.getValue(); From 58578cf17ae2475795fa1b2e0e5bf373758075c7 Mon Sep 17 00:00:00 2001 From: pkalsh <42990709+pkalsh@users.noreply.github.com> Date: Thu, 25 Feb 2021 10:23:36 +0900 Subject: [PATCH 41/42] =?UTF-8?q?style:=20=EC=8A=A4=ED=8A=B8=EB=A6=BC=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=8B=9C=20=EA=B0=80=EB=8F=85=EC=84=B1?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=B4=20=EA=B0=9C=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Gyeongjun Kim --- src/main/java/baseball/result/Result.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/baseball/result/Result.java b/src/main/java/baseball/result/Result.java index 40729b8..6a8bdfe 100644 --- a/src/main/java/baseball/result/Result.java +++ b/src/main/java/baseball/result/Result.java @@ -32,8 +32,10 @@ private void calculateStrikeCount(GameNumber seedNumber, GameNumber userNumber) private void calculateBallCount(GameNumber seedNumber, GameNumber userNumber) { String seedValue = seedNumber.getValue(); String userValue = userNumber.getValue(); - int ballCount = (int) seedValue.codePoints().mapToObj(digit -> (char)digit) - .filter(digit -> userValue.indexOf(digit) != -1).count(); + int ballCount = (int) seedValue.codePoints() + .mapToObj(digit -> (char) digit) + .filter(digit -> userValue.indexOf(digit) != -1) + .count(); this.ballCount = ballCount - strikeCount; } From 41f6bc6122c492681d099add0b1dbd1f1ed94951 Mon Sep 17 00:00:00 2001 From: pkalsh <42990709+pkalsh@users.noreply.github.com> Date: Sat, 27 Feb 2021 21:16:54 +0900 Subject: [PATCH 42/42] =?UTF-8?q?refactor:=20for=EB=AC=B8=EC=9D=98=20?= =?UTF-8?q?=EB=B0=98=EB=B3=B5=20=EB=B3=80=EC=88=98=EC=97=90=EB=8A=94=20?= =?UTF-8?q?=EC=9E=84=EC=8B=9C=20=EB=B3=80=EC=88=98=EB=AA=85=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=20=EA=B0=80=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Gyeongjun Kim --- src/main/java/baseball/result/Result.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/baseball/result/Result.java b/src/main/java/baseball/result/Result.java index 6a8bdfe..301b3cd 100644 --- a/src/main/java/baseball/result/Result.java +++ b/src/main/java/baseball/result/Result.java @@ -21,7 +21,7 @@ private void calculateStrikeCount(GameNumber seedNumber, GameNumber userNumber) String seedValue = seedNumber.getValue(); String userValue = userNumber.getValue(); - for (int index = 0; index < seedValue.length(); index++) { + for (int i = 0; i < seedValue.length(); i++) { if (userValue.charAt(index) == seedValue.charAt(index)) { strikeCount++; }