From 2f8bb465e4d682a729939439cd764664febd2785 Mon Sep 17 00:00:00 2001 From: SW-H Date: Mon, 12 Jun 2023 05:57:13 +0900 Subject: [PATCH 01/49] =?UTF-8?q?feat=20:=20=EC=9E=85=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/programmers/view/InputView.java | 8 ++++++++ src/main/java/co/programmers/view/OutputView.java | 7 +++++++ 2 files changed, 15 insertions(+) create mode 100644 src/main/java/co/programmers/view/InputView.java create mode 100644 src/main/java/co/programmers/view/OutputView.java diff --git a/src/main/java/co/programmers/view/InputView.java b/src/main/java/co/programmers/view/InputView.java new file mode 100644 index 000000000..023b86a9d --- /dev/null +++ b/src/main/java/co/programmers/view/InputView.java @@ -0,0 +1,8 @@ +package co.programmers.view; + +public interface InputView { + + String inputUserMenu(); + + String inputExpression(); +} \ No newline at end of file diff --git a/src/main/java/co/programmers/view/OutputView.java b/src/main/java/co/programmers/view/OutputView.java new file mode 100644 index 000000000..6645f7046 --- /dev/null +++ b/src/main/java/co/programmers/view/OutputView.java @@ -0,0 +1,7 @@ +package co.programmers.view; + +public interface OutputView { + + void print(String content); + +} \ No newline at end of file From 5a6deed857818821dc5f64fe64678eba05d9cb6f Mon Sep 17 00:00:00 2001 From: SW-H Date: Mon, 12 Jun 2023 06:00:37 +0900 Subject: [PATCH 02/49] =?UTF-8?q?feat=20:=20=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EB=AC=B8=EA=B5=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/programmers/exception/ExceptionMessage.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/co/programmers/exception/ExceptionMessage.java diff --git a/src/main/java/co/programmers/exception/ExceptionMessage.java b/src/main/java/co/programmers/exception/ExceptionMessage.java new file mode 100644 index 000000000..0c389a09c --- /dev/null +++ b/src/main/java/co/programmers/exception/ExceptionMessage.java @@ -0,0 +1,11 @@ +package co.programmers.exception; + +public class ExceptionMessage { + + public static final String DIVIDED_BY_ZERO = "0으로 나눌 수 없습니다."; + public static final String INVALID_SYMBOL = "잘못된 연산 기호입니다."; + public static final String INVALID_INPUT = "잘못된 입력입니다"; + + private ExceptionMessage() { + } +} \ No newline at end of file From c4c3e886a85c97e374293cf8344964d12a3433ab Mon Sep 17 00:00:00 2001 From: SW-H Date: Mon, 12 Jun 2023 06:04:59 +0900 Subject: [PATCH 03/49] =?UTF-8?q?feat=20:=20=EA=B3=84=EC=82=B0=EA=B8=B0=20?= =?UTF-8?q?-=20main=EB=AC=B8/=EA=B3=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programmers/application/Calculator.java | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 src/main/java/co/programmers/application/Calculator.java diff --git a/src/main/java/co/programmers/application/Calculator.java b/src/main/java/co/programmers/application/Calculator.java new file mode 100644 index 000000000..82f02a2f7 --- /dev/null +++ b/src/main/java/co/programmers/application/Calculator.java @@ -0,0 +1,95 @@ +package co.programmers.application; + +import co.programmers.domain.Operator; +import co.programmers.domain.UserMenu; +import co.programmers.view.CalculatorInputView; +import co.programmers.view.CalculatorOutputView; +import co.programmers.view.InputView; +import co.programmers.view.OutputView; +import java.util.Stack; + +public class Calculator { + + private final InputView inputView; + private final OutputView outputView; + + public Calculator(InputView inputView, OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + } + + public static void main(String[] args) { + InputView inputView = new CalculatorInputView(); + OutputView outputView = new CalculatorOutputView(); + Calculator calculator = new Calculator(inputView, outputView); + calculator.run(); + } + + public void run() { + while (true) { + UserMenu userMenu = UserMenu.get(inputView.inputUserMenu()); + switch (userMenu) { + case INQUIRY: + // 구현 예정 + break; + case CALCULATE: + String expression = inputView.inputExpression(); + Integer output = calculate(expression); + outputView.print(String.valueOf(output)); + break; + case TERMINATE: + return; + } + } + } + + private Integer calculate(String input) { + char[] expression = input.toCharArray(); + Stack Operands = new Stack<>(); + Stack Operators = new Stack<>(); + for (int i = 0; i < expression.length; i++) { + if (expression[i] == ' ') { + continue; + } + if (isInteger(expression[i])) { + StringBuffer operand = new StringBuffer(); + while (i < expression.length && isInteger(expression[i])) { + operand.append(expression[i++]); + } + i--; + Operands.push(Integer.parseInt(operand.toString())); + } else if (expression[i] == '(') { + Operators.push(expression[i]); + } else if (expression[i] == ')') { + while (Operators.peek() != '(') { + Operands.push(Operator.calculate( + String.valueOf(Operators.pop()), Operands.pop(), Operands.pop() + )); + } + Operators.pop(); + } else { + while (!Operators.empty() && comparePriority(expression[i], Operators.peek())) { + Operands.push(Operator.calculate( + String.valueOf(Operators.pop()), Operands.pop(), Operands.pop() + )); + } + Operators.push(expression[i]); + } + } + while (!Operators.empty()) { + Operands.push(Operator.calculate( + String.valueOf(Operators.pop()), Operands.pop(), Operands.pop() + )); + } + return Operands.pop(); + } + + private boolean comparePriority(char operator1, char operator2) { + return Operator.getSymbol(String.valueOf(operator1)).getPriority() > + Operator.getSymbol(String.valueOf(operator2)).getPriority(); + } + + private boolean isInteger(char c) { + return ('0' <= c && c <= '9'); + } +} \ No newline at end of file From e2dcb42e1a4a90caeda95b3c2b2effab55898c55 Mon Sep 17 00:00:00 2001 From: SW-H Date: Mon, 12 Jun 2023 06:05:28 +0900 Subject: [PATCH 04/49] =?UTF-8?q?feat=20:=20=EC=9E=85=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20-=20=EC=9E=85=EB=A0=A5=20:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EB=A9=94=EB=89=B4=20=EC=84=A0=ED=83=9D,=20?= =?UTF-8?q?=EC=88=98=EC=8B=9D=20-=20=EC=B6=9C=EB=A0=A5=20:=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=20=EA=B2=B0=EA=B3=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programmers/view/CalculatorInputView.java | 58 +++++++++++++++++++ .../view/CalculatorOutputView.java | 9 +++ 2 files changed, 67 insertions(+) create mode 100644 src/main/java/co/programmers/view/CalculatorInputView.java create mode 100644 src/main/java/co/programmers/view/CalculatorOutputView.java diff --git a/src/main/java/co/programmers/view/CalculatorInputView.java b/src/main/java/co/programmers/view/CalculatorInputView.java new file mode 100644 index 000000000..ce47f0b99 --- /dev/null +++ b/src/main/java/co/programmers/view/CalculatorInputView.java @@ -0,0 +1,58 @@ +package co.programmers.view; + +import co.programmers.exception.ExceptionMessage; +import co.programmers.domain.UserMenu; +import java.util.Arrays; +import java.util.Scanner; +import java.util.Set; +import java.util.stream.Collectors; + +public class CalculatorInputView implements InputView { + + private static final Scanner SCANNER = new Scanner(System.in); + private static final Set USER_MENU = + Arrays.stream(UserMenu.values()) + .map(UserMenu::getValue) + .collect(Collectors.toSet()); + + public CalculatorInputView() { + } + + public String inputUserMenu() { + printMenuChoiceGuide(); + String userInput = SCANNER.next(); + SCANNER.nextLine(); + try { + validateUserMenuChoice(String.valueOf(userInput)); + } catch (IllegalArgumentException illegalArgumentException) { + System.out.println(illegalArgumentException.getMessage()); + return UserMenu.TERMINATE.getValue(); + } + return userInput; + } + + public String inputExpression() { + printCalculationGuide(); + String expression = SCANNER.nextLine(); + return expression; + } + + private void printCalculationGuide() { + System.out.println("1 + 2 * 3와 같은 형식으로 계산하고자 하는 식을 입력하세요."); + System.out.print("> "); + } + + private void printMenuChoiceGuide() { + System.out.println("\n[다음 중 원하시는 항목을 숫자로 입력하세요]"); + System.out.println("1. 조회"); + System.out.println("2. 계산"); + System.out.println("3. 종료"); + System.out.print("> 선택 : "); + } + + private void validateUserMenuChoice(String userInput) throws IllegalArgumentException { + if (!USER_MENU.contains(userInput)) { + throw new IllegalArgumentException(ExceptionMessage.INVALID_INPUT); + } + } +} \ No newline at end of file diff --git a/src/main/java/co/programmers/view/CalculatorOutputView.java b/src/main/java/co/programmers/view/CalculatorOutputView.java new file mode 100644 index 000000000..e5cb63af6 --- /dev/null +++ b/src/main/java/co/programmers/view/CalculatorOutputView.java @@ -0,0 +1,9 @@ +package co.programmers.view; + +public class CalculatorOutputView implements OutputView { + + public void print(String content) { + System.out.println(">> 결과 : " + content); + } + +} From bd3aee3ecc677e8fcb9d9cc6400c17d44dfb066d Mon Sep 17 00:00:00 2001 From: SW-H Date: Mon, 12 Jun 2023 06:06:01 +0900 Subject: [PATCH 05/49] =?UTF-8?q?feat=20:=20=EC=97=B0=EC=82=B0=EC=9E=90=20?= =?UTF-8?q?enum=EC=9C=BC=EB=A1=9C=20=EA=B4=80=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/co/programmers/domain/Operator.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/main/java/co/programmers/domain/Operator.java diff --git a/src/main/java/co/programmers/domain/Operator.java b/src/main/java/co/programmers/domain/Operator.java new file mode 100644 index 000000000..6eaa1e193 --- /dev/null +++ b/src/main/java/co/programmers/domain/Operator.java @@ -0,0 +1,60 @@ +package co.programmers.domain; + +import co.programmers.exception.ExceptionMessage; +import java.util.Collections; +import java.util.Map; +import java.util.Optional; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public enum Operator { + ADDITION("+", 2, (operand1, operand2) -> Integer.valueOf( + operand1 + operand2 + )), + SUBTRACTION("-", 2, (operand1, operand2) -> Integer.valueOf( + operand2 - operand1 + )), + MULTIPLICATION("*", 1, (operand1, operand2) -> Integer.valueOf( + operand1 * operand2 + )), + DIVISION("/", 1, (operand1, operand2) -> { + if (operand2 == 0) { + throw new IllegalArgumentException(ExceptionMessage.DIVIDED_BY_ZERO); + } + return Integer.valueOf(operand1 / operand2); + }), + OPENED_PARENTHESIS("(", 3, (operand1, operand2) -> 0), + CLOSED_PARENTHESIS(")", 3, (operand1, operand2) -> 0); + + private static final Map operators = + Collections.unmodifiableMap(Stream.of(values()) + .collect(Collectors.toMap(Operator::getSymbol, Function.identity()))); + private final String symbol; + private final int priority; + private final BiFunction operation; + + Operator(String symbol, int priority, BiFunction operation) { + this.symbol = symbol; + this.priority = priority; + this.operation = operation; + } + + public static Integer calculate(String operator, Integer operand1, Integer operand2) { + return getSymbol(operator).operation.apply(operand1, operand2); + } + + public static Operator getSymbol(String operator) { + return Optional.ofNullable(operators.get(operator)) + .orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.INVALID_SYMBOL)); + } + + private String getSymbol() { + return symbol; + } + + public int getPriority() { + return priority; + } +} \ No newline at end of file From 52a1300bbf70947cc8635ab22de5563ff974fe75 Mon Sep 17 00:00:00 2001 From: SW-H Date: Mon, 12 Jun 2023 06:06:15 +0900 Subject: [PATCH 06/49] =?UTF-8?q?feat=20:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EB=A9=94=EB=89=B4=20enum?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/co/programmers/domain/UserMenu.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/main/java/co/programmers/domain/UserMenu.java diff --git a/src/main/java/co/programmers/domain/UserMenu.java b/src/main/java/co/programmers/domain/UserMenu.java new file mode 100644 index 000000000..65548d728 --- /dev/null +++ b/src/main/java/co/programmers/domain/UserMenu.java @@ -0,0 +1,31 @@ +package co.programmers.domain; + +import java.util.Collections; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public enum UserMenu { + INQUIRY("1"), + CALCULATE("2"), + TERMINATE("3"); + + private static final Map values = + Collections.unmodifiableMap(Stream.of(values()) + .collect(Collectors.toMap(UserMenu::getValue, Function.identity()))); + private final String value; + + UserMenu(String value) { + this.value = value; + } + + public static UserMenu get(String input) { + return Optional.ofNullable(values.get(input)).orElse(TERMINATE); + } + + public String getValue() { + return value; + } +} \ No newline at end of file From ee4d0322af84d8bea37937712558b58f8a791919 Mon Sep 17 00:00:00 2001 From: SW-H Date: Mon, 12 Jun 2023 06:06:32 +0900 Subject: [PATCH 07/49] =?UTF-8?q?docs=20:=20java=EB=B2=84=EC=A0=84=20?= =?UTF-8?q?=EB=AA=85=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/build.gradle b/build.gradle index 40aaf325a..70893d698 100644 --- a/build.gradle +++ b/build.gradle @@ -5,11 +5,18 @@ plugins { group = 'co.programmers' version = '1.0-SNAPSHOT' +java { + toolchain { + languageVersion = JavaLanguageVersion.of(11) + } +} + repositories { mavenCentral() } dependencies { + implementation 'org.jetbrains:annotations:24.0.0' testImplementation platform('org.junit:junit-bom:5.9.1') testImplementation 'org.junit.jupiter:junit-jupiter' } From 842467db9c9dcb258f9096fb1db7581a6d8849d6 Mon Sep 17 00:00:00 2001 From: SW-H Date: Mon, 12 Jun 2023 06:31:05 +0900 Subject: [PATCH 08/49] =?UTF-8?q?docs=20:=20=EB=AF=B8=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=A4=91=EC=9D=B8=20=EC=A2=85=EC=86=8D=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 6 ------ 1 file changed, 6 deletions(-) diff --git a/build.gradle b/build.gradle index 70893d698..0a7d2e2c5 100644 --- a/build.gradle +++ b/build.gradle @@ -15,12 +15,6 @@ repositories { mavenCentral() } -dependencies { - implementation 'org.jetbrains:annotations:24.0.0' - testImplementation platform('org.junit:junit-bom:5.9.1') - testImplementation 'org.junit.jupiter:junit-jupiter' -} - test { useJUnitPlatform() } \ No newline at end of file From c9c80e060ee41897e44125550e911ad287d7e25c Mon Sep 17 00:00:00 2001 From: SW-H Date: Mon, 12 Jun 2023 06:31:22 +0900 Subject: [PATCH 09/49] =?UTF-8?q?refactor=20:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programmers/application/Calculator.java | 50 ++++++++----------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/src/main/java/co/programmers/application/Calculator.java b/src/main/java/co/programmers/application/Calculator.java index 82f02a2f7..17b5aafa2 100644 --- a/src/main/java/co/programmers/application/Calculator.java +++ b/src/main/java/co/programmers/application/Calculator.java @@ -2,8 +2,6 @@ import co.programmers.domain.Operator; import co.programmers.domain.UserMenu; -import co.programmers.view.CalculatorInputView; -import co.programmers.view.CalculatorOutputView; import co.programmers.view.InputView; import co.programmers.view.OutputView; import java.util.Stack; @@ -18,13 +16,6 @@ public Calculator(InputView inputView, OutputView outputView) { this.outputView = outputView; } - public static void main(String[] args) { - InputView inputView = new CalculatorInputView(); - OutputView outputView = new CalculatorOutputView(); - Calculator calculator = new Calculator(inputView, outputView); - calculator.run(); - } - public void run() { while (true) { UserMenu userMenu = UserMenu.get(inputView.inputUserMenu()); @@ -48,12 +39,12 @@ private Integer calculate(String input) { Stack Operands = new Stack<>(); Stack Operators = new Stack<>(); for (int i = 0; i < expression.length; i++) { - if (expression[i] == ' ') { + if (Character.isWhitespace(expression[i])) { continue; } - if (isInteger(expression[i])) { + if (Character.isDigit(expression[i])) { StringBuffer operand = new StringBuffer(); - while (i < expression.length && isInteger(expression[i])) { + while (i < expression.length && Character.isDigit(expression[i])) { operand.append(expression[i++]); } i--; @@ -61,12 +52,7 @@ private Integer calculate(String input) { } else if (expression[i] == '(') { Operators.push(expression[i]); } else if (expression[i] == ')') { - while (Operators.peek() != '(') { - Operands.push(Operator.calculate( - String.valueOf(Operators.pop()), Operands.pop(), Operands.pop() - )); - } - Operators.pop(); + evaluateOperators(Operands, Operators); } else { while (!Operators.empty() && comparePriority(expression[i], Operators.peek())) { Operands.push(Operator.calculate( @@ -76,20 +62,28 @@ private Integer calculate(String input) { Operators.push(expression[i]); } } - while (!Operators.empty()) { - Operands.push(Operator.calculate( - String.valueOf(Operators.pop()), Operands.pop(), Operands.pop() - )); - } + evaluateOperators(Operands, Operators); return Operands.pop(); } - private boolean comparePriority(char operator1, char operator2) { - return Operator.getSymbol(String.valueOf(operator1)).getPriority() > - Operator.getSymbol(String.valueOf(operator2)).getPriority(); + private void evaluateOperators(Stack operands, Stack operators) { + while (!operators.empty() && (operators.peek() != '(')) { + Character operator = operators.pop(); + Integer operand1 = operands.pop(); + Integer operand2 = operands.pop(); + int result = Operator.calculate( + String.valueOf(operator), operand1, operand2 + ); + operands.push(result); + } + + if (!operators.empty()) { + operators.pop(); + } } - private boolean isInteger(char c) { - return ('0' <= c && c <= '9'); + private boolean comparePriority(char operator1, char operator2) { + return Operator.getSymbol(String.valueOf(operator1)).getPriority() >= + Operator.getSymbol(String.valueOf(operator2)).getPriority(); } } \ No newline at end of file From 25a513e69faa861609c3cdc1491ca3702636d5f1 Mon Sep 17 00:00:00 2001 From: SW-H Date: Mon, 12 Jun 2023 06:32:10 +0900 Subject: [PATCH 10/49] =?UTF-8?q?refactor=20:=20=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=EB=A5=BC=20=ED=8F=AC=ED=95=A8=ED=95=9C=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/programmers/application/Application.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/co/programmers/application/Application.java diff --git a/src/main/java/co/programmers/application/Application.java b/src/main/java/co/programmers/application/Application.java new file mode 100644 index 000000000..ba4251fd7 --- /dev/null +++ b/src/main/java/co/programmers/application/Application.java @@ -0,0 +1,16 @@ +package co.programmers.application; + +import co.programmers.view.CalculatorInputView; +import co.programmers.view.CalculatorOutputView; +import co.programmers.view.InputView; +import co.programmers.view.OutputView; + +public class Application { + + public static void main(String[] args) { + InputView inputView = new CalculatorInputView(); + OutputView outputView = new CalculatorOutputView(); + Calculator calculator = new Calculator(inputView, outputView); + calculator.run(); + } +} From 6d94091685e757a176c6afddd8e1cebc3e9d7d28 Mon Sep 17 00:00:00 2001 From: SW-H Date: Mon, 12 Jun 2023 06:34:02 +0900 Subject: [PATCH 11/49] =?UTF-8?q?refactor=20:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EA=B0=9C=ED=96=89=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/programmers/application/Application.java | 2 +- src/main/java/co/programmers/view/CalculatorOutputView.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/co/programmers/application/Application.java b/src/main/java/co/programmers/application/Application.java index ba4251fd7..76c694dc6 100644 --- a/src/main/java/co/programmers/application/Application.java +++ b/src/main/java/co/programmers/application/Application.java @@ -13,4 +13,4 @@ public static void main(String[] args) { Calculator calculator = new Calculator(inputView, outputView); calculator.run(); } -} +} \ No newline at end of file diff --git a/src/main/java/co/programmers/view/CalculatorOutputView.java b/src/main/java/co/programmers/view/CalculatorOutputView.java index e5cb63af6..78acfb070 100644 --- a/src/main/java/co/programmers/view/CalculatorOutputView.java +++ b/src/main/java/co/programmers/view/CalculatorOutputView.java @@ -5,5 +5,4 @@ public class CalculatorOutputView implements OutputView { public void print(String content) { System.out.println(">> 결과 : " + content); } - -} +} \ No newline at end of file From 4d764caabcde15eecfb1fe01310996f64337e2db Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 14:02:34 +0900 Subject: [PATCH 12/49] =?UTF-8?q?feat=20:=20=EC=88=98=EC=8B=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/programmers/domain/Calculator.java | 67 +++++++++++++++++++ .../co/programmers/domain/Expression.java | 29 ++++++++ 2 files changed, 96 insertions(+) create mode 100644 src/main/java/co/programmers/domain/Calculator.java create mode 100644 src/main/java/co/programmers/domain/Expression.java diff --git a/src/main/java/co/programmers/domain/Calculator.java b/src/main/java/co/programmers/domain/Calculator.java new file mode 100644 index 000000000..380fa2af3 --- /dev/null +++ b/src/main/java/co/programmers/domain/Calculator.java @@ -0,0 +1,67 @@ +package co.programmers.domain; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class Calculator { + + private final Stack operators = new Stack<>(); + private final Stack calculationBuffer = new Stack<>(); + private final List postfix = new ArrayList<>(); + private String delimiter; + private String expression; + + public Calculator(String delimiter, String expression) { + this.delimiter = delimiter; + this.expression = expression; + } + + public static boolean isNumeric(String stringNumber) { + return stringNumber.chars().allMatch(Character::isDigit); + } + + public Integer calculate() throws ArithmeticException { + String postfixExpression = convertInfixToPostfix(); + for (String component : postfixExpression.split(delimiter)) { + evaluatePostfixComponent(component); + } + return calculationBuffer.pop(); + } + + private void evaluatePostfixComponent(String component) throws ArithmeticException { + if (isNumeric(component)) { + calculationBuffer.push(Integer.parseInt(component)); + return; + } + int operand2 = calculationBuffer.pop(); + int operand1 = calculationBuffer.pop(); + int intermediateResult = Operator.calculate(component, operand1, operand2); + calculationBuffer.push(intermediateResult); + } + + public String convertInfixToPostfix() { + preProcess(); + while (!operators.empty()) { + postfix.add(operators.pop()); + } + return String.join(" ", postfix); + } + + private void preProcess() { + for (String current : expression.split(delimiter)) { + evaluateOperationObject(current); + } + } + + private void evaluateOperationObject(String current) { + if (!Operator.isOperator(current)) { + postfix.add(current); + return; + } + while (!operators.empty() && Operator.hasLowerPrecedence(current, operators.peek())) { + postfix.add(operators.pop()); + } + operators.push(current); + } +} diff --git a/src/main/java/co/programmers/domain/Expression.java b/src/main/java/co/programmers/domain/Expression.java new file mode 100644 index 000000000..ce6a7442d --- /dev/null +++ b/src/main/java/co/programmers/domain/Expression.java @@ -0,0 +1,29 @@ +package co.programmers.domain; + +import co.programmers.exception.ExceptionMessage; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Expression { + + private static final Pattern EXPRESSION_FORMAT = Pattern.compile( + "(\\d+\\s[\\+\\-\\*\\/]\\s)+\\d+" + ); + private String expression; + + public Expression(String expression) { + this.expression = expression; + if (!validate()) { + throw new ArithmeticException(ExceptionMessage.INVALID_EXPRESSION); + } + } + + private boolean validate() { + Matcher matcher = EXPRESSION_FORMAT.matcher(expression); + return matcher.matches(); + } + + public String getExpression() { + return expression; + } +} From 882c684b98d9315060ee436032bc8cc2902005c3 Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 14:02:53 +0900 Subject: [PATCH 13/49] =?UTF-8?q?feat=20:=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programmers/application/Application.java | 16 ---- .../programmers/application/Calculator.java | 89 ------------------- 2 files changed, 105 deletions(-) delete mode 100644 src/main/java/co/programmers/application/Application.java delete mode 100644 src/main/java/co/programmers/application/Calculator.java diff --git a/src/main/java/co/programmers/application/Application.java b/src/main/java/co/programmers/application/Application.java deleted file mode 100644 index 76c694dc6..000000000 --- a/src/main/java/co/programmers/application/Application.java +++ /dev/null @@ -1,16 +0,0 @@ -package co.programmers.application; - -import co.programmers.view.CalculatorInputView; -import co.programmers.view.CalculatorOutputView; -import co.programmers.view.InputView; -import co.programmers.view.OutputView; - -public class Application { - - public static void main(String[] args) { - InputView inputView = new CalculatorInputView(); - OutputView outputView = new CalculatorOutputView(); - Calculator calculator = new Calculator(inputView, outputView); - calculator.run(); - } -} \ No newline at end of file diff --git a/src/main/java/co/programmers/application/Calculator.java b/src/main/java/co/programmers/application/Calculator.java deleted file mode 100644 index 17b5aafa2..000000000 --- a/src/main/java/co/programmers/application/Calculator.java +++ /dev/null @@ -1,89 +0,0 @@ -package co.programmers.application; - -import co.programmers.domain.Operator; -import co.programmers.domain.UserMenu; -import co.programmers.view.InputView; -import co.programmers.view.OutputView; -import java.util.Stack; - -public class Calculator { - - private final InputView inputView; - private final OutputView outputView; - - public Calculator(InputView inputView, OutputView outputView) { - this.inputView = inputView; - this.outputView = outputView; - } - - public void run() { - while (true) { - UserMenu userMenu = UserMenu.get(inputView.inputUserMenu()); - switch (userMenu) { - case INQUIRY: - // 구현 예정 - break; - case CALCULATE: - String expression = inputView.inputExpression(); - Integer output = calculate(expression); - outputView.print(String.valueOf(output)); - break; - case TERMINATE: - return; - } - } - } - - private Integer calculate(String input) { - char[] expression = input.toCharArray(); - Stack Operands = new Stack<>(); - Stack Operators = new Stack<>(); - for (int i = 0; i < expression.length; i++) { - if (Character.isWhitespace(expression[i])) { - continue; - } - if (Character.isDigit(expression[i])) { - StringBuffer operand = new StringBuffer(); - while (i < expression.length && Character.isDigit(expression[i])) { - operand.append(expression[i++]); - } - i--; - Operands.push(Integer.parseInt(operand.toString())); - } else if (expression[i] == '(') { - Operators.push(expression[i]); - } else if (expression[i] == ')') { - evaluateOperators(Operands, Operators); - } else { - while (!Operators.empty() && comparePriority(expression[i], Operators.peek())) { - Operands.push(Operator.calculate( - String.valueOf(Operators.pop()), Operands.pop(), Operands.pop() - )); - } - Operators.push(expression[i]); - } - } - evaluateOperators(Operands, Operators); - return Operands.pop(); - } - - private void evaluateOperators(Stack operands, Stack operators) { - while (!operators.empty() && (operators.peek() != '(')) { - Character operator = operators.pop(); - Integer operand1 = operands.pop(); - Integer operand2 = operands.pop(); - int result = Operator.calculate( - String.valueOf(operator), operand1, operand2 - ); - operands.push(result); - } - - if (!operators.empty()) { - operators.pop(); - } - } - - private boolean comparePriority(char operator1, char operator2) { - return Operator.getSymbol(String.valueOf(operator1)).getPriority() >= - Operator.getSymbol(String.valueOf(operator2)).getPriority(); - } -} \ No newline at end of file From 1a150a5a0b51eb07eb8e587841b5daa5bd80457f Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 14:04:16 +0900 Subject: [PATCH 14/49] =?UTF-8?q?feat=20:=20input/outputView=20=EC=A3=BC?= =?UTF-8?q?=EC=9E=85,=20=EC=84=A0=ED=83=9D=20=EB=A9=94=EB=89=B4=EB=B3=84?= =?UTF-8?q?=20=EC=88=98=ED=96=89=20=EB=A9=94=EC=86=8C=EB=93=9C=EB=A5=BC=20?= =?UTF-8?q?HashMap=EC=9C=BC=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/programmers/domain/CalculatorApp.java | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/main/java/co/programmers/domain/CalculatorApp.java diff --git a/src/main/java/co/programmers/domain/CalculatorApp.java b/src/main/java/co/programmers/domain/CalculatorApp.java new file mode 100644 index 000000000..cc2c952e4 --- /dev/null +++ b/src/main/java/co/programmers/domain/CalculatorApp.java @@ -0,0 +1,67 @@ +package co.programmers.domain; + +import static co.programmers.domain.UserMenu.CALCULATE; +import static co.programmers.domain.UserMenu.INQUIRY; +import static co.programmers.domain.UserMenu.TERMINATE; + +import co.programmers.view.CalculatorInputView; +import co.programmers.view.CalculatorOutputView; +import co.programmers.view.InputView; +import co.programmers.view.OutputView; +import java.util.HashMap; +import java.util.Map; + +public class CalculatorApp { + + private final Map menuToCommandMapper = new HashMap<>(); + private InputView inputView; + private OutputView outputView; + + private CalculatorApp() { + menuToCommandMapper.put(INQUIRY.getMenu(), this::executeInquiryMenu); + menuToCommandMapper.put(CALCULATE.getMenu(), this::executeCalculationMenu); + menuToCommandMapper.put(TERMINATE.getMenu(), () -> { + }); + } + + public CalculatorApp(InputView inputView, OutputView outputView) { + this(); + this.inputView = inputView; + this.outputView = outputView; + } + + public static void main(String[] args) { + InputView inputView = new CalculatorInputView(); + OutputView outputView = new CalculatorOutputView(); + CalculatorApp calculatorApp = new CalculatorApp(inputView, outputView); + try { + calculatorApp.run(); + } catch (IllegalArgumentException illegalArgumentException) { + System.out.println(illegalArgumentException.getMessage()); + } + } + + public void run() { + UserMenu userMenu; + do { + userMenu = UserMenu.get(inputView.inputUserMenu()); + Runnable command = menuToCommandMapper.get(userMenu.getMenu()); + command.run(); + } while (userMenu != TERMINATE); + } + + public void executeInquiryMenu() { + //TODO + } + + public void executeCalculationMenu() { + try { + Expression expression = inputView.inputExpression(); + Calculator calculator = new Calculator(" ", expression.getExpression()); + Integer output = calculator.calculate(); + outputView.printCalculationRes(output); + } catch (ArithmeticException | IllegalArgumentException arithmeticException) { + System.out.println(arithmeticException.getMessage()); + } + } +} From a3901a5be61ee4342f6d7ce32d4f2d13d8411a3e Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 14:05:03 +0900 Subject: [PATCH 15/49] =?UTF-8?q?feat=20:=20=EC=B6=9C=EB=A0=A5=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=82=B4=EC=9A=A9=20CalculatorInputView=20->=20Cal?= =?UTF-8?q?culatorOutputView=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programmers/view/CalculatorInputView.java | 53 +++---------------- .../view/CalculatorOutputView.java | 17 +++++- 2 files changed, 23 insertions(+), 47 deletions(-) diff --git a/src/main/java/co/programmers/view/CalculatorInputView.java b/src/main/java/co/programmers/view/CalculatorInputView.java index ce47f0b99..e5b462857 100644 --- a/src/main/java/co/programmers/view/CalculatorInputView.java +++ b/src/main/java/co/programmers/view/CalculatorInputView.java @@ -1,58 +1,21 @@ package co.programmers.view; -import co.programmers.exception.ExceptionMessage; -import co.programmers.domain.UserMenu; -import java.util.Arrays; +import co.programmers.domain.Expression; import java.util.Scanner; -import java.util.Set; -import java.util.stream.Collectors; public class CalculatorInputView implements InputView { private static final Scanner SCANNER = new Scanner(System.in); - private static final Set USER_MENU = - Arrays.stream(UserMenu.values()) - .map(UserMenu::getValue) - .collect(Collectors.toSet()); - public CalculatorInputView() { - } - - public String inputUserMenu() { - printMenuChoiceGuide(); - String userInput = SCANNER.next(); + public Integer inputUserMenu() { + CalculatorOutputView.printMenuChoiceGuide(); + Integer userInput = SCANNER.nextInt(); SCANNER.nextLine(); - try { - validateUserMenuChoice(String.valueOf(userInput)); - } catch (IllegalArgumentException illegalArgumentException) { - System.out.println(illegalArgumentException.getMessage()); - return UserMenu.TERMINATE.getValue(); - } return userInput; } - public String inputExpression() { - printCalculationGuide(); - String expression = SCANNER.nextLine(); - return expression; - } - - private void printCalculationGuide() { - System.out.println("1 + 2 * 3와 같은 형식으로 계산하고자 하는 식을 입력하세요."); - System.out.print("> "); - } - - private void printMenuChoiceGuide() { - System.out.println("\n[다음 중 원하시는 항목을 숫자로 입력하세요]"); - System.out.println("1. 조회"); - System.out.println("2. 계산"); - System.out.println("3. 종료"); - System.out.print("> 선택 : "); - } - - private void validateUserMenuChoice(String userInput) throws IllegalArgumentException { - if (!USER_MENU.contains(userInput)) { - throw new IllegalArgumentException(ExceptionMessage.INVALID_INPUT); - } + public Expression inputExpression() throws ArithmeticException { + CalculatorOutputView.printCalculationGuide(); + return new Expression(SCANNER.nextLine()); } -} \ No newline at end of file +} diff --git a/src/main/java/co/programmers/view/CalculatorOutputView.java b/src/main/java/co/programmers/view/CalculatorOutputView.java index 78acfb070..1b4b5af32 100644 --- a/src/main/java/co/programmers/view/CalculatorOutputView.java +++ b/src/main/java/co/programmers/view/CalculatorOutputView.java @@ -2,7 +2,20 @@ public class CalculatorOutputView implements OutputView { - public void print(String content) { + public static void printCalculationGuide() { + System.out.println("1 + 2 * 3와 같은 형식으로 계산하고자 하는 식을 입력하세요."); + System.out.print("> "); + } + + public static void printMenuChoiceGuide() { + System.out.println("\n[다음 중 원하시는 항목을 숫자로 입력하세요]"); + System.out.println("1. 조회"); + System.out.println("2. 계산"); + System.out.println("3. 종료"); + System.out.print("> 선택 : "); + } + + public void printCalculationRes(Integer content) { System.out.println(">> 결과 : " + content); } -} \ No newline at end of file +} From 451742ea18f58962276e017318a8e77e8dcaba0f Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 14:05:42 +0900 Subject: [PATCH 16/49] refactor --- src/main/java/co/programmers/exception/ExceptionMessage.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/co/programmers/exception/ExceptionMessage.java b/src/main/java/co/programmers/exception/ExceptionMessage.java index 0c389a09c..a3d636b1e 100644 --- a/src/main/java/co/programmers/exception/ExceptionMessage.java +++ b/src/main/java/co/programmers/exception/ExceptionMessage.java @@ -3,9 +3,9 @@ public class ExceptionMessage { public static final String DIVIDED_BY_ZERO = "0으로 나눌 수 없습니다."; - public static final String INVALID_SYMBOL = "잘못된 연산 기호입니다."; public static final String INVALID_INPUT = "잘못된 입력입니다"; + public static final String INVALID_EXPRESSION = "잘못된 수식입니다"; private ExceptionMessage() { } -} \ No newline at end of file +} From 775466d0d2fbeac2157b49a893357b331be5281a Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 14:06:28 +0900 Subject: [PATCH 17/49] =?UTF-8?q?feat=20:=20=EC=88=98=EC=8B=9D=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=EC=8B=9C=20Expression=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/programmers/view/InputView.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/co/programmers/view/InputView.java b/src/main/java/co/programmers/view/InputView.java index 023b86a9d..6bd3f37dd 100644 --- a/src/main/java/co/programmers/view/InputView.java +++ b/src/main/java/co/programmers/view/InputView.java @@ -1,8 +1,10 @@ package co.programmers.view; +import co.programmers.domain.Expression; + public interface InputView { - String inputUserMenu(); + Integer inputUserMenu(); - String inputExpression(); -} \ No newline at end of file + Expression inputExpression(); +} From 5e41f40ee09d8ec90ec5d8f79a44da92cd9944dd Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 14:07:15 +0900 Subject: [PATCH 18/49] =?UTF-8?q?feat=20:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EB=AC=B8=EB=B2=95=EC=9A=94=EC=86=8C=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0,=20=EC=97=B0=EC=82=B0=EC=9E=90=20=EC=9A=B0=EC=84=A0?= =?UTF-8?q?=EC=88=9C=EC=9C=84=20=EB=B9=84=EA=B5=90=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C(hasLowerPrecedence)=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/co/programmers/domain/Operator.java | 49 +++++++++---------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/src/main/java/co/programmers/domain/Operator.java b/src/main/java/co/programmers/domain/Operator.java index 6eaa1e193..3bb6007c0 100644 --- a/src/main/java/co/programmers/domain/Operator.java +++ b/src/main/java/co/programmers/domain/Operator.java @@ -1,41 +1,27 @@ package co.programmers.domain; import co.programmers.exception.ExceptionMessage; -import java.util.Collections; -import java.util.Map; -import java.util.Optional; +import java.util.Arrays; import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; public enum Operator { - ADDITION("+", 2, (operand1, operand2) -> Integer.valueOf( - operand1 + operand2 - )), - SUBTRACTION("-", 2, (operand1, operand2) -> Integer.valueOf( - operand2 - operand1 - )), - MULTIPLICATION("*", 1, (operand1, operand2) -> Integer.valueOf( - operand1 * operand2 - )), + ADDITION("+", 2, (operand1, operand2) -> operand1 + operand2), + SUBTRACTION("-", 2, (operand1, operand2) -> operand1 - operand2), + MULTIPLICATION("*", 1, (operand1, operand2) -> operand1 * operand2), DIVISION("/", 1, (operand1, operand2) -> { if (operand2 == 0) { - throw new IllegalArgumentException(ExceptionMessage.DIVIDED_BY_ZERO); + throw new ArithmeticException(ExceptionMessage.DIVIDED_BY_ZERO); } - return Integer.valueOf(operand1 / operand2); + return operand1 / operand2; }), OPENED_PARENTHESIS("(", 3, (operand1, operand2) -> 0), CLOSED_PARENTHESIS(")", 3, (operand1, operand2) -> 0); - private static final Map operators = - Collections.unmodifiableMap(Stream.of(values()) - .collect(Collectors.toMap(Operator::getSymbol, Function.identity()))); private final String symbol; private final int priority; private final BiFunction operation; - Operator(String symbol, int priority, BiFunction operation) { + private Operator(String symbol, int priority, BiFunction operation) { this.symbol = symbol; this.priority = priority; this.operation = operation; @@ -46,15 +32,26 @@ public static Integer calculate(String operator, Integer operand1, Integer opera } public static Operator getSymbol(String operator) { - return Optional.ofNullable(operators.get(operator)) - .orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.INVALID_SYMBOL)); + return Arrays.stream(values()) + .filter(o -> o.symbol.equals(operator)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.INVALID_INPUT)); } - private String getSymbol() { - return symbol; + public static boolean isOperator(String symbol) { + return !Arrays.stream(values()) + .filter(o -> o.symbol.equals(symbol)) + .findAny() + .isEmpty(); + } + + public static boolean hasLowerPrecedence(String current, String toCompare) { + Operator operator1 = getSymbol(current); + Operator operator2 = getSymbol(toCompare); + return (operator1.getPriority() >= operator2.getPriority()); } public int getPriority() { return priority; } -} \ No newline at end of file +} From 2590e8c7cf9962eb97f26684cf6a44cafd72536b Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 14:07:42 +0900 Subject: [PATCH 19/49] =?UTF-8?q?feat=20:=20=EA=B3=84=EC=82=B0=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=EC=9D=84=20=EC=9C=84=ED=95=B4=20?= =?UTF-8?q?=EC=9D=B8=EC=9E=90->Integer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/programmers/view/OutputView.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/co/programmers/view/OutputView.java b/src/main/java/co/programmers/view/OutputView.java index 6645f7046..8769735c6 100644 --- a/src/main/java/co/programmers/view/OutputView.java +++ b/src/main/java/co/programmers/view/OutputView.java @@ -2,6 +2,5 @@ public interface OutputView { - void print(String content); - -} \ No newline at end of file + void printCalculationRes(Integer content); +} From 6b66bc0778cb6525275d07f8185e40a30159fd2c Mon Sep 17 00:00:00 2001 From: SW-H Date: Wed, 14 Jun 2023 23:55:11 +0900 Subject: [PATCH 20/49] =?UTF-8?q?feat=20:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20Optional=20=EC=82=AD=EC=A0=9C,=20=EB=A9=94=EB=89=B4?= =?UTF-8?q?-Integer=20=EB=8C=80=EC=9D=91=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/co/programmers/domain/UserMenu.java | 34 ++++++++----------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/src/main/java/co/programmers/domain/UserMenu.java b/src/main/java/co/programmers/domain/UserMenu.java index 65548d728..585ca01fb 100644 --- a/src/main/java/co/programmers/domain/UserMenu.java +++ b/src/main/java/co/programmers/domain/UserMenu.java @@ -1,31 +1,25 @@ package co.programmers.domain; -import java.util.Collections; -import java.util.Map; -import java.util.Optional; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; +import co.programmers.exception.ExceptionMessage; +import java.util.Arrays; public enum UserMenu { - INQUIRY("1"), - CALCULATE("2"), - TERMINATE("3"); + INQUIRY(1), CALCULATE(2), TERMINATE(3), ERROR(4); - private static final Map values = - Collections.unmodifiableMap(Stream.of(values()) - .collect(Collectors.toMap(UserMenu::getValue, Function.identity()))); - private final String value; + private final Integer menu; - UserMenu(String value) { - this.value = value; + private UserMenu(Integer value) { + this.menu = value; } - public static UserMenu get(String input) { - return Optional.ofNullable(values.get(input)).orElse(TERMINATE); + public static UserMenu get(Integer input) { + return Arrays.stream(values()) + .filter(menuNum -> menuNum.menu.equals(input)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.INVALID_INPUT)); } - public String getValue() { - return value; + public Integer getMenu() { + return menu; } -} \ No newline at end of file +} From 2f88ba965192dd6455f7a3da81e5ce66cf8e2323 Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 14:36:52 +0900 Subject: [PATCH 21/49] =?UTF-8?q?feat=20:=20main=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EB=B3=84=EB=8F=84=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/programmers/App.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/java/co/programmers/App.java diff --git a/src/main/java/co/programmers/App.java b/src/main/java/co/programmers/App.java new file mode 100644 index 000000000..e62e39189 --- /dev/null +++ b/src/main/java/co/programmers/App.java @@ -0,0 +1,17 @@ +package co.programmers; + +import co.programmers.domain.CalculatorApp; +import co.programmers.view.CalculatorInputView; +import co.programmers.view.CalculatorOutputView; +import co.programmers.view.InputView; +import co.programmers.view.OutputView; + +public class App { + + public static void main(String[] args) { + InputView inputView = new CalculatorInputView(); + OutputView outputView = new CalculatorOutputView(); + CalculatorApp calculatorApp = new CalculatorApp(inputView, outputView); + calculatorApp.run(); + } +} From f154103c9eaa23226aaed137088c2dc34c794005 Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 14:38:20 +0900 Subject: [PATCH 22/49] =?UTF-8?q?feat=20:=20=EA=B3=84=EC=82=B0=20=EC=9D=B8?= =?UTF-8?q?=EC=9E=90=20->=20Double=20=ED=98=95=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=ED=99=98(=EB=82=98=EB=88=97=EC=85=88)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{Calculator.java => Calculation.java} | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) rename src/main/java/co/programmers/domain/{Calculator.java => Calculation.java} (67%) diff --git a/src/main/java/co/programmers/domain/Calculator.java b/src/main/java/co/programmers/domain/Calculation.java similarity index 67% rename from src/main/java/co/programmers/domain/Calculator.java rename to src/main/java/co/programmers/domain/Calculation.java index 380fa2af3..07fff67e7 100644 --- a/src/main/java/co/programmers/domain/Calculator.java +++ b/src/main/java/co/programmers/domain/Calculation.java @@ -4,16 +4,15 @@ import java.util.List; import java.util.Stack; -public class Calculator { +public class Calculation { + private static final String DELIMITER = " "; private final Stack operators = new Stack<>(); - private final Stack calculationBuffer = new Stack<>(); + private final Stack calculationBuffer = new Stack<>(); private final List postfix = new ArrayList<>(); - private String delimiter; - private String expression; + private Expression expression; - public Calculator(String delimiter, String expression) { - this.delimiter = delimiter; + public Calculation(Expression expression) { this.expression = expression; } @@ -21,9 +20,9 @@ public static boolean isNumeric(String stringNumber) { return stringNumber.chars().allMatch(Character::isDigit); } - public Integer calculate() throws ArithmeticException { + public Double calculate() throws ArithmeticException { String postfixExpression = convertInfixToPostfix(); - for (String component : postfixExpression.split(delimiter)) { + for (String component : postfixExpression.split(DELIMITER)) { evaluatePostfixComponent(component); } return calculationBuffer.pop(); @@ -31,12 +30,12 @@ public Integer calculate() throws ArithmeticException { private void evaluatePostfixComponent(String component) throws ArithmeticException { if (isNumeric(component)) { - calculationBuffer.push(Integer.parseInt(component)); + calculationBuffer.push(Double.parseDouble(component)); return; } - int operand2 = calculationBuffer.pop(); - int operand1 = calculationBuffer.pop(); - int intermediateResult = Operator.calculate(component, operand1, operand2); + Double operand2 = calculationBuffer.pop(); + Double operand1 = calculationBuffer.pop(); + Double intermediateResult = Operator.calculate(component, operand1, operand2); calculationBuffer.push(intermediateResult); } @@ -49,7 +48,7 @@ public String convertInfixToPostfix() { } private void preProcess() { - for (String current : expression.split(delimiter)) { + for (String current : expression.split(DELIMITER)) { evaluateOperationObject(current); } } From ddc919cdf5d10de1fcdcd8f1ccbca203829a3390 Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 14:38:45 +0900 Subject: [PATCH 23/49] =?UTF-8?q?feat=20:=20=ED=95=A8=EC=88=98=20=EB=A7=A4?= =?UTF-8?q?=ED=95=91=20HashMap=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/programmers/domain/CalculatorApp.java | 63 ++++++++----------- 1 file changed, 25 insertions(+), 38 deletions(-) diff --git a/src/main/java/co/programmers/domain/CalculatorApp.java b/src/main/java/co/programmers/domain/CalculatorApp.java index cc2c952e4..62b3e17e7 100644 --- a/src/main/java/co/programmers/domain/CalculatorApp.java +++ b/src/main/java/co/programmers/domain/CalculatorApp.java @@ -1,66 +1,53 @@ package co.programmers.domain; -import static co.programmers.domain.UserMenu.CALCULATE; -import static co.programmers.domain.UserMenu.INQUIRY; -import static co.programmers.domain.UserMenu.TERMINATE; - -import co.programmers.view.CalculatorInputView; import co.programmers.view.CalculatorOutputView; import co.programmers.view.InputView; import co.programmers.view.OutputView; -import java.util.HashMap; -import java.util.Map; public class CalculatorApp { - private final Map menuToCommandMapper = new HashMap<>(); - private InputView inputView; - private OutputView outputView; - - private CalculatorApp() { - menuToCommandMapper.put(INQUIRY.getMenu(), this::executeInquiryMenu); - menuToCommandMapper.put(CALCULATE.getMenu(), this::executeCalculationMenu); - menuToCommandMapper.put(TERMINATE.getMenu(), () -> { - }); - } + private final InputView inputView; + private final OutputView outputView; public CalculatorApp(InputView inputView, OutputView outputView) { - this(); this.inputView = inputView; this.outputView = outputView; } - public static void main(String[] args) { - InputView inputView = new CalculatorInputView(); - OutputView outputView = new CalculatorOutputView(); - CalculatorApp calculatorApp = new CalculatorApp(inputView, outputView); - try { - calculatorApp.run(); - } catch (IllegalArgumentException illegalArgumentException) { - System.out.println(illegalArgumentException.getMessage()); - } - } - public void run() { UserMenu userMenu; do { + CalculatorOutputView.printMenuChoiceGuide(); userMenu = UserMenu.get(inputView.inputUserMenu()); - Runnable command = menuToCommandMapper.get(userMenu.getMenu()); - command.run(); - } while (userMenu != TERMINATE); + executeSelectedMenu(userMenu); + } while (userMenu != UserMenu.TERMINATE); + } + + private void executeSelectedMenu(UserMenu userMenu) { + switch (userMenu) { + case INQUIRY: + inquiry(); + break; + case CALCULATE: + calculate(); + break; + case TERMINATE: + break; + } } - public void executeInquiryMenu() { + public void inquiry() { //TODO } - public void executeCalculationMenu() { + public void calculate() { try { + CalculatorOutputView.printCalculationGuide(); Expression expression = inputView.inputExpression(); - Calculator calculator = new Calculator(" ", expression.getExpression()); - Integer output = calculator.calculate(); - outputView.printCalculationRes(output); - } catch (ArithmeticException | IllegalArgumentException arithmeticException) { + Calculation calculator = new Calculation(expression); + Double output = calculator.calculate(); + outputView.printCalculationResult(output); + } catch (ArithmeticException arithmeticException) { System.out.println(arithmeticException.getMessage()); } } From 9b345812829a3cec96b6182e52c179c893f2b969 Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 14:39:51 +0900 Subject: [PATCH 24/49] =?UTF-8?q?feat=20:=20CalculatorInputView=20?= =?UTF-8?q?=EB=82=B4=EC=97=90=EC=84=9C=20=EC=B6=9C=EB=A0=A5=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=ED=98=B8=EC=B6=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/programmers/view/CalculatorInputView.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/co/programmers/view/CalculatorInputView.java b/src/main/java/co/programmers/view/CalculatorInputView.java index e5b462857..b54dfc912 100644 --- a/src/main/java/co/programmers/view/CalculatorInputView.java +++ b/src/main/java/co/programmers/view/CalculatorInputView.java @@ -8,14 +8,12 @@ public class CalculatorInputView implements InputView { private static final Scanner SCANNER = new Scanner(System.in); public Integer inputUserMenu() { - CalculatorOutputView.printMenuChoiceGuide(); Integer userInput = SCANNER.nextInt(); SCANNER.nextLine(); return userInput; } public Expression inputExpression() throws ArithmeticException { - CalculatorOutputView.printCalculationGuide(); return new Expression(SCANNER.nextLine()); } } From 9b943b9855990daebfe1141b6fc7d0da0df4ea63 Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 14:40:24 +0900 Subject: [PATCH 25/49] =?UTF-8?q?feat=20:=20=EA=B3=84=EC=82=B0=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20Integer=20->=20Double(=EB=82=98=EB=88=97=EC=85=88)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/programmers/view/CalculatorOutputView.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/co/programmers/view/CalculatorOutputView.java b/src/main/java/co/programmers/view/CalculatorOutputView.java index 1b4b5af32..b021097b7 100644 --- a/src/main/java/co/programmers/view/CalculatorOutputView.java +++ b/src/main/java/co/programmers/view/CalculatorOutputView.java @@ -15,7 +15,7 @@ public static void printMenuChoiceGuide() { System.out.print("> 선택 : "); } - public void printCalculationRes(Integer content) { - System.out.println(">> 결과 : " + content); + public void printCalculationResult(Double result) { + System.out.println(">> 결과 : " + result); } } From c6c5a68b5f5aeffcf15071d8d8832c0d39e1e2f2 Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 14:41:15 +0900 Subject: [PATCH 26/49] =?UTF-8?q?feat=20:=20=EB=AC=B8=EC=9E=90=EC=97=B4=20?= =?UTF-8?q?=EC=9E=90=EB=A5=B4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/programmers/domain/Expression.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/co/programmers/domain/Expression.java b/src/main/java/co/programmers/domain/Expression.java index ce6a7442d..42e7df465 100644 --- a/src/main/java/co/programmers/domain/Expression.java +++ b/src/main/java/co/programmers/domain/Expression.java @@ -26,4 +26,8 @@ private boolean validate() { public String getExpression() { return expression; } + + public String[] split(String delimiter) { + return expression.split(delimiter); + } } From 6d43a1389e3fca7a83fdefcc0a4dc72d474e2b36 Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 14:41:59 +0900 Subject: [PATCH 27/49] =?UTF-8?q?feat=20:=20=EA=B3=84=EC=82=B0=20=EC=9D=B8?= =?UTF-8?q?=EC=9E=90=20Integer=20->=20Double=20(=EB=82=98=EB=88=97?= =?UTF-8?q?=EC=85=88)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/programmers/domain/Operator.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/co/programmers/domain/Operator.java b/src/main/java/co/programmers/domain/Operator.java index 3bb6007c0..00a8cbbf6 100644 --- a/src/main/java/co/programmers/domain/Operator.java +++ b/src/main/java/co/programmers/domain/Operator.java @@ -13,21 +13,19 @@ public enum Operator { throw new ArithmeticException(ExceptionMessage.DIVIDED_BY_ZERO); } return operand1 / operand2; - }), - OPENED_PARENTHESIS("(", 3, (operand1, operand2) -> 0), - CLOSED_PARENTHESIS(")", 3, (operand1, operand2) -> 0); + }); private final String symbol; private final int priority; - private final BiFunction operation; + private final BiFunction operation; - private Operator(String symbol, int priority, BiFunction operation) { + private Operator(String symbol, int priority, BiFunction operation) { this.symbol = symbol; this.priority = priority; this.operation = operation; } - public static Integer calculate(String operator, Integer operand1, Integer operand2) { + public static Double calculate(String operator, Double operand1, Double operand2) { return getSymbol(operator).operation.apply(operand1, operand2); } From 97b393abb6c9d1de99ac91aa853b1be44e3459ee Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 14:42:05 +0900 Subject: [PATCH 28/49] =?UTF-8?q?feat=20:=20=EA=B3=84=EC=82=B0=20=EC=9D=B8?= =?UTF-8?q?=EC=9E=90=20Integer=20->=20Double=20(=EB=82=98=EB=88=97?= =?UTF-8?q?=EC=85=88)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/programmers/view/OutputView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/co/programmers/view/OutputView.java b/src/main/java/co/programmers/view/OutputView.java index 8769735c6..01aa87ec6 100644 --- a/src/main/java/co/programmers/view/OutputView.java +++ b/src/main/java/co/programmers/view/OutputView.java @@ -2,5 +2,5 @@ public interface OutputView { - void printCalculationRes(Integer content); + void printCalculationResult(Double result); } From 84540a2181b3a2d06ea7b59521314e68b3ea6c0c Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 20:16:00 +0900 Subject: [PATCH 29/49] =?UTF-8?q?feat=20:=20main=20=ED=95=A8=EC=88=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/programmers/App.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/co/programmers/App.java b/src/main/java/co/programmers/App.java index e62e39189..82ef4a1d9 100644 --- a/src/main/java/co/programmers/App.java +++ b/src/main/java/co/programmers/App.java @@ -8,10 +8,10 @@ public class App { - public static void main(String[] args) { - InputView inputView = new CalculatorInputView(); - OutputView outputView = new CalculatorOutputView(); - CalculatorApp calculatorApp = new CalculatorApp(inputView, outputView); - calculatorApp.run(); - } + public static void main(String[] args) { + InputView inputView = new CalculatorInputView(); + OutputView outputView = new CalculatorOutputView(); + CalculatorApp calculatorApp = new CalculatorApp(inputView, outputView); + calculatorApp.run(); + } } From eeb37963d67560b2f80183fe1fc7275abeb91d44 Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 20:18:09 +0900 Subject: [PATCH 30/49] =?UTF-8?q?feat=20:=20=EA=B3=84=EC=82=B0=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=88=98=EC=A0=95(=ED=9B=84=EC=9C=84=EC=97=B0?= =?UTF-8?q?=EC=82=B0=EC=8B=9D=20=EB=B3=80=ED=99=98=EC=97=86=EC=9D=B4=20?= =?UTF-8?q?=EC=97=B0=EC=82=B0=EC=9E=90=20=EC=9A=B0=EC=84=A0=20=EC=88=9C?= =?UTF-8?q?=EC=9C=84=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EA=B3=84=EC=82=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/programmers/domain/Calculation.java | 110 ++++++++---------- 1 file changed, 51 insertions(+), 59 deletions(-) diff --git a/src/main/java/co/programmers/domain/Calculation.java b/src/main/java/co/programmers/domain/Calculation.java index 07fff67e7..f234990d0 100644 --- a/src/main/java/co/programmers/domain/Calculation.java +++ b/src/main/java/co/programmers/domain/Calculation.java @@ -1,66 +1,58 @@ package co.programmers.domain; import java.util.ArrayList; -import java.util.List; -import java.util.Stack; public class Calculation { - private static final String DELIMITER = " "; - private final Stack operators = new Stack<>(); - private final Stack calculationBuffer = new Stack<>(); - private final List postfix = new ArrayList<>(); - private Expression expression; - - public Calculation(Expression expression) { - this.expression = expression; - } - - public static boolean isNumeric(String stringNumber) { - return stringNumber.chars().allMatch(Character::isDigit); - } - - public Double calculate() throws ArithmeticException { - String postfixExpression = convertInfixToPostfix(); - for (String component : postfixExpression.split(DELIMITER)) { - evaluatePostfixComponent(component); - } - return calculationBuffer.pop(); - } - - private void evaluatePostfixComponent(String component) throws ArithmeticException { - if (isNumeric(component)) { - calculationBuffer.push(Double.parseDouble(component)); - return; - } - Double operand2 = calculationBuffer.pop(); - Double operand1 = calculationBuffer.pop(); - Double intermediateResult = Operator.calculate(component, operand1, operand2); - calculationBuffer.push(intermediateResult); - } - - public String convertInfixToPostfix() { - preProcess(); - while (!operators.empty()) { - postfix.add(operators.pop()); - } - return String.join(" ", postfix); - } - - private void preProcess() { - for (String current : expression.split(DELIMITER)) { - evaluateOperationObject(current); - } - } - - private void evaluateOperationObject(String current) { - if (!Operator.isOperator(current)) { - postfix.add(current); - return; - } - while (!operators.empty() && Operator.hasLowerPrecedence(current, operators.peek())) { - postfix.add(operators.pop()); - } - operators.push(current); - } + private ArrayList parsedExpression; + private ArrayList operators; + private Expression expression; + + public Calculation(Expression expression) { + this.expression = expression; + parsedExpression = new ArrayList<>(); + operators = new ArrayList<>(); + } + + public Double calculate() throws ArithmeticException { + parsedExpression = expression.split(); + operators = extractOperators(); + Operator.decideCalculationOrder(operators); + for (String operator : operators) { + int operatorPosition = parsedExpression.indexOf(operator); + Double[] operands = extractOperands(operator); + Double calculationRes = Operator.calculate(operator, operands[0], operands[1]); + storeIntermediateResult(operatorPosition, calculationRes); + removeCompletedExpression(operatorPosition, operands.length); + } + return calcFinalResult(); + } + + private void removeCompletedExpression(int operatorPosition, int count) { + for (int cnt = 0; cnt < count; cnt++) { + parsedExpression.remove(operatorPosition); + } + } + + private void storeIntermediateResult(int operatorPosition, Double calculationRes) { + parsedExpression.add(operatorPosition - 1, String.valueOf(calculationRes)); + } + + private Double[] extractOperands(String operator) { + int operatorIdx = parsedExpression.indexOf(operator); + Double operand1 = Double.parseDouble(parsedExpression.get(operatorIdx - 1)); + Double operand2 = Double.parseDouble(parsedExpression.get(operatorIdx + 1)); + return new Double[] {operand1, operand2}; + } + + public ArrayList extractOperators() { + expression.eliminateWhiteSpace(); + ArrayList parsed = expression.split("\\d+"); + parsed.removeIf(String::isEmpty); + return parsed; + } + + private Double calcFinalResult() { + return Double.parseDouble(parsedExpression.get(0)); + } } From c37cdad7c86c16f3a73c81e9ce67e1ea2a965c5a Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 20:23:11 +0900 Subject: [PATCH 31/49] =?UTF-8?q?feat=20:=20=EC=88=98=EC=8B=9D=20=EB=82=B4?= =?UTF-8?q?=EC=9D=98=20=EA=B3=B5=EB=B0=B1=20=EC=A0=9C=EA=B1=B0,=20split?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/programmers/domain/Expression.java | 56 ++++++++++--------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/src/main/java/co/programmers/domain/Expression.java b/src/main/java/co/programmers/domain/Expression.java index 42e7df465..64da8b927 100644 --- a/src/main/java/co/programmers/domain/Expression.java +++ b/src/main/java/co/programmers/domain/Expression.java @@ -1,33 +1,39 @@ package co.programmers.domain; -import co.programmers.exception.ExceptionMessage; +import java.util.ArrayList; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import co.programmers.exception.ExceptionMessage; + public class Expression { - private static final Pattern EXPRESSION_FORMAT = Pattern.compile( - "(\\d+\\s[\\+\\-\\*\\/]\\s)+\\d+" - ); - private String expression; - - public Expression(String expression) { - this.expression = expression; - if (!validate()) { - throw new ArithmeticException(ExceptionMessage.INVALID_EXPRESSION); - } - } - - private boolean validate() { - Matcher matcher = EXPRESSION_FORMAT.matcher(expression); - return matcher.matches(); - } - - public String getExpression() { - return expression; - } - - public String[] split(String delimiter) { - return expression.split(delimiter); - } + private static final Pattern EXPRESSION_FORMAT = Pattern.compile("(\\d+\\s[\\+\\-\\*\\/]\\s)+\\d+"); + private static final String DELIMITER = " "; + private String expression; + + public Expression(String expression) { + this.expression = expression; + if (!validate()) { + throw new ArithmeticException(ExceptionMessage.INVALID_EXPRESSION); + } + } + + private boolean validate() { + Matcher matcher = EXPRESSION_FORMAT.matcher(expression); + return matcher.matches(); + } + + public List split() { + return new ArrayList<>(List.of(expression.split(DELIMITER))); + } + + public List split(String delimiter) { + return new ArrayList<>(List.of(expression.split(delimiter))); + } + + public void eliminateWhiteSpace() { + expression = expression.replaceAll("\\s", ""); + } } From 50cabb17dfd507264fdb6dc79088a44e099bd822 Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 20:23:59 +0900 Subject: [PATCH 32/49] =?UTF-8?q?refactor=20:=20list=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=20ArrayList=20->=20List?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/programmers/domain/Calculation.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/co/programmers/domain/Calculation.java b/src/main/java/co/programmers/domain/Calculation.java index f234990d0..d6a3aa591 100644 --- a/src/main/java/co/programmers/domain/Calculation.java +++ b/src/main/java/co/programmers/domain/Calculation.java @@ -1,11 +1,12 @@ package co.programmers.domain; import java.util.ArrayList; +import java.util.List; public class Calculation { - private ArrayList parsedExpression; - private ArrayList operators; + private List parsedExpression; + private List operators; private Expression expression; public Calculation(Expression expression) { @@ -45,9 +46,9 @@ private Double[] extractOperands(String operator) { return new Double[] {operand1, operand2}; } - public ArrayList extractOperators() { + public List extractOperators() { expression.eliminateWhiteSpace(); - ArrayList parsed = expression.split("\\d+"); + List parsed = expression.split("\\d+"); parsed.removeIf(String::isEmpty); return parsed; } From 0ac007e62562a06f644fd15afcd3b96993c3feef Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 20:24:30 +0900 Subject: [PATCH 33/49] =?UTF-8?q?feat=20:=20=EC=97=B0=EC=82=B0=EC=9E=90=20?= =?UTF-8?q?=EC=9A=B0=EC=84=A0=20=EC=88=9C=EC=9C=84=20=EA=B3=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/co/programmers/domain/Operator.java | 92 +++++++++---------- 1 file changed, 44 insertions(+), 48 deletions(-) diff --git a/src/main/java/co/programmers/domain/Operator.java b/src/main/java/co/programmers/domain/Operator.java index 00a8cbbf6..e26205020 100644 --- a/src/main/java/co/programmers/domain/Operator.java +++ b/src/main/java/co/programmers/domain/Operator.java @@ -1,55 +1,51 @@ package co.programmers.domain; -import co.programmers.exception.ExceptionMessage; import java.util.Arrays; +import java.util.Collections; +import java.util.List; import java.util.function.BiFunction; +import co.programmers.exception.ExceptionMessage; + public enum Operator { - ADDITION("+", 2, (operand1, operand2) -> operand1 + operand2), - SUBTRACTION("-", 2, (operand1, operand2) -> operand1 - operand2), - MULTIPLICATION("*", 1, (operand1, operand2) -> operand1 * operand2), - DIVISION("/", 1, (operand1, operand2) -> { - if (operand2 == 0) { - throw new ArithmeticException(ExceptionMessage.DIVIDED_BY_ZERO); - } - return operand1 / operand2; - }); - - private final String symbol; - private final int priority; - private final BiFunction operation; - - private Operator(String symbol, int priority, BiFunction operation) { - this.symbol = symbol; - this.priority = priority; - this.operation = operation; - } - - public static Double calculate(String operator, Double operand1, Double operand2) { - return getSymbol(operator).operation.apply(operand1, operand2); - } - - public static Operator getSymbol(String operator) { - return Arrays.stream(values()) - .filter(o -> o.symbol.equals(operator)) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.INVALID_INPUT)); - } - - public static boolean isOperator(String symbol) { - return !Arrays.stream(values()) - .filter(o -> o.symbol.equals(symbol)) - .findAny() - .isEmpty(); - } - - public static boolean hasLowerPrecedence(String current, String toCompare) { - Operator operator1 = getSymbol(current); - Operator operator2 = getSymbol(toCompare); - return (operator1.getPriority() >= operator2.getPriority()); - } - - public int getPriority() { - return priority; - } + ADDITION("+", 2, (operand1, operand2) -> operand1 + operand2), + SUBTRACTION("-", 2, (operand1, operand2) -> operand1 - operand2), + MULTIPLICATION("*", 1, (operand1, operand2) -> operand1 * operand2), + DIVISION("/", 1, (operand1, operand2) -> { + if (operand2 == 0) { + throw new ArithmeticException(ExceptionMessage.DIVIDED_BY_ZERO); + } + return operand1 / operand2; + }); + + private final String symbol; + private final int priority; + private final BiFunction operation; + + private Operator(String symbol, int priority, BiFunction operation) { + this.symbol = symbol; + this.priority = priority; + this.operation = operation; + } + + public static Double calculate(String operator, Double operand1, Double operand2) { + return getSymbol(operator).operation.apply(operand1, operand2); + } + + public static Operator getSymbol(Object operator) { + return Arrays.stream(values()) + .filter(o -> o.symbol.equals(operator)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.INVALID_INPUT)); + } + + public static void decideCalculationOrder(List operators) { + Collections.sort(operators, (operator1, operator2) -> + Integer.compare(getSymbol(operator1).getPriority(), getSymbol(operator2).getPriority()) + ); + } + + public int getPriority() { + return priority; + } } From 8b4ec3a21b1451bf7e036d228d96d6306c8e5761 Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 22:51:42 +0900 Subject: [PATCH 34/49] =?UTF-8?q?refactor=20:=20=EB=AF=B8=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/co/programmers/domain/UserMenu.java | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/main/java/co/programmers/domain/UserMenu.java b/src/main/java/co/programmers/domain/UserMenu.java index 585ca01fb..c219e1ac3 100644 --- a/src/main/java/co/programmers/domain/UserMenu.java +++ b/src/main/java/co/programmers/domain/UserMenu.java @@ -1,25 +1,22 @@ package co.programmers.domain; -import co.programmers.exception.ExceptionMessage; import java.util.Arrays; -public enum UserMenu { - INQUIRY(1), CALCULATE(2), TERMINATE(3), ERROR(4); +import co.programmers.exception.ExceptionMessage; - private final Integer menu; +public enum UserMenu { + INQUIRY(1), CALCULATE(2), TERMINATE(3), ERROR(4); - private UserMenu(Integer value) { - this.menu = value; - } + private final Integer menu; - public static UserMenu get(Integer input) { - return Arrays.stream(values()) - .filter(menuNum -> menuNum.menu.equals(input)) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.INVALID_INPUT)); - } + private UserMenu(Integer value) { + this.menu = value; + } - public Integer getMenu() { - return menu; - } + public static UserMenu get(Integer input) { + return Arrays.stream(values()) + .filter(menuNum -> menuNum.menu.equals(input)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.INVALID_INPUT)); + } } From a3544d812a776d042a193932335b2657663788dd Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 23:27:13 +0900 Subject: [PATCH 35/49] =?UTF-8?q?feat=20:=20=EC=97=86=EB=8A=94=20=EB=A9=94?= =?UTF-8?q?=EB=89=B4=EC=84=A0=ED=83=9D=EC=8B=9C=20=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/programmers/domain/CalculatorApp.java | 94 ++++++++++--------- 1 file changed, 49 insertions(+), 45 deletions(-) diff --git a/src/main/java/co/programmers/domain/CalculatorApp.java b/src/main/java/co/programmers/domain/CalculatorApp.java index 62b3e17e7..0ac2d96ca 100644 --- a/src/main/java/co/programmers/domain/CalculatorApp.java +++ b/src/main/java/co/programmers/domain/CalculatorApp.java @@ -1,54 +1,58 @@ package co.programmers.domain; +import co.programmers.exception.ExceptionMessage; import co.programmers.view.CalculatorOutputView; import co.programmers.view.InputView; import co.programmers.view.OutputView; public class CalculatorApp { - private final InputView inputView; - private final OutputView outputView; - - public CalculatorApp(InputView inputView, OutputView outputView) { - this.inputView = inputView; - this.outputView = outputView; - } - - public void run() { - UserMenu userMenu; - do { - CalculatorOutputView.printMenuChoiceGuide(); - userMenu = UserMenu.get(inputView.inputUserMenu()); - executeSelectedMenu(userMenu); - } while (userMenu != UserMenu.TERMINATE); - } - - private void executeSelectedMenu(UserMenu userMenu) { - switch (userMenu) { - case INQUIRY: - inquiry(); - break; - case CALCULATE: - calculate(); - break; - case TERMINATE: - break; - } - } - - public void inquiry() { - //TODO - } - - public void calculate() { - try { - CalculatorOutputView.printCalculationGuide(); - Expression expression = inputView.inputExpression(); - Calculation calculator = new Calculation(expression); - Double output = calculator.calculate(); - outputView.printCalculationResult(output); - } catch (ArithmeticException arithmeticException) { - System.out.println(arithmeticException.getMessage()); - } - } + private final InputView inputView; + private final OutputView outputView; + + public CalculatorApp(InputView inputView, OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + } + + public void run() { + UserMenu userMenu; + do { + CalculatorOutputView.printMenuChoiceGuide(); + userMenu = UserMenu.get(inputView.inputUserMenu()); + executeSelectedMenu(userMenu); + } while (userMenu != UserMenu.TERMINATE); + } + + private void executeSelectedMenu(UserMenu userMenu) { + switch (userMenu) { + case INQUIRY: + inquiry(); + break; + case CALCULATE: + calculate(); + break; + case TERMINATE: + break; + default: + outputView.printMessage(ExceptionMessage.INVALID_INPUT); + break; + } + } + + public void inquiry() { + //TODO + } + + public void calculate() { + try { + CalculatorOutputView.printCalculationGuide(); + Expression expression = inputView.inputExpression(); + Calculation calculator = new Calculation(expression); + Double output = calculator.calculate(); + outputView.printCalculationResult(output); + } catch (ArithmeticException arithmeticException) { + System.out.println(arithmeticException.getMessage()); + } + } } From ea158fe4d545db25b09817c186c4ee31ace14419 Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 23:30:21 +0900 Subject: [PATCH 36/49] =?UTF-8?q?feat=20:=20=EB=A9=94=EC=8B=9C=EC=A7=80=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=20=EB=A9=94=EC=86=8C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../view/CalculatorOutputView.java | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/main/java/co/programmers/view/CalculatorOutputView.java b/src/main/java/co/programmers/view/CalculatorOutputView.java index b021097b7..38b96b69a 100644 --- a/src/main/java/co/programmers/view/CalculatorOutputView.java +++ b/src/main/java/co/programmers/view/CalculatorOutputView.java @@ -1,21 +1,26 @@ package co.programmers.view; public class CalculatorOutputView implements OutputView { + public static void printCalculationGuide() { + System.out.println("1 + 2 * 3와 같은 형식으로 계산하고자 하는 식을 입력하세요."); + System.out.print("> "); + } - public static void printCalculationGuide() { - System.out.println("1 + 2 * 3와 같은 형식으로 계산하고자 하는 식을 입력하세요."); - System.out.print("> "); - } + public static void printMenuChoiceGuide() { + System.out.println("\n[다음 중 원하시는 항목을 숫자로 입력하세요]"); + System.out.println("1. 조회"); + System.out.println("2. 계산"); + System.out.println("3. 종료"); + System.out.print("> 선택 : "); + } - public static void printMenuChoiceGuide() { - System.out.println("\n[다음 중 원하시는 항목을 숫자로 입력하세요]"); - System.out.println("1. 조회"); - System.out.println("2. 계산"); - System.out.println("3. 종료"); - System.out.print("> 선택 : "); - } + @Override + public void printCalculationResult(Double result) { + System.out.println(">> 결과 : " + result); + } - public void printCalculationResult(Double result) { - System.out.println(">> 결과 : " + result); - } + @Override + public void printMessage(String message) { + System.out.println(message); + } } From 6f1519de725e2ab2d0ec88864f57ff76beb986c3 Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 23:30:26 +0900 Subject: [PATCH 37/49] =?UTF-8?q?feat=20:=20=EB=A9=94=EC=8B=9C=EC=A7=80=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=20=EB=A9=94=EC=86=8C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/programmers/view/OutputView.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/co/programmers/view/OutputView.java b/src/main/java/co/programmers/view/OutputView.java index 01aa87ec6..cea9ff73d 100644 --- a/src/main/java/co/programmers/view/OutputView.java +++ b/src/main/java/co/programmers/view/OutputView.java @@ -2,5 +2,7 @@ public interface OutputView { - void printCalculationResult(Double result); + void printCalculationResult(Double result); + + void printMessage(String message); } From 7fe46d5f2fc788ca73857900d4b7d57b39dc5c0a Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 23:31:04 +0900 Subject: [PATCH 38/49] =?UTF-8?q?feat=20:=20=EC=97=86=EB=8A=94=20=EB=A9=94?= =?UTF-8?q?=EB=89=B4=20=EC=84=A0=ED=83=9D=EC=8B=9C=20=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EB=B0=A9=EB=B2=95=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/programmers/domain/UserMenu.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/co/programmers/domain/UserMenu.java b/src/main/java/co/programmers/domain/UserMenu.java index c219e1ac3..93e719a3a 100644 --- a/src/main/java/co/programmers/domain/UserMenu.java +++ b/src/main/java/co/programmers/domain/UserMenu.java @@ -2,10 +2,8 @@ import java.util.Arrays; -import co.programmers.exception.ExceptionMessage; - public enum UserMenu { - INQUIRY(1), CALCULATE(2), TERMINATE(3), ERROR(4); + INQUIRY(1), CALCULATE(2), TERMINATE(3), ERROR(-9999); private final Integer menu; @@ -17,6 +15,6 @@ public static UserMenu get(Integer input) { return Arrays.stream(values()) .filter(menuNum -> menuNum.menu.equals(input)) .findFirst() - .orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.INVALID_INPUT)); + .orElse(ERROR); } } From aa527391602915f4ef6d637abb23d6863df09687 Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 15 Jun 2023 23:31:50 +0900 Subject: [PATCH 39/49] refactor --- .../programmers/view/CalculatorInputView.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/main/java/co/programmers/view/CalculatorInputView.java b/src/main/java/co/programmers/view/CalculatorInputView.java index b54dfc912..8001d8d3f 100644 --- a/src/main/java/co/programmers/view/CalculatorInputView.java +++ b/src/main/java/co/programmers/view/CalculatorInputView.java @@ -1,19 +1,22 @@ package co.programmers.view; -import co.programmers.domain.Expression; import java.util.Scanner; +import co.programmers.domain.Expression; + public class CalculatorInputView implements InputView { - private static final Scanner SCANNER = new Scanner(System.in); + private static final Scanner SCANNER = new Scanner(System.in); - public Integer inputUserMenu() { - Integer userInput = SCANNER.nextInt(); - SCANNER.nextLine(); - return userInput; - } + @Override + public Integer inputUserMenu() { + Integer userInput = SCANNER.nextInt(); + SCANNER.nextLine(); + return userInput; + } - public Expression inputExpression() throws ArithmeticException { - return new Expression(SCANNER.nextLine()); - } + @Override + public Expression inputExpression() throws ArithmeticException { + return new Expression(SCANNER.nextLine()); + } } From 202ce5d8fc991d1d898c405cebb82789ed3b0959 Mon Sep 17 00:00:00 2001 From: SW-H Date: Fri, 16 Jun 2023 01:50:11 +0900 Subject: [PATCH 40/49] =?UTF-8?q?feat=20:=20=EA=B3=84=EC=82=B0=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=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 --- src/main/java/co/programmers/domain/Calculation.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/co/programmers/domain/Calculation.java b/src/main/java/co/programmers/domain/Calculation.java index d6a3aa591..e1889f246 100644 --- a/src/main/java/co/programmers/domain/Calculation.java +++ b/src/main/java/co/programmers/domain/Calculation.java @@ -30,7 +30,7 @@ public Double calculate() throws ArithmeticException { } private void removeCompletedExpression(int operatorPosition, int count) { - for (int cnt = 0; cnt < count; cnt++) { + for (int cnt = 0; cnt <= count; cnt++) { parsedExpression.remove(operatorPosition); } } @@ -46,7 +46,7 @@ private Double[] extractOperands(String operator) { return new Double[] {operand1, operand2}; } - public List extractOperators() { + private List extractOperators() { expression.eliminateWhiteSpace(); List parsed = expression.split("\\d+"); parsed.removeIf(String::isEmpty); From 716fb12b84a61061f0b9467899e6bfedd7b8d09d Mon Sep 17 00:00:00 2001 From: SW-H Date: Fri, 16 Jun 2023 02:46:41 +0900 Subject: [PATCH 41/49] =?UTF-8?q?feat=20:=20=EC=9E=85=EB=A0=A5=EB=90=9C=20?= =?UTF-8?q?=EC=88=98=EC=8B=9D=20null=EC=9D=B8=20=EA=B2=BD=EC=9A=B0=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 --- src/main/java/co/programmers/domain/Expression.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/co/programmers/domain/Expression.java b/src/main/java/co/programmers/domain/Expression.java index 64da8b927..ed0bd0c6a 100644 --- a/src/main/java/co/programmers/domain/Expression.java +++ b/src/main/java/co/programmers/domain/Expression.java @@ -21,6 +21,9 @@ public Expression(String expression) { } private boolean validate() { + if (expression == null) { + throw new ArithmeticException(ExceptionMessage.INVALID_EXPRESSION); + } Matcher matcher = EXPRESSION_FORMAT.matcher(expression); return matcher.matches(); } From c2351bd5c85898659419f6f82cceb5beba8cfa57 Mon Sep 17 00:00:00 2001 From: SW-H Date: Fri, 16 Jun 2023 02:55:13 +0900 Subject: [PATCH 42/49] =?UTF-8?q?feat=20:=20=EC=9E=85=EB=A0=A5=EB=90=9C=20?= =?UTF-8?q?=EC=88=98=EC=8B=9D=20null=EC=9D=B8=20=EA=B2=BD=EC=9A=B0=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 --- src/main/java/co/programmers/domain/Expression.java | 7 ++++--- .../co/programmers/exception/ExceptionMessage.java | 11 ++++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/co/programmers/domain/Expression.java b/src/main/java/co/programmers/domain/Expression.java index ed0bd0c6a..363308863 100644 --- a/src/main/java/co/programmers/domain/Expression.java +++ b/src/main/java/co/programmers/domain/Expression.java @@ -15,15 +15,16 @@ public class Expression { public Expression(String expression) { this.expression = expression; + if (expression == null) { + throw new IllegalArgumentException(ExceptionMessage.EMPTY_INPUT); + } if (!validate()) { throw new ArithmeticException(ExceptionMessage.INVALID_EXPRESSION); } } private boolean validate() { - if (expression == null) { - throw new ArithmeticException(ExceptionMessage.INVALID_EXPRESSION); - } + Matcher matcher = EXPRESSION_FORMAT.matcher(expression); return matcher.matches(); } diff --git a/src/main/java/co/programmers/exception/ExceptionMessage.java b/src/main/java/co/programmers/exception/ExceptionMessage.java index a3d636b1e..08cb0c899 100644 --- a/src/main/java/co/programmers/exception/ExceptionMessage.java +++ b/src/main/java/co/programmers/exception/ExceptionMessage.java @@ -2,10 +2,11 @@ public class ExceptionMessage { - public static final String DIVIDED_BY_ZERO = "0으로 나눌 수 없습니다."; - public static final String INVALID_INPUT = "잘못된 입력입니다"; - public static final String INVALID_EXPRESSION = "잘못된 수식입니다"; + public static final String DIVIDED_BY_ZERO = "0으로 나눌 수 없습니다."; + public static final String INVALID_INPUT = "잘못된 입력입니다"; + public static final String INVALID_EXPRESSION = "잘못된 수식입니다"; + public static final String EMPTY_INPUT = "입력이 비어있습니다"; - private ExceptionMessage() { - } + private ExceptionMessage() { + } } From 1f42c10abeff11a19f9882891cd50c0517c4131e Mon Sep 17 00:00:00 2001 From: SW-H Date: Fri, 16 Jun 2023 02:56:20 +0900 Subject: [PATCH 43/49] =?UTF-8?q?feat=20:=20=EC=9E=85=EB=A0=A5=EB=90=9C=20?= =?UTF-8?q?=EC=88=98=EC=8B=9D=EC=9D=B4=20=EB=B9=88=20=EB=AC=B8=EC=9E=90?= =?UTF-8?q?=EC=97=B4=EC=9D=B8=20=EA=B2=BD=EC=9A=B0=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/programmers/domain/Expression.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/co/programmers/domain/Expression.java b/src/main/java/co/programmers/domain/Expression.java index 363308863..3f8b189b9 100644 --- a/src/main/java/co/programmers/domain/Expression.java +++ b/src/main/java/co/programmers/domain/Expression.java @@ -15,7 +15,7 @@ public class Expression { public Expression(String expression) { this.expression = expression; - if (expression == null) { + if (expression == null || expression.isEmpty()) { throw new IllegalArgumentException(ExceptionMessage.EMPTY_INPUT); } if (!validate()) { From 358117c5389078ad85790a537e08183c2e5f3da8 Mon Sep 17 00:00:00 2001 From: SW-H Date: Fri, 16 Jun 2023 04:11:44 +0900 Subject: [PATCH 44/49] =?UTF-8?q?feat=20:=20=EA=B3=84=EC=82=B0=20=EA=B8=B0?= =?UTF-8?q?=EB=A1=9D=20=EC=A0=80=EC=9E=A5=EC=9D=84=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=EC=86=8C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/programmers/App.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/co/programmers/App.java b/src/main/java/co/programmers/App.java index 82ef4a1d9..516cad909 100644 --- a/src/main/java/co/programmers/App.java +++ b/src/main/java/co/programmers/App.java @@ -1,6 +1,8 @@ package co.programmers; import co.programmers.domain.CalculatorApp; +import co.programmers.repository.CalculatorRepository; +import co.programmers.repository.Repository; import co.programmers.view.CalculatorInputView; import co.programmers.view.CalculatorOutputView; import co.programmers.view.InputView; @@ -11,7 +13,8 @@ public class App { public static void main(String[] args) { InputView inputView = new CalculatorInputView(); OutputView outputView = new CalculatorOutputView(); - CalculatorApp calculatorApp = new CalculatorApp(inputView, outputView); + Repository repository = new CalculatorRepository(); + CalculatorApp calculatorApp = new CalculatorApp(inputView, outputView, repository); calculatorApp.run(); } } From f635ecb17f75cdb090b8972e931f991cbc5b5498 Mon Sep 17 00:00:00 2001 From: SW-H Date: Fri, 16 Jun 2023 04:12:42 +0900 Subject: [PATCH 45/49] =?UTF-8?q?feat=20:=20=EA=B3=84=EC=82=B0=20=EA=B8=B0?= =?UTF-8?q?=EB=A1=9D=20=EC=A0=80=EC=9E=A5=EC=9D=84=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=EC=86=8C=20=EC=B6=94=EA=B0=80,=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/programmers/domain/CalculatorApp.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/co/programmers/domain/CalculatorApp.java b/src/main/java/co/programmers/domain/CalculatorApp.java index 0ac2d96ca..0df1b66a0 100644 --- a/src/main/java/co/programmers/domain/CalculatorApp.java +++ b/src/main/java/co/programmers/domain/CalculatorApp.java @@ -1,6 +1,7 @@ package co.programmers.domain; import co.programmers.exception.ExceptionMessage; +import co.programmers.repository.Repository; import co.programmers.view.CalculatorOutputView; import co.programmers.view.InputView; import co.programmers.view.OutputView; @@ -9,10 +10,12 @@ public class CalculatorApp { private final InputView inputView; private final OutputView outputView; + private final Repository repository; - public CalculatorApp(InputView inputView, OutputView outputView) { + public CalculatorApp(InputView inputView, OutputView outputView, Repository repository) { this.inputView = inputView; this.outputView = outputView; + this.repository = repository; } public void run() { @@ -41,7 +44,7 @@ private void executeSelectedMenu(UserMenu userMenu) { } public void inquiry() { - //TODO + outputView.printCalculationHistory(repository.read()); } public void calculate() { @@ -51,6 +54,7 @@ public void calculate() { Calculation calculator = new Calculation(expression); Double output = calculator.calculate(); outputView.printCalculationResult(output); + repository.save(expression.getExpression(), output); } catch (ArithmeticException arithmeticException) { System.out.println(arithmeticException.getMessage()); } From 06b76d3aecf3f904b1219aa818879c4262da9a04 Mon Sep 17 00:00:00 2001 From: SW-H Date: Fri, 16 Jun 2023 04:13:44 +0900 Subject: [PATCH 46/49] =?UTF-8?q?feat=20:=20=EA=B3=84=EC=82=B0=20=EA=B8=B0?= =?UTF-8?q?=EB=A1=9D=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/co/programmers/view/CalculatorOutputView.java | 10 ++++++++++ src/main/java/co/programmers/view/OutputView.java | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/src/main/java/co/programmers/view/CalculatorOutputView.java b/src/main/java/co/programmers/view/CalculatorOutputView.java index 38b96b69a..2e4f73a70 100644 --- a/src/main/java/co/programmers/view/CalculatorOutputView.java +++ b/src/main/java/co/programmers/view/CalculatorOutputView.java @@ -1,5 +1,7 @@ package co.programmers.view; +import java.util.Map; + public class CalculatorOutputView implements OutputView { public static void printCalculationGuide() { System.out.println("1 + 2 * 3와 같은 형식으로 계산하고자 하는 식을 입력하세요."); @@ -23,4 +25,12 @@ public void printCalculationResult(Double result) { public void printMessage(String message) { System.out.println(message); } + + @Override + public void printCalculationHistory(Map history) { + System.out.println(">> 계산 기록 조회"); + for (Map.Entry oneExpression : history.entrySet()) { + System.out.println(oneExpression.getKey() + " = " + oneExpression.getValue()); + } + } } diff --git a/src/main/java/co/programmers/view/OutputView.java b/src/main/java/co/programmers/view/OutputView.java index cea9ff73d..a216ddfff 100644 --- a/src/main/java/co/programmers/view/OutputView.java +++ b/src/main/java/co/programmers/view/OutputView.java @@ -1,8 +1,12 @@ package co.programmers.view; +import java.util.Map; + public interface OutputView { void printCalculationResult(Double result); void printMessage(String message); + + void printCalculationHistory(Map read); } From 84ff197212ddc00ca4864f21067a9657854b3bdd Mon Sep 17 00:00:00 2001 From: SW-H Date: Fri, 16 Jun 2023 04:13:59 +0900 Subject: [PATCH 47/49] =?UTF-8?q?feat=20:=20=EC=88=98=EC=8B=9D=20getter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/programmers/domain/Expression.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/co/programmers/domain/Expression.java b/src/main/java/co/programmers/domain/Expression.java index 3f8b189b9..96fbc3c42 100644 --- a/src/main/java/co/programmers/domain/Expression.java +++ b/src/main/java/co/programmers/domain/Expression.java @@ -40,4 +40,8 @@ public List split(String delimiter) { public void eliminateWhiteSpace() { expression = expression.replaceAll("\\s", ""); } + + public String getExpression() { + return expression; + } } From 49675ef33cb0d69b61d6de4e8dbe37a2eebd99e2 Mon Sep 17 00:00:00 2001 From: SW-H Date: Fri, 16 Jun 2023 04:14:26 +0900 Subject: [PATCH 48/49] =?UTF-8?q?feat=20:=20=EA=B3=84=EC=82=B0=20=EA=B8=B0?= =?UTF-8?q?=EB=A1=9D=20=EC=A0=80=EC=9E=A5=EC=9D=84=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=EC=86=8C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/CalculatorRepository.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/java/co/programmers/repository/CalculatorRepository.java diff --git a/src/main/java/co/programmers/repository/CalculatorRepository.java b/src/main/java/co/programmers/repository/CalculatorRepository.java new file mode 100644 index 000000000..2f6f880d6 --- /dev/null +++ b/src/main/java/co/programmers/repository/CalculatorRepository.java @@ -0,0 +1,18 @@ +package co.programmers.repository; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class CalculatorRepository implements Repository { + private static final Map storage = new LinkedHashMap<>(); + + @Override + public void save(String expression, Double result) { + storage.put(expression, result); + } + + @Override + public Map read() { + return storage; + } +} From 62afa70e2f77f7911e97907ed7b4affa7e89157c Mon Sep 17 00:00:00 2001 From: SW-H Date: Sat, 17 Jun 2023 00:16:54 +0900 Subject: [PATCH 49/49] =?UTF-8?q?feat=20:=20=EA=B3=84=EC=82=B0=20=EA=B8=B0?= =?UTF-8?q?=EB=A1=9D=20=EC=A0=80=EC=9E=A5=EC=9D=84=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=EC=86=8C=20=EC=9D=B8=ED=84=B0=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/programmers/repository/Repository.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/main/java/co/programmers/repository/Repository.java diff --git a/src/main/java/co/programmers/repository/Repository.java b/src/main/java/co/programmers/repository/Repository.java new file mode 100644 index 000000000..c9fbf9123 --- /dev/null +++ b/src/main/java/co/programmers/repository/Repository.java @@ -0,0 +1,9 @@ +package co.programmers.repository; + +import java.util.Map; + +public interface Repository { + void save(String expression, Double result); + + Map read(); +}