From 79bf9b07cfe3004b2541ea60657354b86163272e Mon Sep 17 00:00:00 2001 From: baejunil Date: Mon, 12 Jun 2023 22:23:33 +0900 Subject: [PATCH 01/17] =?UTF-8?q?chore=20:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EC=B4=88=EA=B8=B0=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 175 ++++++++++++++++++ calculator/build.gradle | 19 ++ calculator/settings.gradle | 2 + .../src/main/java/com/programmers/Main.java | 7 + 4 files changed, 203 insertions(+) create mode 100644 .gitignore create mode 100644 calculator/build.gradle create mode 100644 calculator/settings.gradle create mode 100644 calculator/src/main/java/com/programmers/Main.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..8377beb81 --- /dev/null +++ b/.gitignore @@ -0,0 +1,175 @@ +# Created by https://www.toptal.com/developers/gitignore/api/java,intellij,gradle +# Edit at https://www.toptal.com/developers/gitignore?templates=java,intellij,gradle + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +.idea +gradle +gradlew +gradlew.bat + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/sonarlint/ + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator-enh.xml +.idea/**/markdown-navigator/ + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 +.idea/$CACHE_FILE$ + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream +.idea/codestream.xml + +# Azure Toolkit for IntelliJ plugin +# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij +.idea/**/azureSettings.xml + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* + +### Gradle ### +.gradle +**/build/ +!src/**/build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Avoid ignore Gradle wrappper properties +!gradle-wrapper.properties + +# Cache of project +.gradletasknamecache + +# Eclipse Gradle plugin generated files +# Eclipse Core +.project +# JDT-specific (Eclipse Java Development Tools) +.classpath + +### Gradle Patch ### +# Java heap dump +*.hprof + +# End of https://www.toptal.com/developers/gitignore/api/java,intellij,gradle \ No newline at end of file diff --git a/calculator/build.gradle b/calculator/build.gradle new file mode 100644 index 000000000..d34c89625 --- /dev/null +++ b/calculator/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'java' +} + +group 'com.programmers' +version '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/calculator/settings.gradle b/calculator/settings.gradle new file mode 100644 index 000000000..4b53eb355 --- /dev/null +++ b/calculator/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'calculator' + diff --git a/calculator/src/main/java/com/programmers/Main.java b/calculator/src/main/java/com/programmers/Main.java new file mode 100644 index 000000000..c7adf0100 --- /dev/null +++ b/calculator/src/main/java/com/programmers/Main.java @@ -0,0 +1,7 @@ +package com.programmers; + +public class Main { + public static void main(String[] args) { + System.out.println("Hello world!"); + } +} \ No newline at end of file From 6f4fd48b9ce7a8ff908c2050fe2ea57f7ce94ed4 Mon Sep 17 00:00:00 2001 From: baejunil Date: Tue, 13 Jun 2023 02:34:10 +0900 Subject: [PATCH 02/17] =?UTF-8?q?chore=20:=20build.gradle=EC=97=90=20lombo?= =?UTF-8?q?k=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- calculator/build.gradle | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/calculator/build.gradle b/calculator/build.gradle index d34c89625..52e051878 100644 --- a/calculator/build.gradle +++ b/calculator/build.gradle @@ -12,6 +12,11 @@ repositories { dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' + + compileOnly 'org.projectlombok:lombok:1.18.28' + annotationProcessor 'org.projectlombok:lombok:1.18.28' + testCompileOnly 'org.projectlombok:lombok:1.18.28' + testAnnotationProcessor 'org.projectlombok:lombok:1.18.28' } test { From a1d42bbdf9a5d75c91248950507eaaf45b22d5af Mon Sep 17 00:00:00 2001 From: baejunil Date: Tue, 13 Jun 2023 02:49:18 +0900 Subject: [PATCH 03/17] =?UTF-8?q?feat=20:=20I/O=20=EA=B5=AC=ED=98=84,=20Me?= =?UTF-8?q?nu=20=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/programmers/App.java | 15 ++++++++ .../main/java/com/programmers/Calculator.java | 36 +++++++++++++++++++ .../src/main/java/com/programmers/Main.java | 7 ---- .../main/java/com/programmers/io/Input.java | 6 ++++ .../main/java/com/programmers/io/Output.java | 10 ++++++ .../programmers/model/CalculationFormula.java | 12 +++++++ .../main/java/com/programmers/model/Menu.java | 31 ++++++++++++++++ 7 files changed, 110 insertions(+), 7 deletions(-) create mode 100644 calculator/src/main/java/com/programmers/App.java create mode 100644 calculator/src/main/java/com/programmers/Calculator.java delete mode 100644 calculator/src/main/java/com/programmers/Main.java create mode 100644 calculator/src/main/java/com/programmers/io/Input.java create mode 100644 calculator/src/main/java/com/programmers/io/Output.java create mode 100644 calculator/src/main/java/com/programmers/model/CalculationFormula.java create mode 100644 calculator/src/main/java/com/programmers/model/Menu.java diff --git a/calculator/src/main/java/com/programmers/App.java b/calculator/src/main/java/com/programmers/App.java new file mode 100644 index 000000000..9dfc0663f --- /dev/null +++ b/calculator/src/main/java/com/programmers/App.java @@ -0,0 +1,15 @@ +package com.programmers; + +import com.programmers.model.CalculationFormula; +import com.programmers.model.Menu; + +public class App { + + public static void main(String[] args) { + Menu menu = new Menu(); + CalculationFormula calculationFormula = new CalculationFormula(); + Calculator calculator = new Calculator(menu, menu, calculationFormula); + + calculator.run(); + } +} \ No newline at end of file diff --git a/calculator/src/main/java/com/programmers/Calculator.java b/calculator/src/main/java/com/programmers/Calculator.java new file mode 100644 index 000000000..555ab6aef --- /dev/null +++ b/calculator/src/main/java/com/programmers/Calculator.java @@ -0,0 +1,36 @@ +package com.programmers; + +import com.programmers.io.Input; +import com.programmers.io.Output; +import com.programmers.model.CalculationFormula; +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class Calculator implements Runnable { + + private final Input input; + private final Output output; + private final CalculationFormula calculationFormula; + + @Override + public void run() { + while (true) { + // 메뉴 보여주기 + output.showMenu(); + + switch (input.selectOption()) { + case 1: + calculationFormula.showResult(); + continue; + case 2: + calculationFormula.calculate(); + continue; + case 3: + output.exit(); + return; + default: + output.incorrectOption(); + } + } + } +} diff --git a/calculator/src/main/java/com/programmers/Main.java b/calculator/src/main/java/com/programmers/Main.java deleted file mode 100644 index c7adf0100..000000000 --- a/calculator/src/main/java/com/programmers/Main.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.programmers; - -public class Main { - public static void main(String[] args) { - System.out.println("Hello world!"); - } -} \ No newline at end of file diff --git a/calculator/src/main/java/com/programmers/io/Input.java b/calculator/src/main/java/com/programmers/io/Input.java new file mode 100644 index 000000000..f2c56e6ce --- /dev/null +++ b/calculator/src/main/java/com/programmers/io/Input.java @@ -0,0 +1,6 @@ +package com.programmers.io; + +public interface Input { + + int selectOption(); +} diff --git a/calculator/src/main/java/com/programmers/io/Output.java b/calculator/src/main/java/com/programmers/io/Output.java new file mode 100644 index 000000000..0578e9208 --- /dev/null +++ b/calculator/src/main/java/com/programmers/io/Output.java @@ -0,0 +1,10 @@ +package com.programmers.io; + +public interface Output { + + void showMenu(); + + void exit(); + + void incorrectOption(); +} diff --git a/calculator/src/main/java/com/programmers/model/CalculationFormula.java b/calculator/src/main/java/com/programmers/model/CalculationFormula.java new file mode 100644 index 000000000..4d940943a --- /dev/null +++ b/calculator/src/main/java/com/programmers/model/CalculationFormula.java @@ -0,0 +1,12 @@ +package com.programmers.model; + +public class CalculationFormula { + + public void showResult() { + System.out.println("답은 이거"); + } + + public void calculate() { + System.out.println("계산했다."); + } +} diff --git a/calculator/src/main/java/com/programmers/model/Menu.java b/calculator/src/main/java/com/programmers/model/Menu.java new file mode 100644 index 000000000..2745bb64b --- /dev/null +++ b/calculator/src/main/java/com/programmers/model/Menu.java @@ -0,0 +1,31 @@ +package com.programmers.model; + +import com.programmers.io.Input; +import com.programmers.io.Output; +import java.util.Scanner; + +public class Menu implements Input, Output { + + private final Scanner scanner = new Scanner(System.in); + + @Override + public int selectOption() { + System.out.print("선택 : "); + return Integer.parseInt(scanner.nextLine()); + } + + @Override + public void showMenu() { + System.out.println("1. 조회\n2. 계산 \n3. 종료\n"); + } + + @Override + public void exit() { + System.out.println("종료할게"); + } + + @Override + public void incorrectOption() { + System.out.println("올바른 답이 아니야"); + } +} From 3d7c46f6fa9b55fdf9040bbad7f6e7b4a61d080b Mon Sep 17 00:00:00 2001 From: baejunil Date: Thu, 15 Jun 2023 01:03:08 +0900 Subject: [PATCH 04/17] =?UTF-8?q?feat=20:=20=EA=B3=84=EC=82=B0=EC=8B=9D=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EB=B0=9B=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- calculator/src/main/java/com/programmers/Calculator.java | 4 +++- calculator/src/main/java/com/programmers/io/Input.java | 2 ++ .../java/com/programmers/model/CalculationFormula.java | 8 +++++++- calculator/src/main/java/com/programmers/model/Menu.java | 7 +++++++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/calculator/src/main/java/com/programmers/Calculator.java b/calculator/src/main/java/com/programmers/Calculator.java index 555ab6aef..d32f462d6 100644 --- a/calculator/src/main/java/com/programmers/Calculator.java +++ b/calculator/src/main/java/com/programmers/Calculator.java @@ -3,6 +3,7 @@ import com.programmers.io.Input; import com.programmers.io.Output; import com.programmers.model.CalculationFormula; +import com.programmers.model.Menu; import lombok.AllArgsConstructor; @AllArgsConstructor @@ -11,11 +12,11 @@ public class Calculator implements Runnable { private final Input input; private final Output output; private final CalculationFormula calculationFormula; + private final Menu menu; @Override public void run() { while (true) { - // 메뉴 보여주기 output.showMenu(); switch (input.selectOption()) { @@ -23,6 +24,7 @@ public void run() { calculationFormula.showResult(); continue; case 2: + menu.getCalculationFormula(); calculationFormula.calculate(); continue; case 3: diff --git a/calculator/src/main/java/com/programmers/io/Input.java b/calculator/src/main/java/com/programmers/io/Input.java index f2c56e6ce..ecc9c6fba 100644 --- a/calculator/src/main/java/com/programmers/io/Input.java +++ b/calculator/src/main/java/com/programmers/io/Input.java @@ -3,4 +3,6 @@ public interface Input { int selectOption(); + + String getCalculationFormula(); } diff --git a/calculator/src/main/java/com/programmers/model/CalculationFormula.java b/calculator/src/main/java/com/programmers/model/CalculationFormula.java index 4d940943a..af73e9bf9 100644 --- a/calculator/src/main/java/com/programmers/model/CalculationFormula.java +++ b/calculator/src/main/java/com/programmers/model/CalculationFormula.java @@ -3,10 +3,16 @@ public class CalculationFormula { public void showResult() { + // 저장한 계산결과 출력 System.out.println("답은 이거"); } public void calculate() { - System.out.println("계산했다."); + // 중위 표기식 -> 후위 표기식 + // 후위 표기식 계산 + // 계산 결과 출력 + // 계산 결과 저장 } + + } diff --git a/calculator/src/main/java/com/programmers/model/Menu.java b/calculator/src/main/java/com/programmers/model/Menu.java index 2745bb64b..33416cf5b 100644 --- a/calculator/src/main/java/com/programmers/model/Menu.java +++ b/calculator/src/main/java/com/programmers/model/Menu.java @@ -14,6 +14,13 @@ public int selectOption() { return Integer.parseInt(scanner.nextLine()); } + @Override + public String getCalculationFormula() { + String infix = scanner.nextLine(); + infix = infix.replaceAll("\\s+", ""); + return infix; + } + @Override public void showMenu() { System.out.println("1. 조회\n2. 계산 \n3. 종료\n"); From ced7dc873aeb33e3020ad4292a81c6da3d417fd2 Mon Sep 17 00:00:00 2001 From: baejunil Date: Thu, 15 Jun 2023 01:14:17 +0900 Subject: [PATCH 05/17] =?UTF-8?q?feat=20:=20=EC=A4=91=EC=9C=84=20=ED=91=9C?= =?UTF-8?q?=EA=B8=B0=EC=8B=9D=EC=9D=84=20=ED=9B=84=EC=9C=84=20=ED=91=9C?= =?UTF-8?q?=EA=B8=B0=EC=8B=9D=EC=9C=BC=EB=A1=9C=20=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- calculator/src/main/java/com/programmers/App.java | 2 +- calculator/src/main/java/com/programmers/Calculator.java | 4 ++-- .../main/java/com/programmers/model/CalculationFormula.java | 5 ++++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/calculator/src/main/java/com/programmers/App.java b/calculator/src/main/java/com/programmers/App.java index 9dfc0663f..1c0f4afd5 100644 --- a/calculator/src/main/java/com/programmers/App.java +++ b/calculator/src/main/java/com/programmers/App.java @@ -8,7 +8,7 @@ public class App { public static void main(String[] args) { Menu menu = new Menu(); CalculationFormula calculationFormula = new CalculationFormula(); - Calculator calculator = new Calculator(menu, menu, calculationFormula); + Calculator calculator = new Calculator(menu, menu, calculationFormula, menu); calculator.run(); } diff --git a/calculator/src/main/java/com/programmers/Calculator.java b/calculator/src/main/java/com/programmers/Calculator.java index d32f462d6..294498973 100644 --- a/calculator/src/main/java/com/programmers/Calculator.java +++ b/calculator/src/main/java/com/programmers/Calculator.java @@ -24,8 +24,8 @@ public void run() { calculationFormula.showResult(); continue; case 2: - menu.getCalculationFormula(); - calculationFormula.calculate(); + String formula = menu.getCalculationFormula(); + calculationFormula.calculate(formula); continue; case 3: output.exit(); diff --git a/calculator/src/main/java/com/programmers/model/CalculationFormula.java b/calculator/src/main/java/com/programmers/model/CalculationFormula.java index af73e9bf9..afd66fc56 100644 --- a/calculator/src/main/java/com/programmers/model/CalculationFormula.java +++ b/calculator/src/main/java/com/programmers/model/CalculationFormula.java @@ -1,5 +1,7 @@ package com.programmers.model; +import com.programmers.converter.InfixToPostfix; + public class CalculationFormula { public void showResult() { @@ -7,8 +9,9 @@ public void showResult() { System.out.println("답은 이거"); } - public void calculate() { + public void calculate(String infix) { // 중위 표기식 -> 후위 표기식 + String postfix = InfixToPostfix.convertToPostfix(infix); // 후위 표기식 계산 // 계산 결과 출력 // 계산 결과 저장 From 0b1c6a6d61ccf6d0b654ad471a8784fc263c8f48 Mon Sep 17 00:00:00 2001 From: baejunil Date: Thu, 15 Jun 2023 01:42:10 +0900 Subject: [PATCH 06/17] =?UTF-8?q?feat=20:=20=ED=9B=84=EC=9C=84=20=ED=91=9C?= =?UTF-8?q?=EA=B8=B0=EC=8B=9D=20=EA=B3=84=EC=82=B0=20=EB=B0=8F=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programmers/converter/InfixToPostfix.java | 47 +++++++++++++++++ .../converter/PostfixToAnswer.java | 32 ++++++++++++ .../programmers/model/CalculationFormula.java | 4 ++ .../main/java/com/programmers/model/Menu.java | 4 +- .../java/com/programmers/model/Operator.java | 52 +++++++++++++++++++ 5 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 calculator/src/main/java/com/programmers/converter/InfixToPostfix.java create mode 100644 calculator/src/main/java/com/programmers/converter/PostfixToAnswer.java create mode 100644 calculator/src/main/java/com/programmers/model/Operator.java diff --git a/calculator/src/main/java/com/programmers/converter/InfixToPostfix.java b/calculator/src/main/java/com/programmers/converter/InfixToPostfix.java new file mode 100644 index 000000000..cdf19b516 --- /dev/null +++ b/calculator/src/main/java/com/programmers/converter/InfixToPostfix.java @@ -0,0 +1,47 @@ +package com.programmers.converter; + +import java.util.Stack; + +public class InfixToPostfix { + + private static int getPrecedence(char operator) { + switch (operator) { + case '+': + case '-': + return 1; + case '*': + case '/': + return 2; + } + return -1; + } + + public static String convertToPostfix(String infixExpression) { + StringBuilder postfixExpression = new StringBuilder(); + Stack operatorStack = new Stack<>(); + + for (int i = 0; i < infixExpression.length(); i++) { + char ch = infixExpression.charAt(i); + + if (ch == ' ') { + continue; + } + + if (Character.isDigit(ch)) { + postfixExpression.append(ch); + } else { + while (!operatorStack.isEmpty() && getPrecedence(ch) <= getPrecedence( + operatorStack.peek())) { + postfixExpression.append(operatorStack.pop()); + } + operatorStack.push(ch); + } + } + + while (!operatorStack.isEmpty()) { + postfixExpression.append(operatorStack.pop()); + } + + return postfixExpression.toString(); + } +} diff --git a/calculator/src/main/java/com/programmers/converter/PostfixToAnswer.java b/calculator/src/main/java/com/programmers/converter/PostfixToAnswer.java new file mode 100644 index 000000000..644fd0959 --- /dev/null +++ b/calculator/src/main/java/com/programmers/converter/PostfixToAnswer.java @@ -0,0 +1,32 @@ +package com.programmers.converter; + +import com.programmers.model.Operator; +import java.util.Stack; + +public class PostfixToAnswer { + + public static double PostfixToAnswer(String postfixExpression) { + Stack operandStack = new Stack<>(); + + for (int i = 0; i < postfixExpression.length(); i++) { + char ch = postfixExpression.charAt(i); + + if (ch == ' ') { + continue; + } + + if (Character.isDigit(ch)) { + operandStack.push((double) (ch - '0')); + } else { + Operator operator = Operator.fromSymbol(ch); + double operand2 = operandStack.pop(); + double operand1 = operandStack.pop(); + double result = operator.performOperation(operand1, operand2); + operandStack.push(result); + } + } + + return operandStack.pop(); + } +} + diff --git a/calculator/src/main/java/com/programmers/model/CalculationFormula.java b/calculator/src/main/java/com/programmers/model/CalculationFormula.java index afd66fc56..d9b660ae0 100644 --- a/calculator/src/main/java/com/programmers/model/CalculationFormula.java +++ b/calculator/src/main/java/com/programmers/model/CalculationFormula.java @@ -1,5 +1,7 @@ package com.programmers.model; +import static com.programmers.converter.PostfixToAnswer.PostfixToAnswer; + import com.programmers.converter.InfixToPostfix; public class CalculationFormula { @@ -13,7 +15,9 @@ public void calculate(String infix) { // 중위 표기식 -> 후위 표기식 String postfix = InfixToPostfix.convertToPostfix(infix); // 후위 표기식 계산 + Double answer = PostfixToAnswer(postfix); // 계산 결과 출력 + System.out.println(answer + "\n"); // 계산 결과 저장 } diff --git a/calculator/src/main/java/com/programmers/model/Menu.java b/calculator/src/main/java/com/programmers/model/Menu.java index 33416cf5b..b46f41ff8 100644 --- a/calculator/src/main/java/com/programmers/model/Menu.java +++ b/calculator/src/main/java/com/programmers/model/Menu.java @@ -11,7 +11,9 @@ public class Menu implements Input, Output { @Override public int selectOption() { System.out.print("선택 : "); - return Integer.parseInt(scanner.nextLine()); + int select = Integer.parseInt(scanner.nextLine()); + System.out.println(); + return select; } @Override diff --git a/calculator/src/main/java/com/programmers/model/Operator.java b/calculator/src/main/java/com/programmers/model/Operator.java new file mode 100644 index 000000000..a8c4f1fb1 --- /dev/null +++ b/calculator/src/main/java/com/programmers/model/Operator.java @@ -0,0 +1,52 @@ +package com.programmers.model; + +public enum Operator { + ADD('+') { + @Override + public double performOperation(double operand1, double operand2) { + return operand1 + operand2; + } + }, + SUBTRACT('-') { + @Override + public double performOperation(double operand1, double operand2) { + return operand1 - operand2; + } + }, + MULTIPLY('*') { + @Override + public double performOperation(double operand1, double operand2) { + return operand1 * operand2; + } + }, + DIVIDE('/') { + @Override + public double performOperation(double operand1, double operand2) { + if (operand2 == 0) { + throw new ArithmeticException("Division by zero"); + } + return Math.round(operand1 / operand2 * 100.0) / 100.0; + } + }; + + private final char symbol; + + Operator(char symbol) { + this.symbol = symbol; + } + + public char getSymbol() { + return symbol; + } + + public static Operator fromSymbol(char symbol) { + for (Operator operator : values()) { + if (operator.symbol == symbol) { + return operator; + } + } + throw new IllegalArgumentException("Invalid operator symbol: " + symbol); + } + + public abstract double performOperation(double operand1, double operand2); +} From a9811d266f1634b1f664b969bf5400f09f836bcb Mon Sep 17 00:00:00 2001 From: baejunil Date: Thu, 15 Jun 2023 03:49:35 +0900 Subject: [PATCH 07/17] =?UTF-8?q?feat=20:=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/programmers/Calculator.java | 2 +- .../main/java/com/programmers/io/Input.java | 4 +++- .../programmers/model/CalculationFormula.java | 9 ++++++-- .../java/com/programmers/model/History.java | 21 +++++++++++++++++++ .../main/java/com/programmers/model/Menu.java | 11 ++++++---- 5 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 calculator/src/main/java/com/programmers/model/History.java diff --git a/calculator/src/main/java/com/programmers/Calculator.java b/calculator/src/main/java/com/programmers/Calculator.java index 294498973..837924ab5 100644 --- a/calculator/src/main/java/com/programmers/Calculator.java +++ b/calculator/src/main/java/com/programmers/Calculator.java @@ -24,7 +24,7 @@ public void run() { calculationFormula.showResult(); continue; case 2: - String formula = menu.getCalculationFormula(); + String formula = menu.getInfix(); calculationFormula.calculate(formula); continue; case 3: diff --git a/calculator/src/main/java/com/programmers/io/Input.java b/calculator/src/main/java/com/programmers/io/Input.java index ecc9c6fba..b2f1deed8 100644 --- a/calculator/src/main/java/com/programmers/io/Input.java +++ b/calculator/src/main/java/com/programmers/io/Input.java @@ -4,5 +4,7 @@ public interface Input { int selectOption(); - String getCalculationFormula(); + String getInfix(); + + String getReplacedInfix(String infix); } diff --git a/calculator/src/main/java/com/programmers/model/CalculationFormula.java b/calculator/src/main/java/com/programmers/model/CalculationFormula.java index d9b660ae0..48a82dc75 100644 --- a/calculator/src/main/java/com/programmers/model/CalculationFormula.java +++ b/calculator/src/main/java/com/programmers/model/CalculationFormula.java @@ -6,19 +6,24 @@ public class CalculationFormula { + private static final History history = new History(); + private static final Menu menu = new Menu(); + public void showResult() { // 저장한 계산결과 출력 - System.out.println("답은 이거"); + history.showHistory(); } public void calculate(String infix) { + String replacedInfix = menu.getReplacedInfix(infix); // 중위 표기식 -> 후위 표기식 - String postfix = InfixToPostfix.convertToPostfix(infix); + String postfix = InfixToPostfix.convertToPostfix(replacedInfix); // 후위 표기식 계산 Double answer = PostfixToAnswer(postfix); // 계산 결과 출력 System.out.println(answer + "\n"); // 계산 결과 저장 + history.save(infix, answer); } diff --git a/calculator/src/main/java/com/programmers/model/History.java b/calculator/src/main/java/com/programmers/model/History.java new file mode 100644 index 000000000..96dac9183 --- /dev/null +++ b/calculator/src/main/java/com/programmers/model/History.java @@ -0,0 +1,21 @@ +package com.programmers.model; + +import java.util.HashMap; +import java.util.Map; + +public class History { + + private final Map history = new HashMap<>(); + private int index = 0; + + public void save(String formula, double answer) { + history.put(++index, formula + " = " + answer); + } + + public void showHistory() { + for (int key : history.keySet()) { + String formula = history.get(key); + System.out.println(formula); + } + } +} diff --git a/calculator/src/main/java/com/programmers/model/Menu.java b/calculator/src/main/java/com/programmers/model/Menu.java index b46f41ff8..89a45e72f 100644 --- a/calculator/src/main/java/com/programmers/model/Menu.java +++ b/calculator/src/main/java/com/programmers/model/Menu.java @@ -17,10 +17,13 @@ public int selectOption() { } @Override - public String getCalculationFormula() { - String infix = scanner.nextLine(); - infix = infix.replaceAll("\\s+", ""); - return infix; + public String getInfix() { + return scanner.nextLine(); + } + + @Override + public String getReplacedInfix(String infix) { + return infix.replaceAll("\\s+", ""); } @Override From 4bfedd8f5c597241748321972426f8c7d6509635 Mon Sep 17 00:00:00 2001 From: baejunil Date: Thu, 15 Jun 2023 04:35:50 +0900 Subject: [PATCH 08/17] =?UTF-8?q?style=20:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=BB=A8=EB=B2=A4=EC=85=98=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programmers/converter/InfixToPostfix.java | 20 ++++++------- .../converter/PostfixToAnswer.java | 13 +++++---- .../programmers/model/CalculationFormula.java | 4 +-- .../java/com/programmers/model/History.java | 1 + .../main/java/com/programmers/model/Menu.java | 6 ++-- .../java/com/programmers/model/Operator.java | 28 ++++++++----------- 6 files changed, 35 insertions(+), 37 deletions(-) diff --git a/calculator/src/main/java/com/programmers/converter/InfixToPostfix.java b/calculator/src/main/java/com/programmers/converter/InfixToPostfix.java index cdf19b516..a7b73b156 100644 --- a/calculator/src/main/java/com/programmers/converter/InfixToPostfix.java +++ b/calculator/src/main/java/com/programmers/converter/InfixToPostfix.java @@ -4,7 +4,7 @@ public class InfixToPostfix { - private static int getPrecedence(char operator) { + private static int getPriority(char operator) { switch (operator) { case '+': case '-': @@ -16,32 +16,32 @@ private static int getPrecedence(char operator) { return -1; } - public static String convertToPostfix(String infixExpression) { - StringBuilder postfixExpression = new StringBuilder(); + public static String InfixToPostfix(String infix) { + StringBuilder postfixStringBuilder = new StringBuilder(); Stack operatorStack = new Stack<>(); - for (int i = 0; i < infixExpression.length(); i++) { - char ch = infixExpression.charAt(i); + for (int i = 0; i < infix.length(); i++) { + char ch = infix.charAt(i); if (ch == ' ') { continue; } if (Character.isDigit(ch)) { - postfixExpression.append(ch); + postfixStringBuilder.append(ch); } else { - while (!operatorStack.isEmpty() && getPrecedence(ch) <= getPrecedence( + while (!operatorStack.isEmpty() && getPriority(ch) <= getPriority( operatorStack.peek())) { - postfixExpression.append(operatorStack.pop()); + postfixStringBuilder.append(operatorStack.pop()); } operatorStack.push(ch); } } while (!operatorStack.isEmpty()) { - postfixExpression.append(operatorStack.pop()); + postfixStringBuilder.append(operatorStack.pop()); } - return postfixExpression.toString(); + return postfixStringBuilder.toString(); } } diff --git a/calculator/src/main/java/com/programmers/converter/PostfixToAnswer.java b/calculator/src/main/java/com/programmers/converter/PostfixToAnswer.java index 644fd0959..d5a08ecbd 100644 --- a/calculator/src/main/java/com/programmers/converter/PostfixToAnswer.java +++ b/calculator/src/main/java/com/programmers/converter/PostfixToAnswer.java @@ -5,11 +5,11 @@ public class PostfixToAnswer { - public static double PostfixToAnswer(String postfixExpression) { + public static double PostfixToAnswer(String postfix) { Stack operandStack = new Stack<>(); - for (int i = 0; i < postfixExpression.length(); i++) { - char ch = postfixExpression.charAt(i); + for (int i = 0; i < postfix.length(); i++) { + char ch = postfix.charAt(i); if (ch == ' ') { continue; @@ -19,9 +19,10 @@ public static double PostfixToAnswer(String postfixExpression) { operandStack.push((double) (ch - '0')); } else { Operator operator = Operator.fromSymbol(ch); - double operand2 = operandStack.pop(); - double operand1 = operandStack.pop(); - double result = operator.performOperation(operand1, operand2); + double rightOperand = operandStack.pop(); + double leftOperand = operandStack.pop(); + double result = operator.calculate(leftOperand, rightOperand); + operandStack.push(result); } } diff --git a/calculator/src/main/java/com/programmers/model/CalculationFormula.java b/calculator/src/main/java/com/programmers/model/CalculationFormula.java index 48a82dc75..377859b09 100644 --- a/calculator/src/main/java/com/programmers/model/CalculationFormula.java +++ b/calculator/src/main/java/com/programmers/model/CalculationFormula.java @@ -17,9 +17,9 @@ public void showResult() { public void calculate(String infix) { String replacedInfix = menu.getReplacedInfix(infix); // 중위 표기식 -> 후위 표기식 - String postfix = InfixToPostfix.convertToPostfix(replacedInfix); + String postfix = InfixToPostfix.InfixToPostfix(replacedInfix); // 후위 표기식 계산 - Double answer = PostfixToAnswer(postfix); + double answer = PostfixToAnswer(postfix); // 계산 결과 출력 System.out.println(answer + "\n"); // 계산 결과 저장 diff --git a/calculator/src/main/java/com/programmers/model/History.java b/calculator/src/main/java/com/programmers/model/History.java index 96dac9183..bf64ab037 100644 --- a/calculator/src/main/java/com/programmers/model/History.java +++ b/calculator/src/main/java/com/programmers/model/History.java @@ -17,5 +17,6 @@ public void showHistory() { String formula = history.get(key); System.out.println(formula); } + System.out.println(); } } diff --git a/calculator/src/main/java/com/programmers/model/Menu.java b/calculator/src/main/java/com/programmers/model/Menu.java index 89a45e72f..6c701dd1c 100644 --- a/calculator/src/main/java/com/programmers/model/Menu.java +++ b/calculator/src/main/java/com/programmers/model/Menu.java @@ -6,7 +6,7 @@ public class Menu implements Input, Output { - private final Scanner scanner = new Scanner(System.in); + private static final Scanner scanner = new Scanner(System.in); @Override public int selectOption() { @@ -33,11 +33,11 @@ public void showMenu() { @Override public void exit() { - System.out.println("종료할게"); + System.out.println("계산기를 종료합니다."); } @Override public void incorrectOption() { - System.out.println("올바른 답이 아니야"); + System.out.println("올바른 메뉴 옵션을 선택해주세요."); } } diff --git a/calculator/src/main/java/com/programmers/model/Operator.java b/calculator/src/main/java/com/programmers/model/Operator.java index a8c4f1fb1..3282f1839 100644 --- a/calculator/src/main/java/com/programmers/model/Operator.java +++ b/calculator/src/main/java/com/programmers/model/Operator.java @@ -3,29 +3,29 @@ public enum Operator { ADD('+') { @Override - public double performOperation(double operand1, double operand2) { - return operand1 + operand2; + public double calculate(double leftOperand, double rightOperand) { + return leftOperand + rightOperand; } }, SUBTRACT('-') { @Override - public double performOperation(double operand1, double operand2) { - return operand1 - operand2; + public double calculate(double leftOperand, double rightOperand) { + return leftOperand - rightOperand; } }, MULTIPLY('*') { @Override - public double performOperation(double operand1, double operand2) { - return operand1 * operand2; + public double calculate(double leftOperand, double rightOperand) { + return leftOperand * rightOperand; } }, DIVIDE('/') { @Override - public double performOperation(double operand1, double operand2) { - if (operand2 == 0) { - throw new ArithmeticException("Division by zero"); + public double calculate(double leftOperand, double rightOperand) { + if (rightOperand == 0) { + throw new ArithmeticException("0으로 나눌 수 없습니다."); } - return Math.round(operand1 / operand2 * 100.0) / 100.0; + return Math.round(leftOperand / rightOperand * 100.0) / 100.0; } }; @@ -35,18 +35,14 @@ public double performOperation(double operand1, double operand2) { this.symbol = symbol; } - public char getSymbol() { - return symbol; - } - public static Operator fromSymbol(char symbol) { for (Operator operator : values()) { if (operator.symbol == symbol) { return operator; } } - throw new IllegalArgumentException("Invalid operator symbol: " + symbol); + throw new IllegalArgumentException("잘못된 연산자입니다." + symbol); } - public abstract double performOperation(double operand1, double operand2); + public abstract double calculate(double leftOperand, double rightOperand); } From 85e7a1b56be38fae6b40722dcf2e8b58d467672c Mon Sep 17 00:00:00 2001 From: baejunil Date: Thu, 15 Jun 2023 04:40:42 +0900 Subject: [PATCH 09/17] =?UTF-8?q?feat=20:=20=ED=95=A8=EC=88=98=20=EB=AA=A8?= =?UTF-8?q?=EB=93=88=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/programmers/converter/InfixToPostfix.java | 14 +++++++++++--- .../com/programmers/converter/PostfixToAnswer.java | 6 +++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/calculator/src/main/java/com/programmers/converter/InfixToPostfix.java b/calculator/src/main/java/com/programmers/converter/InfixToPostfix.java index a7b73b156..819e2dcf5 100644 --- a/calculator/src/main/java/com/programmers/converter/InfixToPostfix.java +++ b/calculator/src/main/java/com/programmers/converter/InfixToPostfix.java @@ -27,11 +27,10 @@ public static String InfixToPostfix(String infix) { continue; } - if (Character.isDigit(ch)) { + if (isDigit(ch)) { postfixStringBuilder.append(ch); } else { - while (!operatorStack.isEmpty() && getPriority(ch) <= getPriority( - operatorStack.peek())) { + while (isPriority(operatorStack, ch)) { postfixStringBuilder.append(operatorStack.pop()); } operatorStack.push(ch); @@ -44,4 +43,13 @@ public static String InfixToPostfix(String infix) { return postfixStringBuilder.toString(); } + + private static boolean isDigit(char ch) { + return Character.isDigit(ch); + } + + private static boolean isPriority(Stack operatorStack, char ch) { + return !operatorStack.isEmpty() && getPriority(ch) <= getPriority( + operatorStack.peek()); + } } diff --git a/calculator/src/main/java/com/programmers/converter/PostfixToAnswer.java b/calculator/src/main/java/com/programmers/converter/PostfixToAnswer.java index d5a08ecbd..d42f06eb9 100644 --- a/calculator/src/main/java/com/programmers/converter/PostfixToAnswer.java +++ b/calculator/src/main/java/com/programmers/converter/PostfixToAnswer.java @@ -15,7 +15,7 @@ public static double PostfixToAnswer(String postfix) { continue; } - if (Character.isDigit(ch)) { + if (isDigit(ch)) { operandStack.push((double) (ch - '0')); } else { Operator operator = Operator.fromSymbol(ch); @@ -29,5 +29,9 @@ public static double PostfixToAnswer(String postfix) { return operandStack.pop(); } + + private static boolean isDigit(char ch) { + return Character.isDigit(ch); + } } From ad411b9435e51cfaa9179c56d8e3fca7434dc711 Mon Sep 17 00:00:00 2001 From: baejunil Date: Thu, 15 Jun 2023 04:42:21 +0900 Subject: [PATCH 10/17] =?UTF-8?q?feat=20:=20=EC=A1=B0=ED=9A=8C=20=EC=9D=B8?= =?UTF-8?q?=EB=8D=B1=EC=8A=A4=20=EB=8F=99=EA=B8=B0=ED=99=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- calculator/src/main/java/com/programmers/model/History.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/calculator/src/main/java/com/programmers/model/History.java b/calculator/src/main/java/com/programmers/model/History.java index bf64ab037..ac26a4528 100644 --- a/calculator/src/main/java/com/programmers/model/History.java +++ b/calculator/src/main/java/com/programmers/model/History.java @@ -2,14 +2,15 @@ import java.util.HashMap; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; public class History { private final Map history = new HashMap<>(); - private int index = 0; + AtomicInteger index = new AtomicInteger(); public void save(String formula, double answer) { - history.put(++index, formula + " = " + answer); + history.put(index.addAndGet(1), formula + " = " + answer); } public void showHistory() { From 2c8642ead13707e6028c1faacf22f6ffd5a9b8bf Mon Sep 17 00:00:00 2001 From: baejunil Date: Thu, 15 Jun 2023 04:45:21 +0900 Subject: [PATCH 11/17] =?UTF-8?q?chore=20:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/programmers/model/CalculationFormula.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/calculator/src/main/java/com/programmers/model/CalculationFormula.java b/calculator/src/main/java/com/programmers/model/CalculationFormula.java index 377859b09..a8475cbcb 100644 --- a/calculator/src/main/java/com/programmers/model/CalculationFormula.java +++ b/calculator/src/main/java/com/programmers/model/CalculationFormula.java @@ -10,19 +10,14 @@ public class CalculationFormula { private static final Menu menu = new Menu(); public void showResult() { - // 저장한 계산결과 출력 history.showHistory(); } public void calculate(String infix) { String replacedInfix = menu.getReplacedInfix(infix); - // 중위 표기식 -> 후위 표기식 String postfix = InfixToPostfix.InfixToPostfix(replacedInfix); - // 후위 표기식 계산 double answer = PostfixToAnswer(postfix); - // 계산 결과 출력 System.out.println(answer + "\n"); - // 계산 결과 저장 history.save(infix, answer); } From b006e3f6479404c40114254920d302e889eed84b Mon Sep 17 00:00:00 2001 From: baejunil Date: Thu, 15 Jun 2023 04:46:48 +0900 Subject: [PATCH 12/17] =?UTF-8?q?chore=20:=20=EA=B3=84=EC=82=B0=EA=B8=B0?= =?UTF-8?q?=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- calculator/src/main/java/com/programmers/App.java | 4 ++-- calculator/src/main/java/com/programmers/Calculator.java | 8 ++++---- .../{ => engine}/converter/InfixToPostfix.java | 2 +- .../{ => engine}/converter/PostfixToAnswer.java | 4 ++-- .../main/java/com/programmers/{ => engine}/io/Input.java | 2 +- .../main/java/com/programmers/{ => engine}/io/Output.java | 2 +- .../{ => engine}/model/CalculationFormula.java | 6 +++--- .../java/com/programmers/{ => engine}/model/History.java | 2 +- .../java/com/programmers/{ => engine}/model/Menu.java | 6 +++--- .../java/com/programmers/{ => engine}/model/Operator.java | 2 +- 10 files changed, 19 insertions(+), 19 deletions(-) rename calculator/src/main/java/com/programmers/{ => engine}/converter/InfixToPostfix.java (96%) rename calculator/src/main/java/com/programmers/{ => engine}/converter/PostfixToAnswer.java (89%) rename calculator/src/main/java/com/programmers/{ => engine}/io/Input.java (76%) rename calculator/src/main/java/com/programmers/{ => engine}/io/Output.java (72%) rename calculator/src/main/java/com/programmers/{ => engine}/model/CalculationFormula.java (73%) rename calculator/src/main/java/com/programmers/{ => engine}/model/History.java (93%) rename calculator/src/main/java/com/programmers/{ => engine}/model/Menu.java (87%) rename calculator/src/main/java/com/programmers/{ => engine}/model/Operator.java (96%) diff --git a/calculator/src/main/java/com/programmers/App.java b/calculator/src/main/java/com/programmers/App.java index 1c0f4afd5..5ab8b4efe 100644 --- a/calculator/src/main/java/com/programmers/App.java +++ b/calculator/src/main/java/com/programmers/App.java @@ -1,7 +1,7 @@ package com.programmers; -import com.programmers.model.CalculationFormula; -import com.programmers.model.Menu; +import com.programmers.engine.model.CalculationFormula; +import com.programmers.engine.model.Menu; public class App { diff --git a/calculator/src/main/java/com/programmers/Calculator.java b/calculator/src/main/java/com/programmers/Calculator.java index 837924ab5..c3fb55943 100644 --- a/calculator/src/main/java/com/programmers/Calculator.java +++ b/calculator/src/main/java/com/programmers/Calculator.java @@ -1,9 +1,9 @@ package com.programmers; -import com.programmers.io.Input; -import com.programmers.io.Output; -import com.programmers.model.CalculationFormula; -import com.programmers.model.Menu; +import com.programmers.engine.io.Input; +import com.programmers.engine.io.Output; +import com.programmers.engine.model.CalculationFormula; +import com.programmers.engine.model.Menu; import lombok.AllArgsConstructor; @AllArgsConstructor diff --git a/calculator/src/main/java/com/programmers/converter/InfixToPostfix.java b/calculator/src/main/java/com/programmers/engine/converter/InfixToPostfix.java similarity index 96% rename from calculator/src/main/java/com/programmers/converter/InfixToPostfix.java rename to calculator/src/main/java/com/programmers/engine/converter/InfixToPostfix.java index 819e2dcf5..8468a4939 100644 --- a/calculator/src/main/java/com/programmers/converter/InfixToPostfix.java +++ b/calculator/src/main/java/com/programmers/engine/converter/InfixToPostfix.java @@ -1,4 +1,4 @@ -package com.programmers.converter; +package com.programmers.engine.converter; import java.util.Stack; diff --git a/calculator/src/main/java/com/programmers/converter/PostfixToAnswer.java b/calculator/src/main/java/com/programmers/engine/converter/PostfixToAnswer.java similarity index 89% rename from calculator/src/main/java/com/programmers/converter/PostfixToAnswer.java rename to calculator/src/main/java/com/programmers/engine/converter/PostfixToAnswer.java index d42f06eb9..52d242075 100644 --- a/calculator/src/main/java/com/programmers/converter/PostfixToAnswer.java +++ b/calculator/src/main/java/com/programmers/engine/converter/PostfixToAnswer.java @@ -1,6 +1,6 @@ -package com.programmers.converter; +package com.programmers.engine.converter; -import com.programmers.model.Operator; +import com.programmers.engine.model.Operator; import java.util.Stack; public class PostfixToAnswer { diff --git a/calculator/src/main/java/com/programmers/io/Input.java b/calculator/src/main/java/com/programmers/engine/io/Input.java similarity index 76% rename from calculator/src/main/java/com/programmers/io/Input.java rename to calculator/src/main/java/com/programmers/engine/io/Input.java index b2f1deed8..37a8f17e2 100644 --- a/calculator/src/main/java/com/programmers/io/Input.java +++ b/calculator/src/main/java/com/programmers/engine/io/Input.java @@ -1,4 +1,4 @@ -package com.programmers.io; +package com.programmers.engine.io; public interface Input { diff --git a/calculator/src/main/java/com/programmers/io/Output.java b/calculator/src/main/java/com/programmers/engine/io/Output.java similarity index 72% rename from calculator/src/main/java/com/programmers/io/Output.java rename to calculator/src/main/java/com/programmers/engine/io/Output.java index 0578e9208..353377b8a 100644 --- a/calculator/src/main/java/com/programmers/io/Output.java +++ b/calculator/src/main/java/com/programmers/engine/io/Output.java @@ -1,4 +1,4 @@ -package com.programmers.io; +package com.programmers.engine.io; public interface Output { diff --git a/calculator/src/main/java/com/programmers/model/CalculationFormula.java b/calculator/src/main/java/com/programmers/engine/model/CalculationFormula.java similarity index 73% rename from calculator/src/main/java/com/programmers/model/CalculationFormula.java rename to calculator/src/main/java/com/programmers/engine/model/CalculationFormula.java index a8475cbcb..1171b9a34 100644 --- a/calculator/src/main/java/com/programmers/model/CalculationFormula.java +++ b/calculator/src/main/java/com/programmers/engine/model/CalculationFormula.java @@ -1,8 +1,8 @@ -package com.programmers.model; +package com.programmers.engine.model; -import static com.programmers.converter.PostfixToAnswer.PostfixToAnswer; +import static com.programmers.engine.converter.PostfixToAnswer.PostfixToAnswer; -import com.programmers.converter.InfixToPostfix; +import com.programmers.engine.converter.InfixToPostfix; public class CalculationFormula { diff --git a/calculator/src/main/java/com/programmers/model/History.java b/calculator/src/main/java/com/programmers/engine/model/History.java similarity index 93% rename from calculator/src/main/java/com/programmers/model/History.java rename to calculator/src/main/java/com/programmers/engine/model/History.java index ac26a4528..9fa3518ce 100644 --- a/calculator/src/main/java/com/programmers/model/History.java +++ b/calculator/src/main/java/com/programmers/engine/model/History.java @@ -1,4 +1,4 @@ -package com.programmers.model; +package com.programmers.engine.model; import java.util.HashMap; import java.util.Map; diff --git a/calculator/src/main/java/com/programmers/model/Menu.java b/calculator/src/main/java/com/programmers/engine/model/Menu.java similarity index 87% rename from calculator/src/main/java/com/programmers/model/Menu.java rename to calculator/src/main/java/com/programmers/engine/model/Menu.java index 6c701dd1c..9742b348c 100644 --- a/calculator/src/main/java/com/programmers/model/Menu.java +++ b/calculator/src/main/java/com/programmers/engine/model/Menu.java @@ -1,7 +1,7 @@ -package com.programmers.model; +package com.programmers.engine.model; -import com.programmers.io.Input; -import com.programmers.io.Output; +import com.programmers.engine.io.Input; +import com.programmers.engine.io.Output; import java.util.Scanner; public class Menu implements Input, Output { diff --git a/calculator/src/main/java/com/programmers/model/Operator.java b/calculator/src/main/java/com/programmers/engine/model/Operator.java similarity index 96% rename from calculator/src/main/java/com/programmers/model/Operator.java rename to calculator/src/main/java/com/programmers/engine/model/Operator.java index 3282f1839..831f46c46 100644 --- a/calculator/src/main/java/com/programmers/model/Operator.java +++ b/calculator/src/main/java/com/programmers/engine/model/Operator.java @@ -1,4 +1,4 @@ -package com.programmers.model; +package com.programmers.engine.model; public enum Operator { ADD('+') { From 7353593cdf76ca857d12d0b0a9cb4429703b5adb Mon Sep 17 00:00:00 2001 From: baejunil Date: Thu, 15 Jun 2023 04:57:50 +0900 Subject: [PATCH 13/17] =?UTF-8?q?chore=20:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20dependency=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- calculator/build.gradle | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/calculator/build.gradle b/calculator/build.gradle index 52e051878..24cac0fc7 100644 --- a/calculator/build.gradle +++ b/calculator/build.gradle @@ -10,13 +10,16 @@ repositories { } dependencies { + implementation 'org.junit.jupiter:junit-jupiter:5.8.1' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' - + compileOnly 'org.projectlombok:lombok:1.18.28' annotationProcessor 'org.projectlombok:lombok:1.18.28' testCompileOnly 'org.projectlombok:lombok:1.18.28' testAnnotationProcessor 'org.projectlombok:lombok:1.18.28' + + testImplementation "org.assertj:assertj-core:3.11.1" } test { From 2dc47a3e088d122ce9671b88cdc1b4c26ab1d5d7 Mon Sep 17 00:00:00 2001 From: baejunil Date: Thu, 15 Jun 2023 05:00:16 +0900 Subject: [PATCH 14/17] =?UTF-8?q?feat=20:=20=EB=AA=85=ED=99=95=ED=95=9C=20?= =?UTF-8?q?case=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- calculator/src/main/java/com/programmers/Calculator.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/calculator/src/main/java/com/programmers/Calculator.java b/calculator/src/main/java/com/programmers/Calculator.java index c3fb55943..868dd66ff 100644 --- a/calculator/src/main/java/com/programmers/Calculator.java +++ b/calculator/src/main/java/com/programmers/Calculator.java @@ -9,6 +9,9 @@ @AllArgsConstructor public class Calculator implements Runnable { + public static final int HISTORY = 1; + public static final int CALCULATE = 2; + public static final int EXIT = 3; private final Input input; private final Output output; private final CalculationFormula calculationFormula; @@ -20,14 +23,14 @@ public void run() { output.showMenu(); switch (input.selectOption()) { - case 1: + case HISTORY: calculationFormula.showResult(); continue; - case 2: + case CALCULATE: String formula = menu.getInfix(); calculationFormula.calculate(formula); continue; - case 3: + case EXIT: output.exit(); return; default: From 7e031c47f55ae239ebefcd04de172d040c1a7034 Mon Sep 17 00:00:00 2001 From: baejunil Date: Thu, 15 Jun 2023 05:42:19 +0900 Subject: [PATCH 15/17] =?UTF-8?q?fix=20:=20=EC=9D=B8=EB=8D=B1=EC=8A=A4=20?= =?UTF-8?q?=EB=8F=99=EA=B8=B0=ED=99=94=20=EA=B8=B0=EB=8A=A5=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 함수 실행 범위를 생각해보니 같은 클래스 내에서 사용되어서 동기화를 생각하지 않아도 될 것 같다. --- .../src/main/java/com/programmers/engine/model/History.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/calculator/src/main/java/com/programmers/engine/model/History.java b/calculator/src/main/java/com/programmers/engine/model/History.java index 9fa3518ce..e709ddf2e 100644 --- a/calculator/src/main/java/com/programmers/engine/model/History.java +++ b/calculator/src/main/java/com/programmers/engine/model/History.java @@ -2,15 +2,14 @@ import java.util.HashMap; import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; public class History { private final Map history = new HashMap<>(); - AtomicInteger index = new AtomicInteger(); + private int index = 0; public void save(String formula, double answer) { - history.put(index.addAndGet(1), formula + " = " + answer); + history.put(++index, formula + " = " + answer); } public void showHistory() { From 67b20b5859cbe45b36cefdd1190d62f18cbd2c2b Mon Sep 17 00:00:00 2001 From: baejunil Date: Thu, 15 Jun 2023 06:02:50 +0900 Subject: [PATCH 16/17] =?UTF-8?q?style=20:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EA=B3=B5=EB=B0=B1=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/programmers/engine/converter/InfixToPostfix.java | 1 - .../java/com/programmers/engine/converter/PostfixToAnswer.java | 1 - .../java/com/programmers/engine/model/CalculationFormula.java | 2 -- 3 files changed, 4 deletions(-) diff --git a/calculator/src/main/java/com/programmers/engine/converter/InfixToPostfix.java b/calculator/src/main/java/com/programmers/engine/converter/InfixToPostfix.java index 8468a4939..f94568669 100644 --- a/calculator/src/main/java/com/programmers/engine/converter/InfixToPostfix.java +++ b/calculator/src/main/java/com/programmers/engine/converter/InfixToPostfix.java @@ -40,7 +40,6 @@ public static String InfixToPostfix(String infix) { while (!operatorStack.isEmpty()) { postfixStringBuilder.append(operatorStack.pop()); } - return postfixStringBuilder.toString(); } diff --git a/calculator/src/main/java/com/programmers/engine/converter/PostfixToAnswer.java b/calculator/src/main/java/com/programmers/engine/converter/PostfixToAnswer.java index 52d242075..a2cecd6d4 100644 --- a/calculator/src/main/java/com/programmers/engine/converter/PostfixToAnswer.java +++ b/calculator/src/main/java/com/programmers/engine/converter/PostfixToAnswer.java @@ -26,7 +26,6 @@ public static double PostfixToAnswer(String postfix) { operandStack.push(result); } } - return operandStack.pop(); } diff --git a/calculator/src/main/java/com/programmers/engine/model/CalculationFormula.java b/calculator/src/main/java/com/programmers/engine/model/CalculationFormula.java index 1171b9a34..35835bd72 100644 --- a/calculator/src/main/java/com/programmers/engine/model/CalculationFormula.java +++ b/calculator/src/main/java/com/programmers/engine/model/CalculationFormula.java @@ -20,6 +20,4 @@ public void calculate(String infix) { System.out.println(answer + "\n"); history.save(infix, answer); } - - } From fc2f4dc2810bb726a4b87445c1dc58965bd9bc47 Mon Sep 17 00:00:00 2001 From: baejunil Date: Thu, 15 Jun 2023 18:41:28 +0900 Subject: [PATCH 17/17] =?UTF-8?q?test=20:=20=EA=B3=84=EC=82=B0=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- calculator/build.gradle | 2 +- .../engine/model/CalculatorTest.java | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 calculator/src/test/java/com/programmers/engine/model/CalculatorTest.java diff --git a/calculator/build.gradle b/calculator/build.gradle index 24cac0fc7..ca90a6c50 100644 --- a/calculator/build.gradle +++ b/calculator/build.gradle @@ -19,7 +19,7 @@ dependencies { testCompileOnly 'org.projectlombok:lombok:1.18.28' testAnnotationProcessor 'org.projectlombok:lombok:1.18.28' - testImplementation "org.assertj:assertj-core:3.11.1" + implementation "org.assertj:assertj-core:3.11.1" } test { diff --git a/calculator/src/test/java/com/programmers/engine/model/CalculatorTest.java b/calculator/src/test/java/com/programmers/engine/model/CalculatorTest.java new file mode 100644 index 000000000..e7ee64641 --- /dev/null +++ b/calculator/src/test/java/com/programmers/engine/model/CalculatorTest.java @@ -0,0 +1,33 @@ +package com.programmers.engine.model; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class CalculatorTest { + + @Test + @DisplayName("더하기 성공") + void 덧셈성공() { + assertThat(Operator.ADD.calculate(1, 2)).isEqualTo(3); + } + + @Test + @DisplayName("빼기 성공") + void 뺄셈성공() { + assertThat(Operator.SUBTRACT.calculate(2, 1)).isEqualTo(1); + } + + @Test + @DisplayName("곱하기 성공") + void 곱셈성공() { + assertThat(Operator.MULTIPLY.calculate(3, 4)).isEqualTo(12); + } + + @Test + @DisplayName("나누기 성공") + void 나눗셈성공() { + assertThat(Operator.DIVIDE.calculate(1, 2)).isEqualTo(0.5); + } +}