From faa08ba0312c357390a2cd0e1fb95346eaa83df1 Mon Sep 17 00:00:00 2001 From: hany049 Date: Mon, 20 Oct 2025 20:46:24 +0900 Subject: [PATCH 1/6] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=ED=95=A0=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bd90ef0247..bb3c333cd9 100644 --- a/README.md +++ b/README.md @@ -1 +1,15 @@ -# java-calculator-precourse \ No newline at end of file +# java-calculator-precourse + +## 구현할 기능 목록 + +[ ] 문자열 입력과 결과 출력하는 기능 구현 + +[ ] 기본 구분자 `쉼표(,)`와 `콜론(:)`으로 숫자 분리하는 기능 구현 + +[ ] 커스텀 구분자로 숫자 분리하는 기능 구현 + +[ ] 입력값 검증 및 예외 처리하는 기능 구현 +- 구분자를 제외한 입력값이 음수이거나 숫자가 아닌 경우 +- 입력값이 빈 문자열인 경우 + +[ ] 잘못된 입력값인 경우 `IllegalArgumentException`발생 및 어플리케이션 종료시키는 기능 구현 \ No newline at end of file From 4eb4642b35d99a5e4c70eacb2889914aaebfde65 Mon Sep 17 00:00:00 2001 From: hany049 Date: Mon, 20 Oct 2025 21:50:17 +0900 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20=EB=AC=B8=EC=9E=90=EC=97=B4=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EA=B3=BC=20=EA=B2=B0=EA=B3=BC=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 +++++++------- src/main/java/calculator/view/InputView.java | 12 ++++++++++++ src/main/java/calculator/view/OutputView.java | 8 ++++++++ 3 files changed, 27 insertions(+), 7 deletions(-) create mode 100644 src/main/java/calculator/view/InputView.java create mode 100644 src/main/java/calculator/view/OutputView.java diff --git a/README.md b/README.md index bb3c333cd9..1eeaa721de 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,14 @@ ## 구현할 기능 목록 -[ ] 문자열 입력과 결과 출력하는 기능 구현 +- [ ] 문자열 입력과 결과 출력하는 기능 구현 -[ ] 기본 구분자 `쉼표(,)`와 `콜론(:)`으로 숫자 분리하는 기능 구현 +- [ ] 기본 구분자 `쉼표(,)`와 `콜론(:)`으로 숫자 분리하는 기능 구현 -[ ] 커스텀 구분자로 숫자 분리하는 기능 구현 +- [ ] 커스텀 구분자로 숫자 분리하는 기능 구현 -[ ] 입력값 검증 및 예외 처리하는 기능 구현 -- 구분자를 제외한 입력값이 음수이거나 숫자가 아닌 경우 -- 입력값이 빈 문자열인 경우 +- [ ] 입력값 검증 및 예외 처리하는 기능 구현 + - 구분자를 제외한 입력값이 음수이거나 숫자가 아닌 경우 + - 입력값이 빈 문자열인 경우 -[ ] 잘못된 입력값인 경우 `IllegalArgumentException`발생 및 어플리케이션 종료시키는 기능 구현 \ No newline at end of file +- [ ] 잘못된 입력값인 경우 `IllegalArgumentException`발생 및 어플리케이션 종료시키는 기능 구현 \ No newline at end of file diff --git a/src/main/java/calculator/view/InputView.java b/src/main/java/calculator/view/InputView.java new file mode 100644 index 0000000000..e9bb774994 --- /dev/null +++ b/src/main/java/calculator/view/InputView.java @@ -0,0 +1,12 @@ +package calculator.view; + +import camp.nextstep.edu.missionutils.Console; + +public class InputView { + + public static String getInput() { + System.out.println("문자열을 입력해주세요: "); + + return Console.readLine(); + } +} diff --git a/src/main/java/calculator/view/OutputView.java b/src/main/java/calculator/view/OutputView.java new file mode 100644 index 0000000000..82679039ad --- /dev/null +++ b/src/main/java/calculator/view/OutputView.java @@ -0,0 +1,8 @@ +package calculator.view; + +public class OutputView { + + public static void printResult(int result) { + System.out.println("결과: " + result); + } +} From ed6ad15e048c8fd43cb0b7f04dbc7cfebe52dc51 Mon Sep 17 00:00:00 2001 From: hany049 Date: Mon, 20 Oct 2025 22:37:52 +0900 Subject: [PATCH 3/6] =?UTF-8?q?feat:=20=EA=B8=B0=EB=B3=B8=20=EA=B5=AC?= =?UTF-8?q?=EB=B6=84=EC=9E=90=EB=A1=9C=20=EC=88=AB=EC=9E=90=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/model/Calculator.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/calculator/model/Calculator.java diff --git a/src/main/java/calculator/model/Calculator.java b/src/main/java/calculator/model/Calculator.java new file mode 100644 index 0000000000..66f9e8ce43 --- /dev/null +++ b/src/main/java/calculator/model/Calculator.java @@ -0,0 +1,13 @@ +package calculator.model; + +import java.util.Arrays; + +public class Calculator { + + public int add(String inputString) { + + String[] number = inputString.split("[,:]"); + + return Arrays.stream(number).mapToInt(Integer::parseInt).sum(); + } +} From a0461877e6d7195b75e916e52d8de95ea7b485eb Mon Sep 17 00:00:00 2001 From: hany049 Date: Mon, 20 Oct 2025 22:39:16 +0900 Subject: [PATCH 4/6] =?UTF-8?q?feat:=20Application=20=EB=B0=8F=20Controlle?= =?UTF-8?q?r?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/Application.java | 5 +++++ .../controller/CalculatorController.java | 15 +++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 src/main/java/calculator/controller/CalculatorController.java diff --git a/src/main/java/calculator/Application.java b/src/main/java/calculator/Application.java index 573580fb40..a4dbd17ff9 100644 --- a/src/main/java/calculator/Application.java +++ b/src/main/java/calculator/Application.java @@ -1,7 +1,12 @@ package calculator; +import calculator.controller.CalculatorController; + public class Application { public static void main(String[] args) { // TODO: 프로그램 구현 + CalculatorController calculatorController = new CalculatorController(); + calculatorController.start(); + } } diff --git a/src/main/java/calculator/controller/CalculatorController.java b/src/main/java/calculator/controller/CalculatorController.java new file mode 100644 index 0000000000..ad8cde76e4 --- /dev/null +++ b/src/main/java/calculator/controller/CalculatorController.java @@ -0,0 +1,15 @@ +package calculator.controller; + +import calculator.model.Calculator; +import calculator.view.InputView; +import calculator.view.OutputView; + +public class CalculatorController { + private final Calculator calculator = new Calculator(); + + public void start() { + String string = InputView.getInput(); + int result = calculator.add(string); + OutputView.printResult(result); + } +} From e9b66bec818f48d58374e3075c678903d4efff8b Mon Sep 17 00:00:00 2001 From: hany049 Date: Mon, 20 Oct 2025 22:54:50 +0900 Subject: [PATCH 5/6] =?UTF-8?q?feat:=20=EC=BB=A4=EC=8A=A4=ED=85=80=20?= =?UTF-8?q?=EA=B5=AC=EB=B6=84=EC=9E=90=EB=A1=9C=20=EC=88=AB=EC=9E=90=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 --- src/main/java/calculator/model/Calculator.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/calculator/model/Calculator.java b/src/main/java/calculator/model/Calculator.java index 66f9e8ce43..491e0bfe04 100644 --- a/src/main/java/calculator/model/Calculator.java +++ b/src/main/java/calculator/model/Calculator.java @@ -6,6 +6,19 @@ public class Calculator { public int add(String inputString) { + if (inputString.startsWith("//")) { + int customIndex = inputString.indexOf("\\n"); + if (customIndex != -1) { + String CustomSeparator = inputString.substring(2, customIndex); + String remainString = inputString.substring(customIndex + 2); + + String CustomRegex = "[,:" + CustomSeparator + "]"; + + String[] number = remainString.split(CustomRegex); + return Arrays.stream(number).mapToInt(Integer::parseInt).sum(); + } + } + String[] number = inputString.split("[,:]"); return Arrays.stream(number).mapToInt(Integer::parseInt).sum(); From dad53658b45c2f56b94ae636b7e4ab0b4e893396 Mon Sep 17 00:00:00 2001 From: hany049 Date: Mon, 20 Oct 2025 23:40:09 +0900 Subject: [PATCH 6/6] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=EA=B0=92=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EB=B0=8F=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC(IllegalArgumentException)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/calculator/model/Calculator.java | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/main/java/calculator/model/Calculator.java b/src/main/java/calculator/model/Calculator.java index 491e0bfe04..1207b43862 100644 --- a/src/main/java/calculator/model/Calculator.java +++ b/src/main/java/calculator/model/Calculator.java @@ -5,22 +5,56 @@ public class Calculator { public int add(String inputString) { + checkBlank(inputString); if (inputString.startsWith("//")) { int customIndex = inputString.indexOf("\\n"); if (customIndex != -1) { String CustomSeparator = inputString.substring(2, customIndex); + verifyCustomSeparator(CustomSeparator); String remainString = inputString.substring(customIndex + 2); String CustomRegex = "[,:" + CustomSeparator + "]"; String[] number = remainString.split(CustomRegex); - return Arrays.stream(number).mapToInt(Integer::parseInt).sum(); + return Arrays.stream(number) + .mapToInt(this::checkNumber) + .peek(this::validateNumber) + .sum(); } } String[] number = inputString.split("[,:]"); - return Arrays.stream(number).mapToInt(Integer::parseInt).sum(); + return Arrays.stream(number) + .mapToInt(this::checkNumber) + .peek(this::validateNumber) + .sum(); + } + + private int checkNumber(String input) { + try { + return Integer.parseInt(input); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("숫자만 입력해주세요!!!"); + } + } + + private void validateNumber(int number) { + if (number < 0) { + throw new IllegalArgumentException("양수만 입력해주세요!!!"); + } + } + + private void checkBlank(String string) { + if (string.isBlank()) { + throw new IllegalArgumentException("문자열을 입력해 주세요!!!"); + } + } + + private void verifyCustomSeparator(String custom) { + if (custom.matches(".*\\d.*")) { + throw new IllegalArgumentException("커스텀 구분자로 숫자를 사용할 수 없어요!!!"); + } } }