diff --git a/README.md b/README.md index bd90ef0247..1eeaa721de 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 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); + } +} diff --git a/src/main/java/calculator/model/Calculator.java b/src/main/java/calculator/model/Calculator.java new file mode 100644 index 0000000000..1207b43862 --- /dev/null +++ b/src/main/java/calculator/model/Calculator.java @@ -0,0 +1,60 @@ +package calculator.model; + +import java.util.Arrays; + +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(this::checkNumber) + .peek(this::validateNumber) + .sum(); + } + } + + String[] number = inputString.split("[,:]"); + + 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("커스텀 구분자로 숫자를 사용할 수 없어요!!!"); + } + } +} 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); + } +}