diff --git a/src/main/java/calculator/CalculatorMain.java b/src/main/java/calculator/CalculatorMain.java new file mode 100644 index 0000000..3e1c1ba --- /dev/null +++ b/src/main/java/calculator/CalculatorMain.java @@ -0,0 +1,20 @@ +package calculator; + +import calculator.controller.CalculatorController; +import calculator.model.Operator; +import calculator.util.FormulaParser; +import calculator.view.InputView; +import calculator.view.OutputView; + + +public class CalculatorMain { + public static void main(String[] args) { + Operator operator = new Operator(); + InputView inputView = new InputView(); + OutputView outputView = new OutputView(); + FormulaParser formulaParser = new FormulaParser(); + + CalculatorController controller = new CalculatorController(operator, inputView, outputView, formulaParser); + controller.calculatorRun(); + } +} \ No newline at end of file diff --git a/src/main/java/calculator/controller/CalculatorController.java b/src/main/java/calculator/controller/CalculatorController.java new file mode 100644 index 0000000..25b12cf --- /dev/null +++ b/src/main/java/calculator/controller/CalculatorController.java @@ -0,0 +1,27 @@ +package calculator.controller; + +import calculator.model.Operator; +import calculator.util.FormulaParser; +import calculator.view.InputView; +import calculator.view.OutputView; + +public class CalculatorController { + private final Operator operator; + private final InputView inputView; + private final OutputView outputView; + private final FormulaParser formulaParser; + + public CalculatorController(Operator operator, InputView inputView, OutputView outputView, FormulaParser formulaParser) { + this.operator = operator; + this.inputView = inputView; + this.outputView = outputView; + this.formulaParser = formulaParser; + } + + public void calculatorRun() { + String formula = inputView.formulaInput(); + String[] values = formulaParser.parse(formula); + int result = operator.calculate(values); + outputView.resultOutput(result); + } +} diff --git a/src/main/java/calculator/model/Operator.java b/src/main/java/calculator/model/Operator.java new file mode 100644 index 0000000..d594cb1 --- /dev/null +++ b/src/main/java/calculator/model/Operator.java @@ -0,0 +1,17 @@ +package calculator.model; + +public class Operator { + + public int calculate(String[] values) { + int result = Integer.parseInt(values[0]); + + for (int i = 1; i < values.length; i += 2) { + String symbol = values[i]; + int nextNumber = Integer.parseInt(values[i + 1]); + OperatorType operatorType = OperatorType.fromString(symbol); + result = operatorType.apply(result, nextNumber); + } + + return result; + } +} diff --git a/src/main/java/calculator/model/OperatorType.java b/src/main/java/calculator/model/OperatorType.java new file mode 100644 index 0000000..d65731b --- /dev/null +++ b/src/main/java/calculator/model/OperatorType.java @@ -0,0 +1,45 @@ +package calculator.model; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiFunction; + +public enum OperatorType { + ADDITION("+", (a, b) -> a + b), + SUBTRACTION("-", (a, b) -> a - b), + MULTIPLICATION("*", (a, b) -> a * b), + DIVISION("/", (a, b) -> { + if (b == 0) { + throw new ArithmeticException("0으로 나눌 수 없습니다."); + } + return a / b; + }); + + private static final Map SYMBOL_MAP = new HashMap<>(); + + static { + for (OperatorType type : values()) { + SYMBOL_MAP.put(type.symbol, type); + } + } + + private final String symbol; + private final BiFunction operation; + + OperatorType(String symbol, BiFunction operation) { + this.symbol = symbol; + this.operation = operation; + } + + public static OperatorType fromString(String symbol) { + OperatorType type = SYMBOL_MAP.get(symbol); + if (type == null) { + throw new IllegalArgumentException("잘못된 연산자입니다."); + } + return type; + } + + public int apply(int a, int b) { + return operation.apply(a, b); + } +} \ No newline at end of file diff --git a/src/main/java/calculator/util/FormulaParser.java b/src/main/java/calculator/util/FormulaParser.java new file mode 100644 index 0000000..2c2cdb2 --- /dev/null +++ b/src/main/java/calculator/util/FormulaParser.java @@ -0,0 +1,7 @@ +package calculator.util; + +public class FormulaParser { + public String[] parse(String input) { + return input.split(" "); + } +} diff --git a/src/main/java/calculator/view/InputView.java b/src/main/java/calculator/view/InputView.java new file mode 100644 index 0000000..d00ad63 --- /dev/null +++ b/src/main/java/calculator/view/InputView.java @@ -0,0 +1,11 @@ +package calculator.view; + +import java.util.Scanner; + +public class InputView { + public String formulaInput() { + Scanner scanner = new Scanner(System.in); + System.out.print("수식을 입력하세요 : "); + return scanner.nextLine(); + } +} \ No newline at end of file diff --git a/src/main/java/calculator/view/OutputView.java b/src/main/java/calculator/view/OutputView.java new file mode 100644 index 0000000..86f2da4 --- /dev/null +++ b/src/main/java/calculator/view/OutputView.java @@ -0,0 +1,8 @@ +package calculator.view; + +public class OutputView { + + public void resultOutput(int result) { + System.out.print("결과 : " + result); + } +} \ No newline at end of file