From cef4f6ab59088cd4427128cd8523d0aad03a3bc8 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Fri, 2 Jun 2023 16:22:24 +0900 Subject: [PATCH 01/92] =?UTF-8?q?docs:=20README=EC=97=90=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java-calculator/README.md | 59 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 java-calculator/README.md diff --git a/java-calculator/README.md b/java-calculator/README.md new file mode 100644 index 000000000..8db739e89 --- /dev/null +++ b/java-calculator/README.md @@ -0,0 +1,59 @@ + +## 자바 계산기 구현 미션 기능목록 작성 + +동작 예시 +``` +1. 조회 +2. 계산 + +선택 : 2 + +1 + 2 +3 + +1. 조회 +2. 계산 + +선택 : 2 + +1 + 2 * 3 +7 + +1. 조회 +2. 계산 + +선택 : 1 + +1 + 2 = 3 +1 + 2 * 3 = 7 + +선택 : 2 + +3 - 2 * 2 +-1 +``` + +- [ ] 입력 + - [ ] Scanner를 통한 콘솔 입력 + +- [ ] 조회 기능 구현 + - [ ] 계산 후 이력을 Map으로 저장 + - [ ] 조회 기능 선택 시 계산 이력을 Map에서 가져 오기 + +- [ ] 계산 기능 구현 + - [ ] 덧셈 + - [ ] 뺄셈 + - [ ] 나눗셈 + - [ ] 곱하기 + - [ ] 우선순위 (사칙연산) + - [ ] 나눗셈과 곱셈이 덧셈과 뺄셈보다 우선순위가 높다 + +- [ ] 예외 처리 + - [ ] 조회(1), 계산(2) 이외의 값을 입력 했을 경우 `IllegalArgumentException` 발생 + - [ ] 형식 (숫자 + 공백 + 기호 + 공백 + 숫자 + 공백 + 기호 + ...)이 잘못된 경우 `IllegalArgumentException` 발생 + - [ ] int 자료형 overflow / underflow 발생 시 `ArithmeticException` 발생 + + + + + From 0e5168b087d7a51f18c331eb8e4f0efed2e85d0a Mon Sep 17 00:00:00 2001 From: juno-junho Date: Fri, 2 Jun 2023 16:30:54 +0900 Subject: [PATCH 02/92] feat: project setup & gitignore setting --- java-calculator/.gitignore | 45 +++++++++++++++++++++++++++++++++ java-calculator/README.md | 7 +---- java-calculator/build.gradle | 19 ++++++++++++++ java-calculator/settings.gradle | 2 ++ 4 files changed, 67 insertions(+), 6 deletions(-) create mode 100644 java-calculator/.gitignore create mode 100644 java-calculator/build.gradle create mode 100644 java-calculator/settings.gradle diff --git a/java-calculator/.gitignore b/java-calculator/.gitignore new file mode 100644 index 000000000..1339911f1 --- /dev/null +++ b/java-calculator/.gitignore @@ -0,0 +1,45 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ +gradlew.bat +gradlew + +### IntelliJ IDEA ### +.idea +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/java-calculator/README.md b/java-calculator/README.md index 8db739e89..cc810b207 100644 --- a/java-calculator/README.md +++ b/java-calculator/README.md @@ -51,9 +51,4 @@ - [ ] 예외 처리 - [ ] 조회(1), 계산(2) 이외의 값을 입력 했을 경우 `IllegalArgumentException` 발생 - [ ] 형식 (숫자 + 공백 + 기호 + 공백 + 숫자 + 공백 + 기호 + ...)이 잘못된 경우 `IllegalArgumentException` 발생 - - [ ] int 자료형 overflow / underflow 발생 시 `ArithmeticException` 발생 - - - - - + - [ ] int 자료형 overflow / underflow 발생 시 `ArithmeticException` 발생 \ No newline at end of file diff --git a/java-calculator/build.gradle b/java-calculator/build.gradle new file mode 100644 index 000000000..a2b492747 --- /dev/null +++ b/java-calculator/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'java' +} + +group = 'com.programmers' +version = '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation platform('org.junit:junit-bom:5.9.1') + testImplementation 'org.junit.jupiter:junit-jupiter' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/java-calculator/settings.gradle b/java-calculator/settings.gradle new file mode 100644 index 000000000..bcf30bf6c --- /dev/null +++ b/java-calculator/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'java-calculator' + From 8b786c23793b002d12c2af4254786d890748607d Mon Sep 17 00:00:00 2001 From: juno-junho Date: Fri, 2 Jun 2023 16:35:35 +0900 Subject: [PATCH 03/92] =?UTF-8?q?docs:=20gitignore=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EB=B0=8F=20assertj=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java-calculator/.gitignore | 1 + java-calculator/build.gradle | 1 + java-calculator/settings.gradle | 3 +-- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/java-calculator/.gitignore b/java-calculator/.gitignore index 1339911f1..f1d1fba6e 100644 --- a/java-calculator/.gitignore +++ b/java-calculator/.gitignore @@ -5,6 +5,7 @@ build/ !**/src/test/**/build/ gradlew.bat gradlew +gradle ### IntelliJ IDEA ### .idea diff --git a/java-calculator/build.gradle b/java-calculator/build.gradle index a2b492747..fce1a7376 100644 --- a/java-calculator/build.gradle +++ b/java-calculator/build.gradle @@ -10,6 +10,7 @@ repositories { } dependencies { + testImplementation 'org.assertj:assertj-core:3.22.0' testImplementation platform('org.junit:junit-bom:5.9.1') testImplementation 'org.junit.jupiter:junit-jupiter' } diff --git a/java-calculator/settings.gradle b/java-calculator/settings.gradle index bcf30bf6c..e0721b86f 100644 --- a/java-calculator/settings.gradle +++ b/java-calculator/settings.gradle @@ -1,2 +1 @@ -rootProject.name = 'java-calculator' - +rootProject.name = 'java-calculator' \ No newline at end of file From 464ee7d075603155f76e5956e275282f982686e8 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Fri, 2 Jun 2023 16:41:59 +0900 Subject: [PATCH 04/92] =?UTF-8?q?feat:=20=EB=8D=A7=EC=85=88=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 --- .../java/com/programmers/junho/Operation.java | 7 +++++++ .../java/com/programmers/junho/OperationTest.java | 15 +++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 java-calculator/src/main/java/com/programmers/junho/Operation.java create mode 100644 java-calculator/src/test/java/com/programmers/junho/OperationTest.java diff --git a/java-calculator/src/main/java/com/programmers/junho/Operation.java b/java-calculator/src/main/java/com/programmers/junho/Operation.java new file mode 100644 index 000000000..32f5d7ae8 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/junho/Operation.java @@ -0,0 +1,7 @@ +package com.programmers.junho; + +public class Operation { + public int add(int num1, int num2) { + return num1 + num2; + } +} diff --git a/java-calculator/src/test/java/com/programmers/junho/OperationTest.java b/java-calculator/src/test/java/com/programmers/junho/OperationTest.java new file mode 100644 index 000000000..01fbb297d --- /dev/null +++ b/java-calculator/src/test/java/com/programmers/junho/OperationTest.java @@ -0,0 +1,15 @@ +package com.programmers.junho; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class OperationTest { + + @Test + void add() { + Operation operation = new Operation(); + int result = operation.add(1, 2); + assertThat(result).isEqualTo(3); + } +} From d681ef6b8faa1b7cf5ed7148b291e172a83e993a Mon Sep 17 00:00:00 2001 From: juno-junho Date: Fri, 2 Jun 2023 16:42:59 +0900 Subject: [PATCH 05/92] =?UTF-8?q?feat:=20=EB=BA=84=EC=85=88=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 --- .../src/main/java/com/programmers/junho/Operation.java | 4 ++++ .../src/test/java/com/programmers/junho/OperationTest.java | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/java-calculator/src/main/java/com/programmers/junho/Operation.java b/java-calculator/src/main/java/com/programmers/junho/Operation.java index 32f5d7ae8..a3e1d912f 100644 --- a/java-calculator/src/main/java/com/programmers/junho/Operation.java +++ b/java-calculator/src/main/java/com/programmers/junho/Operation.java @@ -4,4 +4,8 @@ public class Operation { public int add(int num1, int num2) { return num1 + num2; } + + public int subtract(int num1, int num2) { + return num1 - num2; + } } diff --git a/java-calculator/src/test/java/com/programmers/junho/OperationTest.java b/java-calculator/src/test/java/com/programmers/junho/OperationTest.java index 01fbb297d..a38ecffa1 100644 --- a/java-calculator/src/test/java/com/programmers/junho/OperationTest.java +++ b/java-calculator/src/test/java/com/programmers/junho/OperationTest.java @@ -12,4 +12,11 @@ void add() { int result = operation.add(1, 2); assertThat(result).isEqualTo(3); } + + @Test + void subtract() { + Operation operation = new Operation(); + int result = operation.subtract(1, 2); + assertThat(result).isEqualTo(-1); + } } From 100652e2d403f6da6035e5677bb5029a97997b62 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Fri, 2 Jun 2023 16:44:20 +0900 Subject: [PATCH 06/92] =?UTF-8?q?feat:=20=EA=B3=B1=EC=85=88=20=EB=B0=8F=20?= =?UTF-8?q?=EB=82=98=EB=88=97=EC=85=88=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/programmers/junho/Operation.java | 8 ++++++++ .../java/com/programmers/junho/OperationTest.java | 14 ++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/java-calculator/src/main/java/com/programmers/junho/Operation.java b/java-calculator/src/main/java/com/programmers/junho/Operation.java index a3e1d912f..143e70b12 100644 --- a/java-calculator/src/main/java/com/programmers/junho/Operation.java +++ b/java-calculator/src/main/java/com/programmers/junho/Operation.java @@ -8,4 +8,12 @@ public int add(int num1, int num2) { public int subtract(int num1, int num2) { return num1 - num2; } + + public int multiply(int num1, int num2) { + return num1 * num2; + } + + public int divide(int num1, int num2) { + return num1 / num2; + } } diff --git a/java-calculator/src/test/java/com/programmers/junho/OperationTest.java b/java-calculator/src/test/java/com/programmers/junho/OperationTest.java index a38ecffa1..f59cbf4c2 100644 --- a/java-calculator/src/test/java/com/programmers/junho/OperationTest.java +++ b/java-calculator/src/test/java/com/programmers/junho/OperationTest.java @@ -19,4 +19,18 @@ void subtract() { int result = operation.subtract(1, 2); assertThat(result).isEqualTo(-1); } + + @Test + void multiply() { + Operation operation = new Operation(); + int result = operation.multiply(2, 4); + assertThat(result).isEqualTo(8); + } + + @Test + void divide() { + Operation operation = new Operation(); + int result = operation.divide(4, 2); + assertThat(result).isEqualTo(2); + } } From a152c5f661eebdb82219357dfc3cb3c0d8c71b82 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Fri, 2 Jun 2023 16:45:29 +0900 Subject: [PATCH 07/92] =?UTF-8?q?test:=20setup=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EB=A1=9C=20=EC=A4=91=EB=B3=B5=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=20refactor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/programmers/junho/OperationTest.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/java-calculator/src/test/java/com/programmers/junho/OperationTest.java b/java-calculator/src/test/java/com/programmers/junho/OperationTest.java index f59cbf4c2..13e21814a 100644 --- a/java-calculator/src/test/java/com/programmers/junho/OperationTest.java +++ b/java-calculator/src/test/java/com/programmers/junho/OperationTest.java @@ -1,35 +1,38 @@ package com.programmers.junho; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; class OperationTest { + private Operation operation; + @BeforeEach + void setUp() { + this.operation = new Operation(); + } + @Test void add() { - Operation operation = new Operation(); int result = operation.add(1, 2); assertThat(result).isEqualTo(3); } @Test void subtract() { - Operation operation = new Operation(); int result = operation.subtract(1, 2); assertThat(result).isEqualTo(-1); } @Test void multiply() { - Operation operation = new Operation(); int result = operation.multiply(2, 4); assertThat(result).isEqualTo(8); } @Test void divide() { - Operation operation = new Operation(); int result = operation.divide(4, 2); assertThat(result).isEqualTo(2); } From fcb46bec8b869310fcb7fd2b6a59a10612c3210c Mon Sep 17 00:00:00 2001 From: juno-junho Date: Fri, 9 Jun 2023 19:27:54 +0900 Subject: [PATCH 08/92] =?UTF-8?q?docs(README)=20:=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java-calculator/README.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/java-calculator/README.md b/java-calculator/README.md index cc810b207..ae15dcb57 100644 --- a/java-calculator/README.md +++ b/java-calculator/README.md @@ -34,11 +34,14 @@ ``` - [ ] 입력 - - [ ] Scanner를 통한 콘솔 입력 + - [ ] Scanner를 통한 콘솔 입력 + - [ ] BufferedReader로 입력 받는 것 교체 / 확장 가능 하게 추상화 시키기 (OCP) - [ ] 조회 기능 구현 - - [ ] 계산 후 이력을 Map으로 저장 - - [ ] 조회 기능 선택 시 계산 이력을 Map에서 가져 오기 + - [ ] 계산 후 이력을 List로 저장 -> Repository에서 생성 + - [ ] repository 패키지 안 Listfmf 가진 일급 컬렉션으로 구현 + - [ ] 인터페이스로 repository 추상화 + - [ ] 조회 기능 선택 시 계산 이력을 List에서 가져 오기 (repository에서 controller로 직접적으로 가져오기) - [ ] 계산 기능 구현 - [ ] 덧셈 @@ -46,8 +49,10 @@ - [ ] 나눗셈 - [ ] 곱하기 - [ ] 우선순위 (사칙연산) + - [ ] 후위 표기식 찾아보기 - [ ] 나눗셈과 곱셈이 덧셈과 뺄셈보다 우선순위가 높다 - + - [ ] 식에서 + - [ ] 예외 처리 - [ ] 조회(1), 계산(2) 이외의 값을 입력 했을 경우 `IllegalArgumentException` 발생 - [ ] 형식 (숫자 + 공백 + 기호 + 공백 + 숫자 + 공백 + 기호 + ...)이 잘못된 경우 `IllegalArgumentException` 발생 From cdb0b8457de6072f1b70a5077cca6b708d5d3adb Mon Sep 17 00:00:00 2001 From: juno-junho Date: Fri, 9 Jun 2023 19:29:28 +0900 Subject: [PATCH 09/92] =?UTF-8?q?feat(Repository)=20:=20List=EB=A1=9C=20re?= =?UTF-8?q?pository=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/CalculatorRepository.java | 9 +++++++ .../repository/ListCalculatorRepository.java | 24 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 java-calculator/src/main/java/com/programmers/junho/repository/CalculatorRepository.java create mode 100644 java-calculator/src/main/java/com/programmers/junho/repository/ListCalculatorRepository.java diff --git a/java-calculator/src/main/java/com/programmers/junho/repository/CalculatorRepository.java b/java-calculator/src/main/java/com/programmers/junho/repository/CalculatorRepository.java new file mode 100644 index 000000000..72d1c9858 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/junho/repository/CalculatorRepository.java @@ -0,0 +1,9 @@ +package com.programmers.junho.repository; + +import java.util.List; + +public interface CalculatorRepository { + void save(String calculatedResult); + + List findAll(); +} diff --git a/java-calculator/src/main/java/com/programmers/junho/repository/ListCalculatorRepository.java b/java-calculator/src/main/java/com/programmers/junho/repository/ListCalculatorRepository.java new file mode 100644 index 000000000..2303fa7f7 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/junho/repository/ListCalculatorRepository.java @@ -0,0 +1,24 @@ +package com.programmers.junho.repository; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class ListCalculatorRepository implements CalculatorRepository { + + private final List calculatedData; + + public ListCalculatorRepository() { + this.calculatedData = new ArrayList<>(); + } + + @Override + public void save(String calculatedResult) { + calculatedData.add(calculatedResult); + } + + @Override + public List findAll() { + return Collections.unmodifiableList(calculatedData); + } +} From 747b790355a662c9b108bef60b828061829e1407 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Fri, 9 Jun 2023 19:40:23 +0900 Subject: [PATCH 10/92] =?UTF-8?q?feat(view)=20:=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=EC=9D=84=20=EB=8B=B4=EB=8B=B9?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=93=A4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/programmers/junho/view/InputView.java | 15 +++++++++++++++ .../com/programmers/junho/view/OutputView.java | 14 ++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 java-calculator/src/main/java/com/programmers/junho/view/InputView.java create mode 100644 java-calculator/src/main/java/com/programmers/junho/view/OutputView.java diff --git a/java-calculator/src/main/java/com/programmers/junho/view/InputView.java b/java-calculator/src/main/java/com/programmers/junho/view/InputView.java new file mode 100644 index 000000000..e2ca0a549 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/junho/view/InputView.java @@ -0,0 +1,15 @@ +package com.programmers.junho.view; + +import java.util.Scanner; + +public class InputView { + private static final Scanner scanner = new Scanner(System.in); + public static int getChoseValue() { + System.out.print("선택 : "); + return scanner.nextInt(); + } + + public static String getExpression() { + return scanner.nextLine(); + } +} diff --git a/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java b/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java new file mode 100644 index 000000000..89a423f44 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java @@ -0,0 +1,14 @@ +package com.programmers.junho.view; + +import java.util.List; + +public class OutputView { + + public static void printExpressions(List expressions) { + expressions.forEach(System.out::println); + } + + public static void printCalculatedResult(int result) { + System.out.println(result); + } +} From 9c5d63c14f8449381d5dd8c527b43218ae98a1f1 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Fri, 9 Jun 2023 19:41:42 +0900 Subject: [PATCH 11/92] =?UTF-8?q?docs(README)=20:=20=EC=A7=84=ED=96=89?= =?UTF-8?q?=ED=95=9C=20=EC=82=AC=ED=95=AD=EB=93=A4=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java-calculator/README.md | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/java-calculator/README.md b/java-calculator/README.md index ae15dcb57..d158fb738 100644 --- a/java-calculator/README.md +++ b/java-calculator/README.md @@ -34,13 +34,20 @@ ``` - [ ] 입력 - - [ ] Scanner를 통한 콘솔 입력 + - [x] Scanner를 통한 콘솔 입력 + - [x] 선택 값 입력 받기 + - [x] 계산 기능 선택 시 -> 식 입력 받기 - [ ] BufferedReader로 입력 받는 것 교체 / 확장 가능 하게 추상화 시키기 (OCP) - +- [ ] 출력 + - [x] 조회 기능 선택 시 -> 조회 시 넘겨 받은 결과값 출력하기 + - [x] 계산 기능 선택 시 -> 계산 후 계산한 결과 출력하기 + - [ ] OutputView 추상화 시키기 + + - [ ] 조회 기능 구현 - - [ ] 계산 후 이력을 List로 저장 -> Repository에서 생성 - - [ ] repository 패키지 안 Listfmf 가진 일급 컬렉션으로 구현 - - [ ] 인터페이스로 repository 추상화 + - [x] 계산 후 이력을 List로 저장 -> Repository에서 생성 + - [x] repository 패키지 안 List 가진 일급 컬렉션으로 구현 + - [x] 인터페이스로 repository 추상화 - [ ] 조회 기능 선택 시 계산 이력을 List에서 가져 오기 (repository에서 controller로 직접적으로 가져오기) - [ ] 계산 기능 구현 From 11f9b35c0d9820d6d07eb686959ee31cf2a70448 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Fri, 9 Jun 2023 20:13:52 +0900 Subject: [PATCH 12/92] =?UTF-8?q?feat(view)=20:=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=20=EC=B6=94=EC=83=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/programmers/junho/view/InputView.java | 14 +++-------- .../programmers/junho/view/OutputView.java | 11 ++++----- .../junho/view/PrintStreamOutputView.java | 23 +++++++++++++++++++ .../junho/view/ScannerInputView.java | 18 +++++++++++++++ 4 files changed, 48 insertions(+), 18 deletions(-) create mode 100644 java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java create mode 100644 java-calculator/src/main/java/com/programmers/junho/view/ScannerInputView.java diff --git a/java-calculator/src/main/java/com/programmers/junho/view/InputView.java b/java-calculator/src/main/java/com/programmers/junho/view/InputView.java index e2ca0a549..bd1f902e1 100644 --- a/java-calculator/src/main/java/com/programmers/junho/view/InputView.java +++ b/java-calculator/src/main/java/com/programmers/junho/view/InputView.java @@ -1,15 +1,7 @@ package com.programmers.junho.view; -import java.util.Scanner; +public interface InputView { + int getSelectedCode(); -public class InputView { - private static final Scanner scanner = new Scanner(System.in); - public static int getChoseValue() { - System.out.print("선택 : "); - return scanner.nextInt(); - } - - public static String getExpression() { - return scanner.nextLine(); - } + String getExpression(); } diff --git a/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java b/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java index 89a423f44..5ccfe576f 100644 --- a/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java +++ b/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java @@ -2,13 +2,10 @@ import java.util.List; -public class OutputView { +public interface OutputView { - public static void printExpressions(List expressions) { - expressions.forEach(System.out::println); - } + void printChoiceMessage(); + void printExpressions(List expressions); - public static void printCalculatedResult(int result) { - System.out.println(result); - } + void printCalculatedResult(int result); } diff --git a/java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java b/java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java new file mode 100644 index 000000000..a829f1b0c --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java @@ -0,0 +1,23 @@ +package com.programmers.junho.view; + +import java.util.List; + +public class PrintStreamOutputView implements OutputView { + + public static final String CHOICE_MESSAGE = "1. 조회\n" + "2. 계산"; + + @Override + public void printChoiceMessage() { + System.out.println(CHOICE_MESSAGE); + } + + @Override + public void printExpressions(List expressions) { + expressions.forEach(System.out::println); + } + + @Override + public void printCalculatedResult(int result) { + System.out.println(result); + } +} diff --git a/java-calculator/src/main/java/com/programmers/junho/view/ScannerInputView.java b/java-calculator/src/main/java/com/programmers/junho/view/ScannerInputView.java new file mode 100644 index 000000000..6b46487d8 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/junho/view/ScannerInputView.java @@ -0,0 +1,18 @@ +package com.programmers.junho.view; + +import java.util.Scanner; + +public class ScannerInputView implements InputView{ + private static final Scanner scanner = new Scanner(System.in); + + @Override + public int getSelectedCode() { + System.out.print("선택 : "); + return scanner.nextInt(); + } + + @Override + public String getExpression() { + return scanner.nextLine(); + } +} From daaabb9199ed9478f5dd3432095d8089a76c1a81 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Fri, 9 Jun 2023 20:14:19 +0900 Subject: [PATCH 13/92] =?UTF-8?q?feat=20:=20controller=EB=A5=BC=20?= =?UTF-8?q?=EC=8B=A4=ED=96=89=ED=95=98=EB=8A=94=20application=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/programmers/junho/Application.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 java-calculator/src/main/java/com/programmers/junho/Application.java diff --git a/java-calculator/src/main/java/com/programmers/junho/Application.java b/java-calculator/src/main/java/com/programmers/junho/Application.java new file mode 100644 index 000000000..8c2e84c90 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/junho/Application.java @@ -0,0 +1,10 @@ +package com.programmers.junho; + +import com.programmers.junho.controller.CalculatorController; + +public class Application { + public static void main(String[] args) { + CalculatorController calculator = new CalculatorController(); + calculator.run(); + } +} From 254d78bae90b18e09043d2bb091a3311a30b52e5 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Fri, 9 Jun 2023 20:15:21 +0900 Subject: [PATCH 14/92] =?UTF-8?q?feat(controller)=20:=20view=EC=99=80=20do?= =?UTF-8?q?main,=20repository=EB=A5=BC=20=EC=9E=87=EB=8A=94=20=EC=BB=A8?= =?UTF-8?q?=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CalculatorController.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java diff --git a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java b/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java new file mode 100644 index 000000000..197a045b1 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java @@ -0,0 +1,38 @@ +package com.programmers.junho.controller; + +import com.programmers.junho.controller.constant.Selection; +import com.programmers.junho.repository.CalculatorRepository; +import com.programmers.junho.repository.ListCalculatorRepository; +import com.programmers.junho.view.InputView; +import com.programmers.junho.view.OutputView; +import com.programmers.junho.view.PrintStreamOutputView; +import com.programmers.junho.view.ScannerInputView; + +import static com.programmers.junho.controller.constant.Selection.findByCode; + +public class CalculatorController { + + private final CalculatorRepository calculatorRepository; + private final InputView inputView; + private final OutputView outputView; + + public CalculatorController() { + this.inputView = new ScannerInputView(); + this.outputView = new PrintStreamOutputView(); + this.calculatorRepository = new ListCalculatorRepository(); + } + + public void run() { + outputView.printChoiceMessage(); + Selection code = findByCode(inputView.getSelectedCode()); + switch (code){ + case CHECK_DATA: + // do something 1 + break; + case CALCULATE: + // do something 2 + default: + throw new IllegalArgumentException("잘못된 값을 입력하셨습니다."); + } + } +} From 021662f36020bc91d42c7880c42783b052b2abd4 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Fri, 9 Jun 2023 20:15:43 +0900 Subject: [PATCH 15/92] =?UTF-8?q?feat(controller)=20:=20=EC=8B=A4=ED=96=89?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=EB=A5=BC=20=EB=8B=B4=EB=8B=B9=ED=95=98?= =?UTF-8?q?=EB=8A=94=20enum=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../junho/controller/constant/Selection.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 java-calculator/src/main/java/com/programmers/junho/controller/constant/Selection.java diff --git a/java-calculator/src/main/java/com/programmers/junho/controller/constant/Selection.java b/java-calculator/src/main/java/com/programmers/junho/controller/constant/Selection.java new file mode 100644 index 000000000..ceb4116c2 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/junho/controller/constant/Selection.java @@ -0,0 +1,20 @@ +package com.programmers.junho.controller.constant; + +import java.util.Arrays; + +public enum Selection { + CHECK_DATA(1), CALCULATE(2); + + private final int code; + + Selection(int code) { + this.code = code; + } + + public static Selection findByCode(int code) { + return Arrays.stream(Selection.values()) + .filter(selection -> selection.code == code) + .findAny() + .orElseThrow(() -> new IllegalArgumentException("해당 값이 없습니다")); + } +} From 07b941e49e2190bd5b2491383b5a0780dcf632e0 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Fri, 9 Jun 2023 20:17:01 +0900 Subject: [PATCH 16/92] =?UTF-8?q?docs(README)=20:=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java-calculator/README.md | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/java-calculator/README.md b/java-calculator/README.md index d158fb738..96c14deb6 100644 --- a/java-calculator/README.md +++ b/java-calculator/README.md @@ -33,22 +33,29 @@ -1 ``` -- [ ] 입력 +- [x] 입력 - [x] Scanner를 통한 콘솔 입력 - [x] 선택 값 입력 받기 - [x] 계산 기능 선택 시 -> 식 입력 받기 - - [ ] BufferedReader로 입력 받는 것 교체 / 확장 가능 하게 추상화 시키기 (OCP) -- [ ] 출력 + - [x] BufferedReader로 입력 받는 것 교체 / 확장 가능 하게 추상화 시키기 (OCP) +- [x] 출력 - [x] 조회 기능 선택 시 -> 조회 시 넘겨 받은 결과값 출력하기 - [x] 계산 기능 선택 시 -> 계산 후 계산한 결과 출력하기 - - [ ] OutputView 추상화 시키기 + - [x] OutputView 추상화 시키기 +- [x] 컨트롤러 및 application 생성 + - 컨트롤러 역할 : view와 domain을 이어 준다 / repository에서 값을 가져온다. + - 게임을 실행하는 `run()`메서드를 가진다. + - Application 클래스 역할 + - 컨트롤러를 실행한다. + - view 객체를 생성해 컨트롤러에 주입시킨다. - [ ] 조회 기능 구현 - [x] 계산 후 이력을 List로 저장 -> Repository에서 생성 - [x] repository 패키지 안 List 가진 일급 컬렉션으로 구현 - [x] 인터페이스로 repository 추상화 - - [ ] 조회 기능 선택 시 계산 이력을 List에서 가져 오기 (repository에서 controller로 직접적으로 가져오기) + - [x] 조회 기능 선택 시 계산 이력을 List에서 가져 오기 (repository에서 controller로 직접적으로 가져오기) + - [ ] 계산 기능 구현 - [ ] 덧셈 @@ -61,6 +68,6 @@ - [ ] 식에서 - [ ] 예외 처리 - - [ ] 조회(1), 계산(2) 이외의 값을 입력 했을 경우 `IllegalArgumentException` 발생 + - [x] 조회(1), 계산(2) 이외의 값을 입력 했을 경우 `IllegalArgumentException` 발생 -> controller에서 처리 - [ ] 형식 (숫자 + 공백 + 기호 + 공백 + 숫자 + 공백 + 기호 + ...)이 잘못된 경우 `IllegalArgumentException` 발생 - [ ] int 자료형 overflow / underflow 발생 시 `ArithmeticException` 발생 \ No newline at end of file From f78d702bad50984f5363083431a262ac13727c00 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Fri, 9 Jun 2023 20:24:26 +0900 Subject: [PATCH 17/92] =?UTF-8?q?feat:=20=EA=B3=84=EC=82=B0=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programmers/junho/controller/CalculatorController.java | 7 +++++-- .../com/programmers/junho/view/PrintStreamOutputView.java | 7 +++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java b/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java index 197a045b1..a53f4edfe 100644 --- a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java +++ b/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java @@ -8,6 +8,8 @@ import com.programmers.junho.view.PrintStreamOutputView; import com.programmers.junho.view.ScannerInputView; +import java.util.List; + import static com.programmers.junho.controller.constant.Selection.findByCode; public class CalculatorController { @@ -27,10 +29,11 @@ public void run() { Selection code = findByCode(inputView.getSelectedCode()); switch (code){ case CHECK_DATA: - // do something 1 + List calculatedData = calculatorRepository.findAll(); + outputView.printExpressions(calculatedData); break; case CALCULATE: - // do something 2 + // 계산 기능 구현 default: throw new IllegalArgumentException("잘못된 값을 입력하셨습니다."); } diff --git a/java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java b/java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java index a829f1b0c..e8485e7f3 100644 --- a/java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java +++ b/java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java @@ -13,9 +13,16 @@ public void printChoiceMessage() { @Override public void printExpressions(List expressions) { + validateIfIsEmpty(expressions); expressions.forEach(System.out::println); } + private void validateIfIsEmpty(List expressions) { + if (expressions.isEmpty()) { + System.out.println("계산 값이 존재하지 않습니다."); + } + } + @Override public void printCalculatedResult(int result) { System.out.println(result); From 04ecda014d706f8b8bc03b2e1188fc37230b2b0d Mon Sep 17 00:00:00 2001 From: juno-junho Date: Fri, 9 Jun 2023 20:29:17 +0900 Subject: [PATCH 18/92] =?UTF-8?q?feat:=20controller=EC=97=90=20view=20?= =?UTF-8?q?=EC=A3=BC=EC=9E=85=ED=95=98=EB=8F=84=EB=A1=9D=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java-calculator/README.md | 7 +++++-- .../src/main/java/com/programmers/junho/Application.java | 9 ++++++++- .../junho/controller/CalculatorController.java | 8 +++----- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/java-calculator/README.md b/java-calculator/README.md index 96c14deb6..5c028fbba 100644 --- a/java-calculator/README.md +++ b/java-calculator/README.md @@ -45,12 +45,15 @@ - [x] 컨트롤러 및 application 생성 - 컨트롤러 역할 : view와 domain을 이어 준다 / repository에서 값을 가져온다. - - 게임을 실행하는 `run()`메서드를 가진다. - - Application 클래스 역할 + - 컨트롤러에서 담당 : repository를 결정한다 + - view는 주입 받는다(사용자가 결정) + - 게임을 실행하는 `run()`메서드를 가진다. + - Application 클래스 역할 : 사용자 - 컨트롤러를 실행한다. - view 객체를 생성해 컨트롤러에 주입시킨다. - [ ] 조회 기능 구현 + - [ ] 조회시 계산한 값이 없으면 `계산 값이 존재하지 않습니다` 메세지 출력 -> OutputView에서 담당 - [x] 계산 후 이력을 List로 저장 -> Repository에서 생성 - [x] repository 패키지 안 List 가진 일급 컬렉션으로 구현 - [x] 인터페이스로 repository 추상화 diff --git a/java-calculator/src/main/java/com/programmers/junho/Application.java b/java-calculator/src/main/java/com/programmers/junho/Application.java index 8c2e84c90..422cdb8b1 100644 --- a/java-calculator/src/main/java/com/programmers/junho/Application.java +++ b/java-calculator/src/main/java/com/programmers/junho/Application.java @@ -1,10 +1,17 @@ package com.programmers.junho; import com.programmers.junho.controller.CalculatorController; +import com.programmers.junho.view.InputView; +import com.programmers.junho.view.OutputView; +import com.programmers.junho.view.PrintStreamOutputView; +import com.programmers.junho.view.ScannerInputView; public class Application { public static void main(String[] args) { - CalculatorController calculator = new CalculatorController(); + InputView inputView = new ScannerInputView(); + OutputView outputView = new PrintStreamOutputView(); + + CalculatorController calculator = new CalculatorController(inputView, outputView); calculator.run(); } } diff --git a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java b/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java index a53f4edfe..8ed149c24 100644 --- a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java +++ b/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java @@ -5,8 +5,6 @@ import com.programmers.junho.repository.ListCalculatorRepository; import com.programmers.junho.view.InputView; import com.programmers.junho.view.OutputView; -import com.programmers.junho.view.PrintStreamOutputView; -import com.programmers.junho.view.ScannerInputView; import java.util.List; @@ -18,9 +16,9 @@ public class CalculatorController { private final InputView inputView; private final OutputView outputView; - public CalculatorController() { - this.inputView = new ScannerInputView(); - this.outputView = new PrintStreamOutputView(); + public CalculatorController(InputView inputView, OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; this.calculatorRepository = new ListCalculatorRepository(); } From a01be32681b4ee606cfe16c4640f622235fdc93d Mon Sep 17 00:00:00 2001 From: juno-junho Date: Fri, 9 Jun 2023 20:30:02 +0900 Subject: [PATCH 19/92] =?UTF-8?q?docs:=20=EC=A1=B0=ED=9A=8C=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=ED=9B=84=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java-calculator/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java-calculator/README.md b/java-calculator/README.md index 5c028fbba..121f10921 100644 --- a/java-calculator/README.md +++ b/java-calculator/README.md @@ -52,8 +52,8 @@ - 컨트롤러를 실행한다. - view 객체를 생성해 컨트롤러에 주입시킨다. -- [ ] 조회 기능 구현 - - [ ] 조회시 계산한 값이 없으면 `계산 값이 존재하지 않습니다` 메세지 출력 -> OutputView에서 담당 +- [x] 조회 기능 구현 + - [x] 조회시 계산한 값이 없으면 `계산 값이 존재하지 않습니다` 메세지 출력 -> OutputView에서 담당 - [x] 계산 후 이력을 List로 저장 -> Repository에서 생성 - [x] repository 패키지 안 List 가진 일급 컬렉션으로 구현 - [x] 인터페이스로 repository 추상화 From 91358fc76f5fe833c90e7a5d302d6b72a2bce39a Mon Sep 17 00:00:00 2001 From: juno-junho Date: Fri, 9 Jun 2023 23:10:32 +0900 Subject: [PATCH 20/92] =?UTF-8?q?feat(view):=20=EC=8B=9D=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=EB=B0=9B=EC=9D=84=EB=95=8C=20=EB=A9=94=EC=84=B8?= =?UTF-8?q?=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/programmers/junho/view/ScannerInputView.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java-calculator/src/main/java/com/programmers/junho/view/ScannerInputView.java b/java-calculator/src/main/java/com/programmers/junho/view/ScannerInputView.java index 6b46487d8..ab1e8ed39 100644 --- a/java-calculator/src/main/java/com/programmers/junho/view/ScannerInputView.java +++ b/java-calculator/src/main/java/com/programmers/junho/view/ScannerInputView.java @@ -13,6 +13,7 @@ public int getSelectedCode() { @Override public String getExpression() { + System.out.print("식 : "); return scanner.nextLine(); } } From e80fbfc728a5d3c50e1a2ee4ac37eb01e0069c0d Mon Sep 17 00:00:00 2001 From: juno-junho Date: Fri, 9 Jun 2023 23:11:03 +0900 Subject: [PATCH 21/92] =?UTF-8?q?refactor(controller):=20=EC=BB=A8?= =?UTF-8?q?=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CalculatorController.java | 39 +++++++++++++++---- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java b/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java index 8ed149c24..3ac4accb0 100644 --- a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java +++ b/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java @@ -1,6 +1,7 @@ package com.programmers.junho.controller; import com.programmers.junho.controller.constant.Selection; +import com.programmers.junho.domain.Calculator; import com.programmers.junho.repository.CalculatorRepository; import com.programmers.junho.repository.ListCalculatorRepository; import com.programmers.junho.view.InputView; @@ -23,17 +24,41 @@ public CalculatorController(InputView inputView, OutputView outputView) { } public void run() { - outputView.printChoiceMessage(); - Selection code = findByCode(inputView.getSelectedCode()); - switch (code){ + switch (getCode()){ case CHECK_DATA: - List calculatedData = calculatorRepository.findAll(); - outputView.printExpressions(calculatedData); + printAllPreviousData(); break; case CALCULATE: - // 계산 기능 구현 + printCalculatedResultAndSave(); + break; default: throw new IllegalArgumentException("잘못된 값을 입력하셨습니다."); } } -} + + private Selection getCode() { + outputView.printChoiceMessage(); + return findByCode(inputView.getSelectedCode()); + } + + private void printAllPreviousData() { + List calculatedData = calculatorRepository.findAll(); + outputView.printExpressions(calculatedData); + } + + private void printCalculatedResultAndSave() { + String expression = inputView.getExpression(); + int result = calculate(expression); + outputView.printCalculatedResult(result); + calculatorRepository.save(generateTotalResult(expression, result)); + } + + private int calculate(String expression) { + Calculator calculator = new Calculator(expression); + return calculator.calculate(); + } + + private String generateTotalResult(String expression, int result) { + return expression + " = " + result; + } +} \ No newline at end of file From 8b9fef48bd96537ef6c43d9df5544f7d5169b08a Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 00:22:11 +0900 Subject: [PATCH 22/92] =?UTF-8?q?test(domain):=20=EC=8B=9D=20=ED=98=95?= =?UTF-8?q?=EC=8B=9D=20=EC=B2=98=EB=A6=AC=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java-calculator/README.md | 1 + .../junho/domain/ExpressionTest.java | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java diff --git a/java-calculator/README.md b/java-calculator/README.md index 121f10921..b638e0fb4 100644 --- a/java-calculator/README.md +++ b/java-calculator/README.md @@ -73,4 +73,5 @@ - [ ] 예외 처리 - [x] 조회(1), 계산(2) 이외의 값을 입력 했을 경우 `IllegalArgumentException` 발생 -> controller에서 처리 - [ ] 형식 (숫자 + 공백 + 기호 + 공백 + 숫자 + 공백 + 기호 + ...)이 잘못된 경우 `IllegalArgumentException` 발생 + - 공백은 하나 or 하나 이하여야 한다 -> split 하기 전 replace or replaceAll로 공백 제거하고 split하기 - [ ] int 자료형 overflow / underflow 발생 시 `ArithmeticException` 발생 \ No newline at end of file diff --git a/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java b/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java new file mode 100644 index 000000000..8a400e1aa --- /dev/null +++ b/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java @@ -0,0 +1,41 @@ +package com.programmers.junho.domain; + + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThatNoException; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class ExpressionTest { + @DisplayName("올바른 형식의 식이면 예외가 발생하지 않는다.") + @ParameterizedTest + @ValueSource(strings = {"1 + 2", "1 - 3", "1 * 2", "4 / 2", "12 + 23 * 45"}) + void name(String expression) { + assertThatNoException().isThrownBy(() -> new Expression(expression)); + } + + @DisplayName("공백이 존재하지 않아도 예외가 발생하지 않는다.") + @ParameterizedTest + @ValueSource(strings = {"1+2", "1-3", "12+23* 45"}) + void name3(String expression) { + assertThatNoException().isThrownBy(() -> new Expression(expression)); + } + + @DisplayName("식과 연산 사이에 공백 개수가 하나 이상이면 예외가 발생한다.") + @ParameterizedTest + @ValueSource(strings = {"1 + 2, 1 - 2", "3 * 4 / 6"}) + void name2(String expression) { + assertThatThrownBy(() -> new Expression(expression)) + .isInstanceOf(IllegalArgumentException.class); + } + + @DisplayName("잘못된 형식이나 순서의 식이면 예외가 발생한다.") + @ParameterizedTest + @ValueSource(strings = {"1 & 2", "/ 1 + ", "1 / + 2"}) + void name6(String expression) { + assertThatThrownBy(() -> new Expression(expression)) + .isInstanceOf(IllegalArgumentException.class); + } +} \ No newline at end of file From faacd78001b4425020bde8da33e37021b3e36662 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 00:23:24 +0900 Subject: [PATCH 23/92] =?UTF-8?q?feat(domain):=20=EC=8B=9D=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=EC=9B=90=EC=8B=9C=EA=B0=92=20=ED=8F=AC?= =?UTF-8?q?=EC=9E=A5=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programmers/junho/domain/Expression.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 java-calculator/src/main/java/com/programmers/junho/domain/Expression.java diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java new file mode 100644 index 000000000..4bc1272e7 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java @@ -0,0 +1,19 @@ +package com.programmers.junho.domain; + +import java.util.regex.Pattern; + +public class Expression { + public static final String REGEX = "^\\d+\\s?([-+*/]\\s?\\d+\\s?)+$"; + private final String expression; + + public Expression(String expression) { + validateExpression(expression); + this.expression = expression; + } + + private void validateExpression(String expression) { + if (!Pattern.matches(REGEX, expression)) { + throw new IllegalArgumentException("잘못된 형식의 식을 입력하셨습니다."); + } + } +} From 156e61b7b9498470503c4dbff86a385e0952ddc4 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 01:22:11 +0900 Subject: [PATCH 24/92] =?UTF-8?q?test(domain):=20=EC=82=AC=EC=B9=99?= =?UTF-8?q?=EC=97=B0=EC=82=B0=EC=97=90=20=EB=8C=80=ED=95=9C=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/programmers/junho/{ => domain}/OperationTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename java-calculator/src/test/java/com/programmers/junho/{ => domain}/OperationTest.java (90%) diff --git a/java-calculator/src/test/java/com/programmers/junho/OperationTest.java b/java-calculator/src/test/java/com/programmers/junho/domain/OperationTest.java similarity index 90% rename from java-calculator/src/test/java/com/programmers/junho/OperationTest.java rename to java-calculator/src/test/java/com/programmers/junho/domain/OperationTest.java index 13e21814a..b3fae7236 100644 --- a/java-calculator/src/test/java/com/programmers/junho/OperationTest.java +++ b/java-calculator/src/test/java/com/programmers/junho/domain/OperationTest.java @@ -1,4 +1,4 @@ -package com.programmers.junho; +package com.programmers.junho.domain; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,7 +10,7 @@ class OperationTest { private Operation operation; @BeforeEach void setUp() { - this.operation = new Operation(); + this.operation = new Operation(1); } @Test From 5034d14f45147c173e653744c4d9462f51c483d2 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 01:41:34 +0900 Subject: [PATCH 25/92] =?UTF-8?q?test(domain):=20=EC=82=AC=EC=B9=99?= =?UTF-8?q?=EC=97=B0=EC=82=B0=EC=97=90=20=EB=8C=80=ED=95=9C=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programmers/junho/domain/OperationTest.java | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/java-calculator/src/test/java/com/programmers/junho/domain/OperationTest.java b/java-calculator/src/test/java/com/programmers/junho/domain/OperationTest.java index b3fae7236..67d578792 100644 --- a/java-calculator/src/test/java/com/programmers/junho/domain/OperationTest.java +++ b/java-calculator/src/test/java/com/programmers/junho/domain/OperationTest.java @@ -1,39 +1,33 @@ package com.programmers.junho.domain; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import static com.programmers.junho.domain.ArithmeticOperators.*; import static org.assertj.core.api.Assertions.assertThat; class OperationTest { - private Operation operation; - @BeforeEach - void setUp() { - this.operation = new Operation(1); - } - @Test void add() { - int result = operation.add(1, 2); + double result = ADDITION.apply(1, 2); assertThat(result).isEqualTo(3); } @Test void subtract() { - int result = operation.subtract(1, 2); + double result = SUBTRACTION.apply(1, 2); assertThat(result).isEqualTo(-1); } @Test void multiply() { - int result = operation.multiply(2, 4); + double result = MULTIPLICATION.apply(2, 4); assertThat(result).isEqualTo(8); } @Test void divide() { - int result = operation.divide(4, 2); + double result = DIVISION.apply(4, 2); assertThat(result).isEqualTo(2); } } From f8720b94d612c959c9a7382e67b631abb1d37ac2 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 01:42:19 +0900 Subject: [PATCH 26/92] =?UTF-8?q?feat(domain):=20=EC=82=AC=EC=B9=99?= =?UTF-8?q?=EC=97=B0=EC=82=B0=20=EA=B8=B0=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 --- .../junho/domain/ArithmeticOperators.java | 39 +++++++++++++++++++ .../programmers/junho/domain/Operator.java | 6 +++ 2 files changed, 45 insertions(+) create mode 100644 java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java create mode 100644 java-calculator/src/main/java/com/programmers/junho/domain/Operator.java diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java b/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java new file mode 100644 index 000000000..f027d56bf --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java @@ -0,0 +1,39 @@ +package com.programmers.junho.domain; + +public enum ArithmeticOperators implements Operator{ + ADDITION("+"){ + @Override + public double apply(double a, double b) { + return a + b; + } + }, + SUBTRACTION("-"){ + @Override + public double apply(double a, double b) { + return a - b; + } + }, + MULTIPLICATION("*"){ + @Override + public double apply(double a, double b) { + return a * b; + } + }, + DIVISION("/") { + @Override + public double apply(double a, double b) { + return a / b; + } + }; + + private final String operator; + + ArithmeticOperators(String operator) { + this.operator = operator; + } + + public String getOperator() { + return operator; + } + +} diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Operator.java b/java-calculator/src/main/java/com/programmers/junho/domain/Operator.java new file mode 100644 index 000000000..646919334 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Operator.java @@ -0,0 +1,6 @@ +package com.programmers.junho.domain; + +@FunctionalInterface +public interface Operator { + double apply(double a, double b); +} From ea769f04f008d684a80a64188cdab12d984995f7 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 02:34:48 +0900 Subject: [PATCH 27/92] =?UTF-8?q?test(domain):=20=EC=A4=91=EC=9C=84=20?= =?UTF-8?q?=ED=91=9C=ED=98=84=EC=8B=9D=EC=9D=84=20=ED=9B=84=EC=9C=84?= =?UTF-8?q?=ED=91=9C=ED=98=84=EC=8B=9D=EC=9C=BC=EB=A1=9C=20=EB=B0=94?= =?UTF-8?q?=EA=BE=B8=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programmers/junho/domain/ExpressionTest.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java b/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java index 8a400e1aa..d2e44b5d6 100644 --- a/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java +++ b/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java @@ -3,10 +3,10 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.ValueSource; -import static org.assertj.core.api.Assertions.assertThatNoException; -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.*; class ExpressionTest { @DisplayName("올바른 형식의 식이면 예외가 발생하지 않는다.") @@ -38,4 +38,15 @@ void name6(String expression) { assertThatThrownBy(() -> new Expression(expression)) .isInstanceOf(IllegalArgumentException.class); } + + @DisplayName("중위 표현식을 후위 표현식으로 변환한다.") + @ParameterizedTest(name = "중위 : {0}, 후위 : {1}") + @CsvSource(value = {"3 + 4 * 2:342*+", "1 + 2 * 3 + 4 / 2 + 2:123*+42/+2+", "4 + 5 * 6 / 2 - 3:456*2/+3-"}, delimiter = ':') + void name7(String infixExpression, String postfixExpression) { + Expression expression = new Expression(infixExpression); + + String actual = expression.getPostfixExpression(); + + assertThat(actual).isEqualTo(postfixExpression); + } } \ No newline at end of file From d7201e3623aad5ea5f9ed54a43b963ebf694a5dd Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 02:35:41 +0900 Subject: [PATCH 28/92] =?UTF-8?q?feat(domain):=20=ED=9B=84=EC=9C=84?= =?UTF-8?q?=EC=97=B0=EC=82=B0=EC=9E=90=EB=A1=9C=20=EB=B3=80=ED=99=98?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=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 --- .../java/com/programmers/junho/Operation.java | 19 ------------ .../junho/domain/ArithmeticOperators.java | 30 +++++++++++++++---- 2 files changed, 25 insertions(+), 24 deletions(-) delete mode 100644 java-calculator/src/main/java/com/programmers/junho/Operation.java diff --git a/java-calculator/src/main/java/com/programmers/junho/Operation.java b/java-calculator/src/main/java/com/programmers/junho/Operation.java deleted file mode 100644 index 143e70b12..000000000 --- a/java-calculator/src/main/java/com/programmers/junho/Operation.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.programmers.junho; - -public class Operation { - public int add(int num1, int num2) { - return num1 + num2; - } - - public int subtract(int num1, int num2) { - return num1 - num2; - } - - public int multiply(int num1, int num2) { - return num1 * num2; - } - - public int divide(int num1, int num2) { - return num1 / num2; - } -} diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java b/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java index f027d56bf..3a1410892 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java @@ -1,25 +1,27 @@ package com.programmers.junho.domain; +import java.util.Arrays; + public enum ArithmeticOperators implements Operator{ - ADDITION("+"){ + ADDITION("+", 0){ @Override public double apply(double a, double b) { return a + b; } }, - SUBTRACTION("-"){ + SUBTRACTION("-",0){ @Override public double apply(double a, double b) { return a - b; } }, - MULTIPLICATION("*"){ + MULTIPLICATION("*",1){ @Override public double apply(double a, double b) { return a * b; } }, - DIVISION("/") { + DIVISION("/",1) { @Override public double apply(double a, double b) { return a / b; @@ -27,13 +29,31 @@ public double apply(double a, double b) { }; private final String operator; + private final int priority; - ArithmeticOperators(String operator) { + ArithmeticOperators(String operator, int priority) { this.operator = operator; + this.priority = priority; + + } + + public static ArithmeticOperators convertTokenToOperator(String token) { + return Arrays.stream(values()) + .filter(operator -> operator.getOperator().equals(token)) + .findAny() + .orElseThrow(); + } + + public static boolean isOperator(String token) { + return Arrays.stream(values()) + .anyMatch(operator -> operator.getOperator().equals(token)); } public String getOperator() { return operator; } + public int getPriority() { + return priority; + } } From eb3763d9f9dd3061cf8ecff17d5c8fe59d7f22a4 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 02:40:30 +0900 Subject: [PATCH 29/92] =?UTF-8?q?feat(domain):=20=EC=A4=91=EC=9C=84=20?= =?UTF-8?q?=EC=97=B0=EC=82=B0=EC=9D=84=20=ED=9B=84=EC=9C=84=20=EC=97=B0?= =?UTF-8?q?=EC=82=B0=EC=9C=BC=EB=A1=9C=20=EB=B0=94=EA=BE=B8=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=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 --- .../programmers/junho/domain/Expression.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java index 4bc1272e7..d69d78bec 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java @@ -1,5 +1,6 @@ package com.programmers.junho.domain; +import java.util.Stack; import java.util.regex.Pattern; public class Expression { @@ -16,4 +17,38 @@ private void validateExpression(String expression) { throw new IllegalArgumentException("잘못된 형식의 식을 입력하셨습니다."); } } + + public String getPostfixExpression() { + String expression = removeSpace(); + + StringBuilder postfixExpression = new StringBuilder(); + + Stack stack = new Stack<>(); + + String[] tokens = expression.split(""); + for (String token : tokens) { + // 펴연산자 바로 출력 + if (!ArithmeticOperators.isOperator(token)) { + postfixExpression.append(token); + continue; + } + // 연산자면 + ArithmeticOperators operator = ArithmeticOperators.convertTokenToOperator(token); + while (!stack.isEmpty() && stack.peek().getPriority() >= operator.getPriority()) { + postfixExpression.append(stack.pop().getOperator()); + } + if (stack.isEmpty() || stack.peek().getPriority() < operator.getPriority()) { + stack.push(operator); + } + } + while (!stack.isEmpty()) { + postfixExpression.append(stack.pop().getOperator()); + } + return postfixExpression.toString(); + } + + private String removeSpace() { + return this.expression.replace(" ", ""); + } } + From 8e6ddbee6249fd23e04931fa4fdc5298ab00def0 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 02:43:15 +0900 Subject: [PATCH 30/92] =?UTF-8?q?fix:=20=EA=B2=B0=EA=B3=BC=20=EA=B0=92?= =?UTF-8?q?=EC=9D=84=20int=ED=98=95=EC=97=90=EC=84=9C=20double=ED=98=95?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programmers/junho/controller/CalculatorController.java | 6 +++--- .../main/java/com/programmers/junho/view/OutputView.java | 2 +- .../com/programmers/junho/view/PrintStreamOutputView.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java b/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java index 3ac4accb0..9bdb2684f 100644 --- a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java +++ b/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java @@ -48,17 +48,17 @@ private void printAllPreviousData() { private void printCalculatedResultAndSave() { String expression = inputView.getExpression(); - int result = calculate(expression); + double result = calculate(expression); outputView.printCalculatedResult(result); calculatorRepository.save(generateTotalResult(expression, result)); } - private int calculate(String expression) { + private double calculate(String expression) { Calculator calculator = new Calculator(expression); return calculator.calculate(); } - private String generateTotalResult(String expression, int result) { + private String generateTotalResult(String expression, double result) { return expression + " = " + result; } } \ No newline at end of file diff --git a/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java b/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java index 5ccfe576f..447d40807 100644 --- a/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java +++ b/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java @@ -7,5 +7,5 @@ public interface OutputView { void printChoiceMessage(); void printExpressions(List expressions); - void printCalculatedResult(int result); + void printCalculatedResult(double result); } diff --git a/java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java b/java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java index e8485e7f3..7abbfad37 100644 --- a/java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java +++ b/java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java @@ -24,7 +24,7 @@ private void validateIfIsEmpty(List expressions) { } @Override - public void printCalculatedResult(int result) { + public void printCalculatedResult(double result) { System.out.println(result); } } From 1cb190f8ca5bb6c14732006e9bd9ae104b89675b Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 02:45:11 +0900 Subject: [PATCH 31/92] =?UTF-8?q?test(domain):=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=9D=B4=EB=A6=84=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 --- .../domain/{OperationTest.java => ArithmticOperatorsTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename java-calculator/src/test/java/com/programmers/junho/domain/{OperationTest.java => ArithmticOperatorsTest.java} (95%) diff --git a/java-calculator/src/test/java/com/programmers/junho/domain/OperationTest.java b/java-calculator/src/test/java/com/programmers/junho/domain/ArithmticOperatorsTest.java similarity index 95% rename from java-calculator/src/test/java/com/programmers/junho/domain/OperationTest.java rename to java-calculator/src/test/java/com/programmers/junho/domain/ArithmticOperatorsTest.java index 67d578792..ad4766d77 100644 --- a/java-calculator/src/test/java/com/programmers/junho/domain/OperationTest.java +++ b/java-calculator/src/test/java/com/programmers/junho/domain/ArithmticOperatorsTest.java @@ -5,7 +5,7 @@ import static com.programmers.junho.domain.ArithmeticOperators.*; import static org.assertj.core.api.Assertions.assertThat; -class OperationTest { +class ArithmticOperatorsTest { @Test void add() { From b1bc8a0d6bb15e19a6a81e1637e9d0f2a3571d3e Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 02:58:04 +0900 Subject: [PATCH 32/92] =?UTF-8?q?fix:=20=EA=B2=B0=EA=B3=BC=20=EA=B0=92=20i?= =?UTF-8?q?nt=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 --- java-calculator/README.md | 20 +++++++++-- .../controller/CalculatorController.java | 4 +-- .../junho/domain/ArithmeticOperators.java | 8 ++--- .../programmers/junho/domain/Calculator.java | 36 +++++++++++++++++++ .../programmers/junho/domain/Operator.java | 2 +- .../programmers/junho/view/OutputView.java | 2 +- .../junho/view/PrintStreamOutputView.java | 2 +- 7 files changed, 62 insertions(+), 12 deletions(-) create mode 100644 java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java diff --git a/java-calculator/README.md b/java-calculator/README.md index b638e0fb4..83107345c 100644 --- a/java-calculator/README.md +++ b/java-calculator/README.md @@ -66,12 +66,26 @@ - [ ] 나눗셈 - [ ] 곱하기 - [ ] 우선순위 (사칙연산) - - [ ] 후위 표기식 찾아보기 + - [ ] 후위 표기식 찾아보기 - [ ] 나눗셈과 곱셈이 덧셈과 뺄셈보다 우선순위가 높다 - - [ ] 식에서 +``` +중위 표현식 -> 후위 표현식 전환 알고리즘 : +1. 피연산자는 스택에 넣지 않고 그냥 출력한다. +2. 연산자는 스택이 비었으면 스택에 push한다. +3. 연산자는 스택이 비어있지 않으면 스택에 있는 연산자와의 우선순위를 비교해 스택에 있는 연산자의 우선순위가 같거나 크다면 스택에 있는 연산자를 pop을 한 후 출력하고 현재 연산자는 스택에 push한다. +4. 만약 3번에서 우선순위가 현재 연산자가 더 크면 현재 연산자를 push한다.(스택에서 pop하지 않음) +5. 수식이 끝나면 스택이 빌 때 까지 pop을 한 후 출력한다. + +후위 표현식 -> 계산 알고리즘 +1. 피연산자면 스택에 push한다. +2. 연산자를 만나면 pop을 두번하고 각각 값을 저장한 후, 연산자에 맞는 계산을 한다. +3. 계산을 한 뒤, 결과 값은 다시 스택에 넣는다. 이 과정을 수식이 끝날 때 까지 반복한다. +4. 수식이 끝났다면 스택에 마지막 남은 값이 결과 값이 된다. +``` + - [ ] 예외 처리 - [x] 조회(1), 계산(2) 이외의 값을 입력 했을 경우 `IllegalArgumentException` 발생 -> controller에서 처리 - - [ ] 형식 (숫자 + 공백 + 기호 + 공백 + 숫자 + 공백 + 기호 + ...)이 잘못된 경우 `IllegalArgumentException` 발생 + - [x] 형식 (숫자 + 공백 + 기호 + 공백 + 숫자 + 공백 + 기호 + ...)이 잘못된 경우 `IllegalArgumentException` 발생 - 공백은 하나 or 하나 이하여야 한다 -> split 하기 전 replace or replaceAll로 공백 제거하고 split하기 - [ ] int 자료형 overflow / underflow 발생 시 `ArithmeticException` 발생 \ No newline at end of file diff --git a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java b/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java index 9bdb2684f..fba1cd6e9 100644 --- a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java +++ b/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java @@ -48,12 +48,12 @@ private void printAllPreviousData() { private void printCalculatedResultAndSave() { String expression = inputView.getExpression(); - double result = calculate(expression); + int result = calculate(expression); outputView.printCalculatedResult(result); calculatorRepository.save(generateTotalResult(expression, result)); } - private double calculate(String expression) { + private int calculate(String expression) { Calculator calculator = new Calculator(expression); return calculator.calculate(); } diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java b/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java index 3a1410892..9359c69af 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java @@ -5,25 +5,25 @@ public enum ArithmeticOperators implements Operator{ ADDITION("+", 0){ @Override - public double apply(double a, double b) { + public int apply(int a, int b) { return a + b; } }, SUBTRACTION("-",0){ @Override - public double apply(double a, double b) { + public int apply(int a, int b) { return a - b; } }, MULTIPLICATION("*",1){ @Override - public double apply(double a, double b) { + public int apply(int a, int b) { return a * b; } }, DIVISION("/",1) { @Override - public double apply(double a, double b) { + public int apply(int a, int b) { return a / b; } }; diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java b/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java new file mode 100644 index 000000000..b00b60d12 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java @@ -0,0 +1,36 @@ +package com.programmers.junho.domain; + +import java.util.Stack; + +public class Calculator { + + private final Expression expression; + + public Calculator(String expression) { + this.expression = new Expression(expression); + } + + public int calculate() { + String postfixExpression = expression.getPostfixExpression(); + String[] tokens = postfixExpression.split(""); + Stack stack = new Stack<>(); + + for (String token : tokens) { + // 숫자면 일단 스택에 넣는다. + if (!ArithmeticOperators.isOperator(token)) { + stack.push(Integer.parseInt(token)); + continue; + } + // 문자면 두번 pop해서 연산해서 다시 스택에 넣는다 + ArithmeticOperators operator = ArithmeticOperators.convertTokenToOperator(token); + Integer second = stack.pop(); + Integer first = stack.pop(); + stack.push(operator.apply(first, second)); +// stack.pop() + + + } + + return 1; + } +} diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Operator.java b/java-calculator/src/main/java/com/programmers/junho/domain/Operator.java index 646919334..b03293782 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Operator.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Operator.java @@ -2,5 +2,5 @@ @FunctionalInterface public interface Operator { - double apply(double a, double b); + int apply(int a, int b); } diff --git a/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java b/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java index 447d40807..5ccfe576f 100644 --- a/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java +++ b/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java @@ -7,5 +7,5 @@ public interface OutputView { void printChoiceMessage(); void printExpressions(List expressions); - void printCalculatedResult(double result); + void printCalculatedResult(int result); } diff --git a/java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java b/java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java index 7abbfad37..e8485e7f3 100644 --- a/java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java +++ b/java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java @@ -24,7 +24,7 @@ private void validateIfIsEmpty(List expressions) { } @Override - public void printCalculatedResult(double result) { + public void printCalculatedResult(int result) { System.out.println(result); } } From 1882786c17648a0d142334cf49c15734ee13b6b9 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 02:58:26 +0900 Subject: [PATCH 33/92] =?UTF-8?q?test(domain):=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ArithmticOperatorsTest.java => ArithmeticOperatorsTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename java-calculator/src/test/java/com/programmers/junho/domain/{ArithmticOperatorsTest.java => ArithmeticOperatorsTest.java} (95%) diff --git a/java-calculator/src/test/java/com/programmers/junho/domain/ArithmticOperatorsTest.java b/java-calculator/src/test/java/com/programmers/junho/domain/ArithmeticOperatorsTest.java similarity index 95% rename from java-calculator/src/test/java/com/programmers/junho/domain/ArithmticOperatorsTest.java rename to java-calculator/src/test/java/com/programmers/junho/domain/ArithmeticOperatorsTest.java index ad4766d77..71f3d1419 100644 --- a/java-calculator/src/test/java/com/programmers/junho/domain/ArithmticOperatorsTest.java +++ b/java-calculator/src/test/java/com/programmers/junho/domain/ArithmeticOperatorsTest.java @@ -5,7 +5,7 @@ import static com.programmers.junho.domain.ArithmeticOperators.*; import static org.assertj.core.api.Assertions.assertThat; -class ArithmticOperatorsTest { +class ArithmeticOperatorsTest { @Test void add() { From cab396ba1b1e37a6ec0f8012794c2da2fd51d4c4 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 03:04:35 +0900 Subject: [PATCH 34/92] =?UTF-8?q?test(domain):=20=EC=8B=9D=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EA=B3=84=EC=82=B0=20=EA=B2=B0=EA=B3=BC=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../junho/domain/CalculatorTest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java diff --git a/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java b/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java new file mode 100644 index 000000000..340a90d7b --- /dev/null +++ b/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java @@ -0,0 +1,21 @@ +package com.programmers.junho.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.Assertions.assertThat; + +class CalculatorTest { + + @DisplayName("계산 결과 테스트") + @ParameterizedTest(name ="식: {0}, 결과: {1}") + @CsvSource(value = {"1 + 2:3", "1 + 2 * 3:7", "3 - 2 * 2:-1"}, delimiter = ':') + void name(String expression, int calculatedResult) { + Calculator calculator = new Calculator(expression); + + int actual = calculator.calculate(); + + assertThat(actual).isEqualTo(calculatedResult); + } +} \ No newline at end of file From ae83531b59abb5637aa04ba7f35e03d868577890 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 03:05:43 +0900 Subject: [PATCH 35/92] =?UTF-8?q?feat(domain):=20=EC=82=AC=EC=B9=99?= =?UTF-8?q?=EC=97=B0=EC=82=B0=20=EA=B3=84=EC=82=B0=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=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/junho/domain/Calculator.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java b/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java index b00b60d12..e91ebf776 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java @@ -26,11 +26,8 @@ public int calculate() { Integer second = stack.pop(); Integer first = stack.pop(); stack.push(operator.apply(first, second)); -// stack.pop() - - } - - return 1; + // 스택 결과값 + return stack.pop(); } } From 37fd625e97c35910b7c35f708b821be9c34a4a90 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 03:08:07 +0900 Subject: [PATCH 36/92] =?UTF-8?q?docs(README):=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=A0=90=EA=B2=80=20=EB=B0=8F=20=EC=B2=B4?= =?UTF-8?q?=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java-calculator/README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/java-calculator/README.md b/java-calculator/README.md index 83107345c..533f414ee 100644 --- a/java-calculator/README.md +++ b/java-calculator/README.md @@ -60,14 +60,14 @@ - [x] 조회 기능 선택 시 계산 이력을 List에서 가져 오기 (repository에서 controller로 직접적으로 가져오기) -- [ ] 계산 기능 구현 - - [ ] 덧셈 - - [ ] 뺄셈 - - [ ] 나눗셈 - - [ ] 곱하기 - - [ ] 우선순위 (사칙연산) - - [ ] 후위 표기식 찾아보기 - - [ ] 나눗셈과 곱셈이 덧셈과 뺄셈보다 우선순위가 높다 +- [x] 계산 기능 구현 + - [x] 덧셈 + - [x] 뺄셈 + - [x] 나눗셈 + - [x] 곱하기 + - [x] 우선순위 (사칙연산) + - [x] 후위 표기식 찾아보기 + - [x] 나눗셈과 곱셈이 덧셈과 뺄셈보다 우선순위가 높다 ``` 중위 표현식 -> 후위 표현식 전환 알고리즘 : 1. 피연산자는 스택에 넣지 않고 그냥 출력한다. From a61066528a20bb2cca0dc8a55d50d0cfc634271a Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 03:24:51 +0900 Subject: [PATCH 37/92] =?UTF-8?q?refactor(domain):=20Calculator=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20refactor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programmers/junho/domain/Calculator.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java b/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java index e91ebf776..287a8e2a8 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java @@ -16,18 +16,20 @@ public int calculate() { Stack stack = new Stack<>(); for (String token : tokens) { - // 숫자면 일단 스택에 넣는다. - if (!ArithmeticOperators.isOperator(token)) { - stack.push(Integer.parseInt(token)); - continue; - } - // 문자면 두번 pop해서 연산해서 다시 스택에 넣는다 - ArithmeticOperators operator = ArithmeticOperators.convertTokenToOperator(token); - Integer second = stack.pop(); - Integer first = stack.pop(); - stack.push(operator.apply(first, second)); + extracted(stack, token); } // 스택 결과값 return stack.pop(); } + + private void extracted(Stack stack, String token) { + if (ArithmeticOperators.isNumber(token)) { + stack.push(Integer.parseInt(token)); + return; + } + ArithmeticOperators operator = ArithmeticOperators.convertTokenToOperator(token); + Integer second = stack.pop(); + Integer first = stack.pop(); + stack.push(operator.apply(first, second)); + } } From c577dd76d9ab4f27760bd58fa7784676badbe647 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 03:25:31 +0900 Subject: [PATCH 38/92] =?UTF-8?q?refactor(domain):=20ArithmeticOperators?= =?UTF-8?q?=20=EB=A9=94=EC=84=9C=EB=93=9C=20rename?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/programmers/junho/domain/ArithmeticOperators.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java b/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java index 9359c69af..fe876d66c 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java @@ -44,9 +44,9 @@ public static ArithmeticOperators convertTokenToOperator(String token) { .orElseThrow(); } - public static boolean isOperator(String token) { + public static boolean isNumber(String token) { return Arrays.stream(values()) - .anyMatch(operator -> operator.getOperator().equals(token)); + .noneMatch(operator -> operator.getOperator().equals(token)); } public String getOperator() { From c3b3acc30f440775d1f408035c996680d0b5a0b8 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 03:26:33 +0900 Subject: [PATCH 39/92] =?UTF-8?q?refactor(domain):=20Expression=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=20refactor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programmers/junho/domain/Expression.java | 46 +++++++++++-------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java index d69d78bec..2a882c070 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java @@ -3,8 +3,12 @@ import java.util.Stack; import java.util.regex.Pattern; +import static com.programmers.junho.domain.ArithmeticOperators.convertTokenToOperator; +import static com.programmers.junho.domain.ArithmeticOperators.isNumber; + public class Expression { public static final String REGEX = "^\\d+\\s?([-+*/]\\s?\\d+\\s?)+$"; + public static final String DELIMITER = ""; private final String expression; public Expression(String expression) { @@ -19,35 +23,39 @@ private void validateExpression(String expression) { } public String getPostfixExpression() { - String expression = removeSpace(); - StringBuilder postfixExpression = new StringBuilder(); - Stack stack = new Stack<>(); - String[] tokens = expression.split(""); + String[] tokens = removeSpaceFromExpression().split(DELIMITER); for (String token : tokens) { - // 펴연산자 바로 출력 - if (!ArithmeticOperators.isOperator(token)) { - postfixExpression.append(token); - continue; - } - // 연산자면 - ArithmeticOperators operator = ArithmeticOperators.convertTokenToOperator(token); - while (!stack.isEmpty() && stack.peek().getPriority() >= operator.getPriority()) { - postfixExpression.append(stack.pop().getOperator()); - } - if (stack.isEmpty() || stack.peek().getPriority() < operator.getPriority()) { - stack.push(operator); - } + converseToPostfix(postfixExpression, stack, token); + } + appendAllExistingElement(postfixExpression, stack); + return postfixExpression.toString(); + } + + private void converseToPostfix(StringBuilder postfixExpression, Stack stack, String token) { + if (isNumber(token)) { + postfixExpression.append(token); + return; } + var operator = convertTokenToOperator(token); + while (isStackNotEmptyAndOperatorPriorityLower(stack, operator)) { + postfixExpression.append(stack.pop().getOperator()); + } + stack.push(operator); + } + + private void appendAllExistingElement(StringBuilder postfixExpression, Stack stack) { while (!stack.isEmpty()) { postfixExpression.append(stack.pop().getOperator()); } - return postfixExpression.toString(); + } + private boolean isStackNotEmptyAndOperatorPriorityLower(Stack stack, ArithmeticOperators operator) { + return !stack.isEmpty() && stack.peek().getPriority() >= operator.getPriority(); } - private String removeSpace() { + private String removeSpaceFromExpression() { return this.expression.replace(" ", ""); } } From 2b3fe4f536596ddd48272b8670a2b91fb11bbd98 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 03:56:15 +0900 Subject: [PATCH 40/92] =?UTF-8?q?fix(domain):=20=EB=91=90=EC=9E=90?= =?UTF-8?q?=EB=A6=AC=20=EC=9D=B4=EC=83=81=20=EC=97=B0=EC=82=B0=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EC=9D=B4=EC=83=81=EB=AC=B8=EC=A0=9C=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programmers/junho/domain/Expression.java | 26 ++++++++++--------- .../junho/domain/ExpressionTest.java | 7 ++--- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java index 2a882c070..056731e64 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java @@ -1,5 +1,6 @@ package com.programmers.junho.domain; +import java.util.Arrays; import java.util.Stack; import java.util.regex.Pattern; @@ -7,8 +8,8 @@ import static com.programmers.junho.domain.ArithmeticOperators.isNumber; public class Expression { - public static final String REGEX = "^\\d+\\s?([-+*/]\\s?\\d+\\s?)+$"; - public static final String DELIMITER = ""; + public static final String REGEX = "^\\d+\\s([-+*/]\\s\\d+\\s)+$"; + public static final String DELIMITER = " "; private final String expression; public Expression(String expression) { @@ -17,46 +18,47 @@ public Expression(String expression) { } private void validateExpression(String expression) { - if (!Pattern.matches(REGEX, expression)) { + if (!Pattern.matches(REGEX, appendBlankForRegex(expression))) { throw new IllegalArgumentException("잘못된 형식의 식을 입력하셨습니다."); } } + private String appendBlankForRegex(String expression) { + return expression + " "; + } + public String getPostfixExpression() { StringBuilder postfixExpression = new StringBuilder(); Stack stack = new Stack<>(); - String[] tokens = removeSpaceFromExpression().split(DELIMITER); + String[] tokens = this.expression.split(DELIMITER); + System.out.println(Arrays.toString(tokens)); for (String token : tokens) { converseToPostfix(postfixExpression, stack, token); } appendAllExistingElement(postfixExpression, stack); - return postfixExpression.toString(); + return postfixExpression.toString().trim(); } private void converseToPostfix(StringBuilder postfixExpression, Stack stack, String token) { if (isNumber(token)) { - postfixExpression.append(token); + postfixExpression.append(token).append(" "); return; } var operator = convertTokenToOperator(token); while (isStackNotEmptyAndOperatorPriorityLower(stack, operator)) { - postfixExpression.append(stack.pop().getOperator()); + postfixExpression.append(stack.pop().getOperator()).append(" "); } stack.push(operator); } private void appendAllExistingElement(StringBuilder postfixExpression, Stack stack) { while (!stack.isEmpty()) { - postfixExpression.append(stack.pop().getOperator()); + postfixExpression.append(stack.pop().getOperator()).append(" "); } } private boolean isStackNotEmptyAndOperatorPriorityLower(Stack stack, ArithmeticOperators operator) { return !stack.isEmpty() && stack.peek().getPriority() >= operator.getPriority(); } - - private String removeSpaceFromExpression() { - return this.expression.replace(" ", ""); - } } diff --git a/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java b/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java index d2e44b5d6..fae97b9d1 100644 --- a/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java +++ b/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java @@ -16,11 +16,12 @@ void name(String expression) { assertThatNoException().isThrownBy(() -> new Expression(expression)); } - @DisplayName("공백이 존재하지 않아도 예외가 발생하지 않는다.") + @DisplayName("공백이 존재하지 않으면 예외가 발생한다.") @ParameterizedTest @ValueSource(strings = {"1+2", "1-3", "12+23* 45"}) void name3(String expression) { - assertThatNoException().isThrownBy(() -> new Expression(expression)); + assertThatThrownBy(() -> new Expression(expression)) + .isInstanceOf(IllegalArgumentException.class); } @DisplayName("식과 연산 사이에 공백 개수가 하나 이상이면 예외가 발생한다.") @@ -41,7 +42,7 @@ void name6(String expression) { @DisplayName("중위 표현식을 후위 표현식으로 변환한다.") @ParameterizedTest(name = "중위 : {0}, 후위 : {1}") - @CsvSource(value = {"3 + 4 * 2:342*+", "1 + 2 * 3 + 4 / 2 + 2:123*+42/+2+", "4 + 5 * 6 / 2 - 3:456*2/+3-"}, delimiter = ':') + @CsvSource(value = {"3 + 4 * 2:3 4 2 * +", "1 + 2 * 3 + 4 / 2 + 2:1 2 3 * + 4 2 / + 2 +", "4 + 5 * 6 / 2 - 3:4 5 6 * 2 / + 3 -", "44 / 2:44 2 /"}, delimiter = ':') void name7(String infixExpression, String postfixExpression) { Expression expression = new Expression(infixExpression); From 2847dc736af241fa251610c167fe8aa2a1eab4cb Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 04:04:53 +0900 Subject: [PATCH 41/92] =?UTF-8?q?refactor(domain):=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EB=AA=85=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20?= =?UTF-8?q?=EC=A0=84=EC=B2=B4=EC=A0=81=20refactor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../programmers/junho/domain/Calculator.java | 19 ++++++++++--------- .../programmers/junho/domain/Expression.java | 4 ++-- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java b/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java index 287a8e2a8..d15c623bc 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java @@ -2,8 +2,11 @@ import java.util.Stack; +import static com.programmers.junho.domain.ArithmeticOperators.*; + public class Calculator { + private static final String DELIMITER = " "; private final Expression expression; public Calculator(String expression) { @@ -12,24 +15,22 @@ public Calculator(String expression) { public int calculate() { String postfixExpression = expression.getPostfixExpression(); - String[] tokens = postfixExpression.split(""); + String[] tokens = postfixExpression.split(DELIMITER); Stack stack = new Stack<>(); for (String token : tokens) { - extracted(stack, token); + postfixEvaluate(stack, token); } - // 스택 결과값 return stack.pop(); } - private void extracted(Stack stack, String token) { - if (ArithmeticOperators.isNumber(token)) { + private void postfixEvaluate(Stack stack, String token) { + if (isNumber(token)) { stack.push(Integer.parseInt(token)); return; } - ArithmeticOperators operator = ArithmeticOperators.convertTokenToOperator(token); - Integer second = stack.pop(); - Integer first = stack.pop(); - stack.push(operator.apply(first, second)); + Integer secondValue = stack.pop(); + Integer firstValue = stack.pop(); + stack.push(convertTokenToOperator(token).apply(firstValue, secondValue)); } } diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java index 056731e64..82f93f4e1 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java @@ -8,8 +8,8 @@ import static com.programmers.junho.domain.ArithmeticOperators.isNumber; public class Expression { - public static final String REGEX = "^\\d+\\s([-+*/]\\s\\d+\\s)+$"; - public static final String DELIMITER = " "; + private static final String REGEX = "^\\d+\\s([-+*/]\\s\\d+\\s)+$"; + private static final String DELIMITER = " "; private final String expression; public Expression(String expression) { From e0c42fa5403c362d805652fefafba67fdb2af447 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 04:05:15 +0900 Subject: [PATCH 42/92] =?UTF-8?q?refactor(domain):=20=EA=B2=B0=EA=B3=BC?= =?UTF-8?q?=EA=B0=92=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/programmers/junho/domain/CalculatorTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java b/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java index 340a90d7b..d6cd90043 100644 --- a/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java +++ b/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java @@ -9,8 +9,8 @@ class CalculatorTest { @DisplayName("계산 결과 테스트") - @ParameterizedTest(name ="식: {0}, 결과: {1}") - @CsvSource(value = {"1 + 2:3", "1 + 2 * 3:7", "3 - 2 * 2:-1"}, delimiter = ':') + @ParameterizedTest(name = "식: {0}, 결과: {1}") + @CsvSource(value = {"1 + 2:3", "1 + 2 * 3:7", "3 - 2 * 2:-1", "44 / 2 * 8:176", "22 * 8:176", "12 + 44 / 2 * 8 - 10 + 18 / 2 / 3:181"}, delimiter = ':') void name(String expression, int calculatedResult) { Calculator calculator = new Calculator(expression); From 85687482645e9982e0324c66e045b56e18b20013 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 04:23:26 +0900 Subject: [PATCH 43/92] =?UTF-8?q?test(domain):=20=EA=B3=84=EC=82=B0=20?= =?UTF-8?q?=EC=8B=9C=20=EC=A0=95=EC=88=98=20=ED=98=95=20=EA=B2=B0=EA=B3=BC?= =?UTF-8?q?=EA=B0=80=20=EB=B2=97=EC=96=B4=20=EB=82=AC=EC=9D=84=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20=EC=98=88=EC=99=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/programmers/junho/domain/CalculatorTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java b/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java index d6cd90043..98182b026 100644 --- a/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java +++ b/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java @@ -3,8 +3,10 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; class CalculatorTest { @@ -18,4 +20,12 @@ void name(String expression, int calculatedResult) { assertThat(actual).isEqualTo(calculatedResult); } + + @DisplayName("정수 형 값을 벗어났을 경우 예외 발생") + @ParameterizedTest(name = "식: {0}") + @ValueSource(strings = {"999999 * 999999 * 99999 * 9999999","1 - 999999999 - 999999999 - 999999999 - 999999999"}) + void test2(String expression) { + assertThatThrownBy(() -> new Calculator(expression).calculate()) + .isInstanceOf(ArithmeticException.class); + } } \ No newline at end of file From bedc166f29d891be39b16194459d768ba1a95e8c Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 04:23:56 +0900 Subject: [PATCH 44/92] =?UTF-8?q?feat(domain):=20=EC=A0=95=EC=88=98?= =?UTF-8?q?=ED=98=95=20overflow,=20underflow=20=EC=98=88=EC=99=B8=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 --- .../com/programmers/junho/domain/ArithmeticOperators.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java b/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java index fe876d66c..e4ceacdef 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java @@ -6,19 +6,19 @@ public enum ArithmeticOperators implements Operator{ ADDITION("+", 0){ @Override public int apply(int a, int b) { - return a + b; + return Math.addExact(a, b); } }, SUBTRACTION("-",0){ @Override public int apply(int a, int b) { - return a - b; + return Math.subtractExact(a,b); } }, MULTIPLICATION("*",1){ @Override public int apply(int a, int b) { - return a * b; + return Math.multiplyExact(a, b); } }, DIVISION("/",1) { From 1681a69be52887daa233636c4bff4cff16f995db Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 04:42:30 +0900 Subject: [PATCH 45/92] =?UTF-8?q?test(domain):=20=EC=A0=95=EC=88=98?= =?UTF-8?q?=ED=98=95=20overflow,=20underflow=20=EC=98=88=EC=99=B8=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 --- java-calculator/README.md | 4 ++-- .../com/programmers/junho/domain/CalculatorTest.java | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/java-calculator/README.md b/java-calculator/README.md index 533f414ee..0e7c24f45 100644 --- a/java-calculator/README.md +++ b/java-calculator/README.md @@ -84,8 +84,8 @@ ``` -- [ ] 예외 처리 +- [x] 예외 처리 - [x] 조회(1), 계산(2) 이외의 값을 입력 했을 경우 `IllegalArgumentException` 발생 -> controller에서 처리 - [x] 형식 (숫자 + 공백 + 기호 + 공백 + 숫자 + 공백 + 기호 + ...)이 잘못된 경우 `IllegalArgumentException` 발생 - 공백은 하나 or 하나 이하여야 한다 -> split 하기 전 replace or replaceAll로 공백 제거하고 split하기 - - [ ] int 자료형 overflow / underflow 발생 시 `ArithmeticException` 발생 \ No newline at end of file + - [x] int 자료형 overflow / underflow 발생 시 `ArithmeticException` 발생 \ No newline at end of file diff --git a/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java b/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java index 98182b026..3c6d2cfb5 100644 --- a/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java +++ b/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java @@ -1,6 +1,7 @@ package com.programmers.junho.domain; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.ValueSource; @@ -28,4 +29,12 @@ void test2(String expression) { assertThatThrownBy(() -> new Calculator(expression).calculate()) .isInstanceOf(ArithmeticException.class); } + + @DisplayName("입력값이 정수 범위를 초과하면 예외를 발생한다.") + @Test + void test123() { + Calculator calculator = new Calculator("999999999999999 + 1"); + assertThatThrownBy(calculator::calculate) + .isInstanceOf(IllegalArgumentException.class); + } } \ No newline at end of file From f30f052ddefce1f3eefda196623fb750992b2257 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 04:43:32 +0900 Subject: [PATCH 46/92] =?UTF-8?q?feat(domain):=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=EB=A5=BC=20=EC=A0=84=ED=99=98=ED=95=B4=20=EC=A3=BC=EB=8A=94=20?= =?UTF-8?q?Util=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=B0=8F=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=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 --- .../com/programmers/junho/domain/Calculator.java | 6 ++++-- .../com/programmers/junho/domain/utils/Util.java | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 java-calculator/src/main/java/com/programmers/junho/domain/utils/Util.java diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java b/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java index d15c623bc..08cc84de3 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java @@ -2,7 +2,9 @@ import java.util.Stack; -import static com.programmers.junho.domain.ArithmeticOperators.*; +import static com.programmers.junho.domain.ArithmeticOperators.convertTokenToOperator; +import static com.programmers.junho.domain.ArithmeticOperators.isNumber; +import static com.programmers.junho.domain.utils.Util.convertStringToInt; public class Calculator { @@ -26,7 +28,7 @@ public int calculate() { private void postfixEvaluate(Stack stack, String token) { if (isNumber(token)) { - stack.push(Integer.parseInt(token)); + stack.push(convertStringToInt(token)); return; } Integer secondValue = stack.pop(); diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/utils/Util.java b/java-calculator/src/main/java/com/programmers/junho/domain/utils/Util.java new file mode 100644 index 000000000..741903b97 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/junho/domain/utils/Util.java @@ -0,0 +1,16 @@ +package com.programmers.junho.domain.utils; + +public class Util { + + private Util() { + throw new AssertionError("Uil 클래스 생성 불가합니다."); + } + + public static int convertStringToInt(String str) { + try { + return Integer.parseInt(str); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("정수형 범위를 초과했습니다"); + } + } +} From 7026a946fc6bc57f70a526379a15e250d808a4f7 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 04:50:58 +0900 Subject: [PATCH 47/92] =?UTF-8?q?test(domain):=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=9D=B4=EB=A6=84=20rename?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/programmers/junho/domain/CalculatorTest.java | 6 +++--- .../com/programmers/junho/domain/ExpressionTest.java | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java b/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java index 3c6d2cfb5..121d1ca76 100644 --- a/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java +++ b/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java @@ -14,7 +14,7 @@ class CalculatorTest { @DisplayName("계산 결과 테스트") @ParameterizedTest(name = "식: {0}, 결과: {1}") @CsvSource(value = {"1 + 2:3", "1 + 2 * 3:7", "3 - 2 * 2:-1", "44 / 2 * 8:176", "22 * 8:176", "12 + 44 / 2 * 8 - 10 + 18 / 2 / 3:181"}, delimiter = ':') - void name(String expression, int calculatedResult) { + void when_ExpressionIsGiven_CalculateCorrectResult(String expression, int calculatedResult) { Calculator calculator = new Calculator(expression); int actual = calculator.calculate(); @@ -25,14 +25,14 @@ void name(String expression, int calculatedResult) { @DisplayName("정수 형 값을 벗어났을 경우 예외 발생") @ParameterizedTest(name = "식: {0}") @ValueSource(strings = {"999999 * 999999 * 99999 * 9999999","1 - 999999999 - 999999999 - 999999999 - 999999999"}) - void test2(String expression) { + void when_CalculatedResultIsOutOfIntegerRange_Expects_ThrowException(String expression) { assertThatThrownBy(() -> new Calculator(expression).calculate()) .isInstanceOf(ArithmeticException.class); } @DisplayName("입력값이 정수 범위를 초과하면 예외를 발생한다.") @Test - void test123() { + void when_InputIsOutOfIntegerRange_Expects_ThrowException() { Calculator calculator = new Calculator("999999999999999 + 1"); assertThatThrownBy(calculator::calculate) .isInstanceOf(IllegalArgumentException.class); diff --git a/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java b/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java index fae97b9d1..580744dc5 100644 --- a/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java +++ b/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java @@ -12,14 +12,14 @@ class ExpressionTest { @DisplayName("올바른 형식의 식이면 예외가 발생하지 않는다.") @ParameterizedTest @ValueSource(strings = {"1 + 2", "1 - 3", "1 * 2", "4 / 2", "12 + 23 * 45"}) - void name(String expression) { + void when_CorrectFormat_Expects_DoesNotThrowException(String expression) { assertThatNoException().isThrownBy(() -> new Expression(expression)); } @DisplayName("공백이 존재하지 않으면 예외가 발생한다.") @ParameterizedTest @ValueSource(strings = {"1+2", "1-3", "12+23* 45"}) - void name3(String expression) { + void when_SpaceDoesNotExists_Expects_ThrowException(String expression) { assertThatThrownBy(() -> new Expression(expression)) .isInstanceOf(IllegalArgumentException.class); } @@ -27,7 +27,7 @@ void name3(String expression) { @DisplayName("식과 연산 사이에 공백 개수가 하나 이상이면 예외가 발생한다.") @ParameterizedTest @ValueSource(strings = {"1 + 2, 1 - 2", "3 * 4 / 6"}) - void name2(String expression) { + void when_MoreThanOneSpaceExists_Expects_ThrowException(String expression) { assertThatThrownBy(() -> new Expression(expression)) .isInstanceOf(IllegalArgumentException.class); } @@ -35,7 +35,7 @@ void name2(String expression) { @DisplayName("잘못된 형식이나 순서의 식이면 예외가 발생한다.") @ParameterizedTest @ValueSource(strings = {"1 & 2", "/ 1 + ", "1 / + 2"}) - void name6(String expression) { + void when_wrongFormat_Expects_ThrowException(String expression) { assertThatThrownBy(() -> new Expression(expression)) .isInstanceOf(IllegalArgumentException.class); } @@ -43,7 +43,7 @@ void name6(String expression) { @DisplayName("중위 표현식을 후위 표현식으로 변환한다.") @ParameterizedTest(name = "중위 : {0}, 후위 : {1}") @CsvSource(value = {"3 + 4 * 2:3 4 2 * +", "1 + 2 * 3 + 4 / 2 + 2:1 2 3 * + 4 2 / + 2 +", "4 + 5 * 6 / 2 - 3:4 5 6 * 2 / + 3 -", "44 / 2:44 2 /"}, delimiter = ':') - void name7(String infixExpression, String postfixExpression) { + void convert_InfixNotation_to_PostfixNotation(String infixExpression, String postfixExpression) { Expression expression = new Expression(infixExpression); String actual = expression.getPostfixExpression(); From c3469b0c8364c36b3a99e0a9883ec70087bdfde2 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 05:20:15 +0900 Subject: [PATCH 48/92] docs(README): readme update --- java-calculator/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/java-calculator/README.md b/java-calculator/README.md index 0e7c24f45..f09dc30fa 100644 --- a/java-calculator/README.md +++ b/java-calculator/README.md @@ -87,5 +87,7 @@ - [x] 예외 처리 - [x] 조회(1), 계산(2) 이외의 값을 입력 했을 경우 `IllegalArgumentException` 발생 -> controller에서 처리 - [x] 형식 (숫자 + 공백 + 기호 + 공백 + 숫자 + 공백 + 기호 + ...)이 잘못된 경우 `IllegalArgumentException` 발생 - - 공백은 하나 or 하나 이하여야 한다 -> split 하기 전 replace or replaceAll로 공백 제거하고 split하기 - - [x] int 자료형 overflow / underflow 발생 시 `ArithmeticException` 발생 \ No newline at end of file + - 공백은 무조건 하나로 처리 -> split시 space 하나로 처리해야 자를 수 있음. split 특성상 delimiter 포함 하지를 못한다. + - 정규식으로 처리 + - [x] int 자료형 overflow / underflow 발생 시 `IllegalArgumentException` 발생 + - Math 클래스의 `~Exact()` 메서드 사용 \ No newline at end of file From f022143425410cf0740d5c226a7635f8f7a22b7e Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 05:33:57 +0900 Subject: [PATCH 49/92] =?UTF-8?q?fix(view):=20nextLine=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EB=B0=9B=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/programmers/junho/domain/Expression.java | 2 -- .../main/java/com/programmers/junho/view/ScannerInputView.java | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java index 82f93f4e1..d7ffb9dec 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java @@ -1,6 +1,5 @@ package com.programmers.junho.domain; -import java.util.Arrays; import java.util.Stack; import java.util.regex.Pattern; @@ -32,7 +31,6 @@ public String getPostfixExpression() { Stack stack = new Stack<>(); String[] tokens = this.expression.split(DELIMITER); - System.out.println(Arrays.toString(tokens)); for (String token : tokens) { converseToPostfix(postfixExpression, stack, token); } diff --git a/java-calculator/src/main/java/com/programmers/junho/view/ScannerInputView.java b/java-calculator/src/main/java/com/programmers/junho/view/ScannerInputView.java index ab1e8ed39..00c13328f 100644 --- a/java-calculator/src/main/java/com/programmers/junho/view/ScannerInputView.java +++ b/java-calculator/src/main/java/com/programmers/junho/view/ScannerInputView.java @@ -14,6 +14,7 @@ public int getSelectedCode() { @Override public String getExpression() { System.out.print("식 : "); + scanner.nextLine(); return scanner.nextLine(); } } From bba7d3bef6c0c5c2cd745268d986e143194759a1 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 05:42:05 +0900 Subject: [PATCH 50/92] =?UTF-8?q?feat(view):=20BufferedReaderInputView=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/programmers/junho/Application.java | 7 ++--- .../junho/view/BufferedReaderInputView.java | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 java-calculator/src/main/java/com/programmers/junho/view/BufferedReaderInputView.java diff --git a/java-calculator/src/main/java/com/programmers/junho/Application.java b/java-calculator/src/main/java/com/programmers/junho/Application.java index 422cdb8b1..9a80740e3 100644 --- a/java-calculator/src/main/java/com/programmers/junho/Application.java +++ b/java-calculator/src/main/java/com/programmers/junho/Application.java @@ -1,14 +1,11 @@ package com.programmers.junho; import com.programmers.junho.controller.CalculatorController; -import com.programmers.junho.view.InputView; -import com.programmers.junho.view.OutputView; -import com.programmers.junho.view.PrintStreamOutputView; -import com.programmers.junho.view.ScannerInputView; +import com.programmers.junho.view.*; public class Application { public static void main(String[] args) { - InputView inputView = new ScannerInputView(); + InputView inputView = new BufferedReaderInputView(); OutputView outputView = new PrintStreamOutputView(); CalculatorController calculator = new CalculatorController(inputView, outputView); diff --git a/java-calculator/src/main/java/com/programmers/junho/view/BufferedReaderInputView.java b/java-calculator/src/main/java/com/programmers/junho/view/BufferedReaderInputView.java new file mode 100644 index 000000000..3eb6dc302 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/junho/view/BufferedReaderInputView.java @@ -0,0 +1,30 @@ +package com.programmers.junho.view; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class BufferedReaderInputView implements InputView { + + private static final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); + + @Override + public int getSelectedCode() { + try { + System.out.print("선택 : "); + return Integer.parseInt(bufferedReader.readLine()); + } catch (IOException | NumberFormatException e) { + throw new IllegalArgumentException("잘못된 값을 입력하셨습니다."); + } + } + + @Override + public String getExpression() { + try { + System.out.print("식 : "); + return bufferedReader.readLine(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} From fe6b64285326935c05aca5b8ec7a4f4f677adbb3 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 05:45:30 +0900 Subject: [PATCH 51/92] =?UTF-8?q?fix(controller):=20double=20->=20int=20?= =?UTF-8?q?=ED=98=95=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EB=AC=B4=ED=95=9C?= =?UTF-8?q?=20=EB=A3=A8=ED=94=84=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CalculatorController.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java b/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java index fba1cd6e9..f1fcb3de5 100644 --- a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java +++ b/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java @@ -24,15 +24,17 @@ public CalculatorController(InputView inputView, OutputView outputView) { } public void run() { - switch (getCode()){ - case CHECK_DATA: - printAllPreviousData(); - break; - case CALCULATE: - printCalculatedResultAndSave(); - break; - default: - throw new IllegalArgumentException("잘못된 값을 입력하셨습니다."); + while (true) { + switch (getCode()){ + case CHECK_DATA: + printAllPreviousData(); + break; + case CALCULATE: + printCalculatedResultAndSave(); + break; + default: + throw new IllegalArgumentException("잘못된 값을 입력하셨습니다."); + } } } @@ -58,7 +60,7 @@ private int calculate(String expression) { return calculator.calculate(); } - private String generateTotalResult(String expression, double result) { + private String generateTotalResult(String expression, int result) { return expression + " = " + result; } } \ No newline at end of file From b2b4e9282532af6ba56789aa971742fadc570f1d Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 05:49:04 +0900 Subject: [PATCH 52/92] refactor(repository): repository rename --- .../programmers/junho/controller/CalculatorController.java | 4 ++-- ...culatorRepository.java => MemoryCalculatorRepository.java} | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename java-calculator/src/main/java/com/programmers/junho/repository/{ListCalculatorRepository.java => MemoryCalculatorRepository.java} (80%) diff --git a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java b/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java index f1fcb3de5..adf61d69e 100644 --- a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java +++ b/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java @@ -3,7 +3,7 @@ import com.programmers.junho.controller.constant.Selection; import com.programmers.junho.domain.Calculator; import com.programmers.junho.repository.CalculatorRepository; -import com.programmers.junho.repository.ListCalculatorRepository; +import com.programmers.junho.repository.MemoryCalculatorRepository; import com.programmers.junho.view.InputView; import com.programmers.junho.view.OutputView; @@ -20,7 +20,7 @@ public class CalculatorController { public CalculatorController(InputView inputView, OutputView outputView) { this.inputView = inputView; this.outputView = outputView; - this.calculatorRepository = new ListCalculatorRepository(); + this.calculatorRepository = new MemoryCalculatorRepository(); } public void run() { diff --git a/java-calculator/src/main/java/com/programmers/junho/repository/ListCalculatorRepository.java b/java-calculator/src/main/java/com/programmers/junho/repository/MemoryCalculatorRepository.java similarity index 80% rename from java-calculator/src/main/java/com/programmers/junho/repository/ListCalculatorRepository.java rename to java-calculator/src/main/java/com/programmers/junho/repository/MemoryCalculatorRepository.java index 2303fa7f7..3a4087fe1 100644 --- a/java-calculator/src/main/java/com/programmers/junho/repository/ListCalculatorRepository.java +++ b/java-calculator/src/main/java/com/programmers/junho/repository/MemoryCalculatorRepository.java @@ -4,11 +4,11 @@ import java.util.Collections; import java.util.List; -public class ListCalculatorRepository implements CalculatorRepository { +public class MemoryCalculatorRepository implements CalculatorRepository { private final List calculatedData; - public ListCalculatorRepository() { + public MemoryCalculatorRepository() { this.calculatedData = new ArrayList<>(); } From 0a1bcd1181f19173c4c9aca5b74a69c40b239ecf Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 05:51:26 +0900 Subject: [PATCH 53/92] =?UTF-8?q?refactor(domain):=20=EC=98=A4=ED=83=80=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 --- .../src/main/java/com/programmers/junho/domain/utils/Util.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/utils/Util.java b/java-calculator/src/main/java/com/programmers/junho/domain/utils/Util.java index 741903b97..51a82a9ba 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/utils/Util.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/utils/Util.java @@ -3,7 +3,7 @@ public class Util { private Util() { - throw new AssertionError("Uil 클래스 생성 불가합니다."); + throw new AssertionError("Util 클래스 생성 불가합니다."); } public static int convertStringToInt(String str) { From 49628f5dc2a0c82ced8ea1cd6e999cb64610d4c4 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 16:11:06 +0900 Subject: [PATCH 54/92] =?UTF-8?q?docs(README):=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EB=AA=85=ED=99=95=ED=95=98=EA=B2=8C=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java-calculator/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java-calculator/README.md b/java-calculator/README.md index f09dc30fa..598e4c919 100644 --- a/java-calculator/README.md +++ b/java-calculator/README.md @@ -89,5 +89,6 @@ - [x] 형식 (숫자 + 공백 + 기호 + 공백 + 숫자 + 공백 + 기호 + ...)이 잘못된 경우 `IllegalArgumentException` 발생 - 공백은 무조건 하나로 처리 -> split시 space 하나로 처리해야 자를 수 있음. split 특성상 delimiter 포함 하지를 못한다. - 정규식으로 처리 - - [x] int 자료형 overflow / underflow 발생 시 `IllegalArgumentException` 발생 + - [x] 식에 int 형 범위 벗어 나 있는 경우 `IllegalArgumentException` 발생 + - [x] 계산 과정에 있어 int 자료형 overflow / underflow 발생 시 `IllegalArgumentException` 발생 - Math 클래스의 `~Exact()` 메서드 사용 \ No newline at end of file From c422b59b1660de9f1bda308a1803469a043488f6 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sat, 10 Jun 2023 16:11:38 +0900 Subject: [PATCH 55/92] =?UTF-8?q?refactor:=20interface=20line=20break=20?= =?UTF-8?q?=EC=9D=BC=EA=B4=80=EB=90=98=EA=B2=8C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/programmers/junho/repository/CalculatorRepository.java | 1 - .../src/main/java/com/programmers/junho/view/InputView.java | 1 - .../src/main/java/com/programmers/junho/view/OutputView.java | 2 -- 3 files changed, 4 deletions(-) diff --git a/java-calculator/src/main/java/com/programmers/junho/repository/CalculatorRepository.java b/java-calculator/src/main/java/com/programmers/junho/repository/CalculatorRepository.java index 72d1c9858..b765e2dc5 100644 --- a/java-calculator/src/main/java/com/programmers/junho/repository/CalculatorRepository.java +++ b/java-calculator/src/main/java/com/programmers/junho/repository/CalculatorRepository.java @@ -4,6 +4,5 @@ public interface CalculatorRepository { void save(String calculatedResult); - List findAll(); } diff --git a/java-calculator/src/main/java/com/programmers/junho/view/InputView.java b/java-calculator/src/main/java/com/programmers/junho/view/InputView.java index bd1f902e1..6469e01be 100644 --- a/java-calculator/src/main/java/com/programmers/junho/view/InputView.java +++ b/java-calculator/src/main/java/com/programmers/junho/view/InputView.java @@ -2,6 +2,5 @@ public interface InputView { int getSelectedCode(); - String getExpression(); } diff --git a/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java b/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java index 5ccfe576f..d8192a388 100644 --- a/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java +++ b/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java @@ -3,9 +3,7 @@ import java.util.List; public interface OutputView { - void printChoiceMessage(); void printExpressions(List expressions); - void printCalculatedResult(int result); } From c934956fc892a02c071d37bb2494d0ab2a064c6d Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sun, 11 Jun 2023 16:24:02 +0900 Subject: [PATCH 56/92] =?UTF-8?q?refactor:=20=EB=A7=A4=EC=A7=81=20?= =?UTF-8?q?=EB=84=98=EB=B2=84=20=EC=A0=9C=EA=B1=B0=20=EB=B0=8F=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/programmers/junho/domain/Calculator.java | 4 ++-- .../java/com/programmers/junho/domain/Expression.java | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java b/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java index 08cc84de3..6bcb3f4e7 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java @@ -21,12 +21,12 @@ public int calculate() { Stack stack = new Stack<>(); for (String token : tokens) { - postfixEvaluate(stack, token); + evaluatePostfixNotation(stack, token); } return stack.pop(); } - private void postfixEvaluate(Stack stack, String token) { + private void evaluatePostfixNotation(Stack stack, String token) { if (isNumber(token)) { stack.push(convertStringToInt(token)); return; diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java index d7ffb9dec..39534b928 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java @@ -9,6 +9,7 @@ public class Expression { private static final String REGEX = "^\\d+\\s([-+*/]\\s\\d+\\s)+$"; private static final String DELIMITER = " "; + public static final String BLANK = " "; private final String expression; public Expression(String expression) { @@ -32,27 +33,27 @@ public String getPostfixExpression() { String[] tokens = this.expression.split(DELIMITER); for (String token : tokens) { - converseToPostfix(postfixExpression, stack, token); + convertToPostfix(postfixExpression, stack, token); } appendAllExistingElement(postfixExpression, stack); return postfixExpression.toString().trim(); } - private void converseToPostfix(StringBuilder postfixExpression, Stack stack, String token) { + private void convertToPostfix(StringBuilder postfixExpression, Stack stack, String token) { if (isNumber(token)) { - postfixExpression.append(token).append(" "); + postfixExpression.append(token).append(BLANK); return; } var operator = convertTokenToOperator(token); while (isStackNotEmptyAndOperatorPriorityLower(stack, operator)) { - postfixExpression.append(stack.pop().getOperator()).append(" "); + postfixExpression.append(stack.pop().getOperator()).append(BLANK); } stack.push(operator); } private void appendAllExistingElement(StringBuilder postfixExpression, Stack stack) { while (!stack.isEmpty()) { - postfixExpression.append(stack.pop().getOperator()).append(" "); + postfixExpression.append(stack.pop().getOperator()).append(BLANK); } } private boolean isStackNotEmptyAndOperatorPriorityLower(Stack stack, ArithmeticOperators operator) { From 52b4812586b2a2f75bb9f616425433fbae62b03f Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sun, 11 Jun 2023 16:29:30 +0900 Subject: [PATCH 57/92] =?UTF-8?q?test:=20displayname=20=EB=AA=85=ED=99=95?= =?UTF-8?q?=ED=95=98=EA=B2=8C=20refactor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/programmers/junho/domain/CalculatorTest.java | 6 +++--- .../java/com/programmers/junho/domain/ExpressionTest.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java b/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java index 121d1ca76..ef1446c53 100644 --- a/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java +++ b/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java @@ -11,7 +11,7 @@ class CalculatorTest { - @DisplayName("계산 결과 테스트") + @DisplayName("계산 식을 입력하면 올바른 계산 결과를 반환한다.") @ParameterizedTest(name = "식: {0}, 결과: {1}") @CsvSource(value = {"1 + 2:3", "1 + 2 * 3:7", "3 - 2 * 2:-1", "44 / 2 * 8:176", "22 * 8:176", "12 + 44 / 2 * 8 - 10 + 18 / 2 / 3:181"}, delimiter = ':') void when_ExpressionIsGiven_CalculateCorrectResult(String expression, int calculatedResult) { @@ -22,7 +22,7 @@ void when_ExpressionIsGiven_CalculateCorrectResult(String expression, int calcul assertThat(actual).isEqualTo(calculatedResult); } - @DisplayName("정수 형 값을 벗어났을 경우 예외 발생") + @DisplayName("계산 값이 정수 형 값을 벗어났을 경우 예외가 발생한다.") @ParameterizedTest(name = "식: {0}") @ValueSource(strings = {"999999 * 999999 * 99999 * 9999999","1 - 999999999 - 999999999 - 999999999 - 999999999"}) void when_CalculatedResultIsOutOfIntegerRange_Expects_ThrowException(String expression) { @@ -30,7 +30,7 @@ void when_CalculatedResultIsOutOfIntegerRange_Expects_ThrowException(String expr .isInstanceOf(ArithmeticException.class); } - @DisplayName("입력값이 정수 범위를 초과하면 예외를 발생한다.") + @DisplayName("입력값인 식에 정수 범위를 초과하는 값이 있으면 예외를 발생한다.") @Test void when_InputIsOutOfIntegerRange_Expects_ThrowException() { Calculator calculator = new Calculator("999999999999999 + 1"); diff --git a/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java b/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java index 580744dc5..388c2e8e5 100644 --- a/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java +++ b/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java @@ -16,7 +16,7 @@ void when_CorrectFormat_Expects_DoesNotThrowException(String expression) { assertThatNoException().isThrownBy(() -> new Expression(expression)); } - @DisplayName("공백이 존재하지 않으면 예외가 발생한다.") + @DisplayName("값과 연산자 사이에 공백이 존재하지 않으면 예외가 발생한다.") @ParameterizedTest @ValueSource(strings = {"1+2", "1-3", "12+23* 45"}) void when_SpaceDoesNotExists_Expects_ThrowException(String expression) { @@ -24,7 +24,7 @@ void when_SpaceDoesNotExists_Expects_ThrowException(String expression) { .isInstanceOf(IllegalArgumentException.class); } - @DisplayName("식과 연산 사이에 공백 개수가 하나 이상이면 예외가 발생한다.") + @DisplayName("값과 연산자 사이에 공백 개수가 하나 이상이면 예외가 발생한다.") @ParameterizedTest @ValueSource(strings = {"1 + 2, 1 - 2", "3 * 4 / 6"}) void when_MoreThanOneSpaceExists_Expects_ThrowException(String expression) { From 31d0c2b9afab1fe0e53883877d81528f3fc602fe Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sun, 11 Jun 2023 21:32:20 +0900 Subject: [PATCH 58/92] =?UTF-8?q?refactor:=20=EC=97=B0=EC=82=B0=EC=9E=90?= =?UTF-8?q?=20=ED=99=95=EC=9D=B8=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/programmers/junho/domain/ArithmeticOperators.java | 2 +- .../main/java/com/programmers/junho/domain/Calculator.java | 4 ++-- .../main/java/com/programmers/junho/domain/Expression.java | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java b/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java index e4ceacdef..db3aba630 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java @@ -44,7 +44,7 @@ public static ArithmeticOperators convertTokenToOperator(String token) { .orElseThrow(); } - public static boolean isNumber(String token) { + public static boolean isNotOperator(String token) { return Arrays.stream(values()) .noneMatch(operator -> operator.getOperator().equals(token)); } diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java b/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java index 6bcb3f4e7..2211e7a0a 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java @@ -3,7 +3,7 @@ import java.util.Stack; import static com.programmers.junho.domain.ArithmeticOperators.convertTokenToOperator; -import static com.programmers.junho.domain.ArithmeticOperators.isNumber; +import static com.programmers.junho.domain.ArithmeticOperators.isNotOperator; import static com.programmers.junho.domain.utils.Util.convertStringToInt; public class Calculator { @@ -27,7 +27,7 @@ public int calculate() { } private void evaluatePostfixNotation(Stack stack, String token) { - if (isNumber(token)) { + if (isNotOperator(token)) { stack.push(convertStringToInt(token)); return; } diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java index 39534b928..b801c8e87 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java @@ -4,7 +4,7 @@ import java.util.regex.Pattern; import static com.programmers.junho.domain.ArithmeticOperators.convertTokenToOperator; -import static com.programmers.junho.domain.ArithmeticOperators.isNumber; +import static com.programmers.junho.domain.ArithmeticOperators.isNotOperator; public class Expression { private static final String REGEX = "^\\d+\\s([-+*/]\\s\\d+\\s)+$"; @@ -40,7 +40,7 @@ public String getPostfixExpression() { } private void convertToPostfix(StringBuilder postfixExpression, Stack stack, String token) { - if (isNumber(token)) { + if (isNotOperator(token)) { postfixExpression.append(token).append(BLANK); return; } From c2c482a54cbc0b30d0a300fbb265472a47e76212 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Sun, 11 Jun 2023 22:04:57 +0900 Subject: [PATCH 59/92] =?UTF-8?q?feat:=20=EA=B0=92=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?equals=20hashcode=20=EC=9E=AC=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/programmers/junho/domain/Calculator.java | 14 ++++++++++++++ .../com/programmers/junho/domain/Expression.java | 14 ++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java b/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java index 2211e7a0a..8e3d88e44 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java @@ -1,5 +1,6 @@ package com.programmers.junho.domain; +import java.util.Objects; import java.util.Stack; import static com.programmers.junho.domain.ArithmeticOperators.convertTokenToOperator; @@ -35,4 +36,17 @@ private void evaluatePostfixNotation(Stack stack, String token) { Integer firstValue = stack.pop(); stack.push(convertTokenToOperator(token).apply(firstValue, secondValue)); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Calculator that = (Calculator) o; + return Objects.equals(expression, that.expression); + } + + @Override + public int hashCode() { + return Objects.hash(expression); + } } diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java index b801c8e87..50067b3a9 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java @@ -1,5 +1,6 @@ package com.programmers.junho.domain; +import java.util.Objects; import java.util.Stack; import java.util.regex.Pattern; @@ -59,5 +60,18 @@ private void appendAllExistingElement(StringBuilder postfixExpression, Stack stack, ArithmeticOperators operator) { return !stack.isEmpty() && stack.peek().getPriority() >= operator.getPriority(); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Expression that = (Expression) o; + return Objects.equals(expression, that.expression); + } + + @Override + public int hashCode() { + return Objects.hash(expression); + } } From 7b07a106b7901578e491ddb701df6d26eedc977c Mon Sep 17 00:00:00 2001 From: juno-junho Date: Mon, 12 Jun 2023 00:10:44 +0900 Subject: [PATCH 60/92] =?UTF-8?q?refactor:=20=3D=20=EA=B0=92=20=EC=83=81?= =?UTF-8?q?=EC=88=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/programmers/junho/controller/CalculatorController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java b/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java index adf61d69e..041f61418 100644 --- a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java +++ b/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java @@ -13,6 +13,7 @@ public class CalculatorController { + public static final String EQUAL = " = "; private final CalculatorRepository calculatorRepository; private final InputView inputView; private final OutputView outputView; @@ -61,6 +62,6 @@ private int calculate(String expression) { } private String generateTotalResult(String expression, int result) { - return expression + " = " + result; + return expression + EQUAL + result; } } \ No newline at end of file From 23f5a676afbadfcb2a6b5c493690ea5da70466a5 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Mon, 12 Jun 2023 20:20:28 +0900 Subject: [PATCH 61/92] =?UTF-8?q?refactor:=20=EC=83=81=EC=88=98=20private?= =?UTF-8?q?=EB=A1=9C=20=EB=B2=94=EC=9C=84=20=EC=84=A4=EC=A0=95=20=EB=B0=8F?= =?UTF-8?q?=20=EC=A0=84=EC=B2=B4=EC=A0=81=EC=9D=B8=20refactor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../junho/domain/ArithmeticOperators.java | 23 +++++++------------ .../programmers/junho/domain/Expression.java | 7 +++--- .../junho/view/PrintStreamOutputView.java | 2 +- 3 files changed, 12 insertions(+), 20 deletions(-) diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java b/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java index db3aba630..9030c6c21 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java @@ -2,26 +2,23 @@ import java.util.Arrays; -public enum ArithmeticOperators implements Operator{ - ADDITION("+", 0){ +public enum ArithmeticOperators implements Operator { + ADDITION("+", 0) { @Override public int apply(int a, int b) { return Math.addExact(a, b); } - }, - SUBTRACTION("-",0){ + }, SUBTRACTION("-", 0) { @Override public int apply(int a, int b) { - return Math.subtractExact(a,b); + return Math.subtractExact(a, b); } - }, - MULTIPLICATION("*",1){ + }, MULTIPLICATION("*", 1) { @Override public int apply(int a, int b) { return Math.multiplyExact(a, b); } - }, - DIVISION("/",1) { + }, DIVISION("/", 1) { @Override public int apply(int a, int b) { return a / b; @@ -38,15 +35,11 @@ public int apply(int a, int b) { } public static ArithmeticOperators convertTokenToOperator(String token) { - return Arrays.stream(values()) - .filter(operator -> operator.getOperator().equals(token)) - .findAny() - .orElseThrow(); + return Arrays.stream(values()).filter(operator -> operator.getOperator().equals(token)).findAny().orElseThrow(); } public static boolean isNotOperator(String token) { - return Arrays.stream(values()) - .noneMatch(operator -> operator.getOperator().equals(token)); + return Arrays.stream(values()).noneMatch(operator -> operator.getOperator().equals(token)); } public String getOperator() { diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java index 50067b3a9..d0b52e2d1 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java @@ -10,7 +10,7 @@ public class Expression { private static final String REGEX = "^\\d+\\s([-+*/]\\s\\d+\\s)+$"; private static final String DELIMITER = " "; - public static final String BLANK = " "; + private static final String BLANK = " "; private final String expression; public Expression(String expression) { @@ -25,7 +25,7 @@ private void validateExpression(String expression) { } private String appendBlankForRegex(String expression) { - return expression + " "; + return expression + BLANK; } public String getPostfixExpression() { @@ -73,5 +73,4 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(expression); } -} - +} \ No newline at end of file diff --git a/java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java b/java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java index e8485e7f3..a1ddd1c50 100644 --- a/java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java +++ b/java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java @@ -4,7 +4,7 @@ public class PrintStreamOutputView implements OutputView { - public static final String CHOICE_MESSAGE = "1. 조회\n" + "2. 계산"; + private static final String CHOICE_MESSAGE = "1. 조회\n" + "2. 계산"; @Override public void printChoiceMessage() { From 3b4a132a65a750d2c6b5ce6a2f4aad4426426c10 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Mon, 12 Jun 2023 20:47:38 +0900 Subject: [PATCH 62/92] =?UTF-8?q?test:=20displayname=20=EC=9E=91=EC=84=B1?= =?UTF-8?q?=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=84=A4=EC=9E=84?= =?UTF-8?q?=20=EC=9D=BC=EA=B4=80=EC=84=B1=EC=9E=88=EA=B2=8C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../junho/domain/ArithmeticOperatorsTest.java | 21 ++++++++++++------- .../junho/domain/ExpressionTest.java | 4 ++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/java-calculator/src/test/java/com/programmers/junho/domain/ArithmeticOperatorsTest.java b/java-calculator/src/test/java/com/programmers/junho/domain/ArithmeticOperatorsTest.java index 71f3d1419..695f7b341 100644 --- a/java-calculator/src/test/java/com/programmers/junho/domain/ArithmeticOperatorsTest.java +++ b/java-calculator/src/test/java/com/programmers/junho/domain/ArithmeticOperatorsTest.java @@ -1,5 +1,6 @@ package com.programmers.junho.domain; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static com.programmers.junho.domain.ArithmeticOperators.*; @@ -7,27 +8,31 @@ class ArithmeticOperatorsTest { + @DisplayName("두 수를 더하면 올바른 값이 반환된다.") @Test - void add() { - double result = ADDITION.apply(1, 2); + void when_AddTwoNum_Expects_correctResult() { + int result = ADDITION.apply(1, 2); assertThat(result).isEqualTo(3); } + @DisplayName("두 수를 빼면 올바른 값이 반환된다.") @Test - void subtract() { - double result = SUBTRACTION.apply(1, 2); + void when_SubtractTwoNum_Expects_correctResult() { + int result = SUBTRACTION.apply(1, 2); assertThat(result).isEqualTo(-1); } + @DisplayName("두 수를 곱하면 올바른 값이 반환된다.") @Test - void multiply() { - double result = MULTIPLICATION.apply(2, 4); + void when_MultiplyTwoNum_Expects_correctResult() { + int result = MULTIPLICATION.apply(4, 2); assertThat(result).isEqualTo(8); } + @DisplayName("두 수를 나누면 올바른 값이 반환된다.") @Test - void divide() { - double result = DIVISION.apply(4, 2); + void when_DivideTwoNum_Expects_correctResult() { + int result = DIVISION.apply(4, 2); assertThat(result).isEqualTo(2); } } diff --git a/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java b/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java index 388c2e8e5..89d6c4314 100644 --- a/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java +++ b/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java @@ -35,7 +35,7 @@ void when_MoreThanOneSpaceExists_Expects_ThrowException(String expression) { @DisplayName("잘못된 형식이나 순서의 식이면 예외가 발생한다.") @ParameterizedTest @ValueSource(strings = {"1 & 2", "/ 1 + ", "1 / + 2"}) - void when_wrongFormat_Expects_ThrowException(String expression) { + void when_WrongFormat_Expects_ThrowException(String expression) { assertThatThrownBy(() -> new Expression(expression)) .isInstanceOf(IllegalArgumentException.class); } @@ -43,7 +43,7 @@ void when_wrongFormat_Expects_ThrowException(String expression) { @DisplayName("중위 표현식을 후위 표현식으로 변환한다.") @ParameterizedTest(name = "중위 : {0}, 후위 : {1}") @CsvSource(value = {"3 + 4 * 2:3 4 2 * +", "1 + 2 * 3 + 4 / 2 + 2:1 2 3 * + 4 2 / + 2 +", "4 + 5 * 6 / 2 - 3:4 5 6 * 2 / + 3 -", "44 / 2:44 2 /"}, delimiter = ':') - void convert_InfixNotation_to_PostfixNotation(String infixExpression, String postfixExpression) { + void when_InfixNotationIsGiven_Expects_ReturnPostfixNotation(String infixExpression, String postfixExpression) { Expression expression = new Expression(infixExpression); String actual = expression.getPostfixExpression(); From 69bf844a9350f509e37516206245ae9ed75db06a Mon Sep 17 00:00:00 2001 From: juno-junho Date: Mon, 12 Jun 2023 20:59:25 +0900 Subject: [PATCH 63/92] =?UTF-8?q?refactor:=20=EC=83=81=EC=88=98=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20Calculator=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=83=81=ED=83=9C=20=EA=B0=92=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CalculatorController.java | 14 ++++------ .../programmers/junho/domain/Calculator.java | 27 +++---------------- .../programmers/junho/domain/Expression.java | 16 +++++------ .../domain/constant/CalculatorConstant.java | 17 ++++++++++++ 4 files changed, 33 insertions(+), 41 deletions(-) create mode 100644 java-calculator/src/main/java/com/programmers/junho/domain/constant/CalculatorConstant.java diff --git a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java b/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java index 041f61418..1919af28f 100644 --- a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java +++ b/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java @@ -22,16 +22,18 @@ public CalculatorController(InputView inputView, OutputView outputView) { this.inputView = inputView; this.outputView = outputView; this.calculatorRepository = new MemoryCalculatorRepository(); + System.out.println(); } public void run() { + Calculator calculator = new Calculator(); while (true) { switch (getCode()){ case CHECK_DATA: printAllPreviousData(); break; case CALCULATE: - printCalculatedResultAndSave(); + printCalculatedResultAndSave(calculator); break; default: throw new IllegalArgumentException("잘못된 값을 입력하셨습니다."); @@ -40,7 +42,6 @@ public void run() { } private Selection getCode() { - outputView.printChoiceMessage(); return findByCode(inputView.getSelectedCode()); } @@ -49,18 +50,13 @@ private void printAllPreviousData() { outputView.printExpressions(calculatedData); } - private void printCalculatedResultAndSave() { + private void printCalculatedResultAndSave(Calculator calculator) { String expression = inputView.getExpression(); - int result = calculate(expression); + int result = calculator.calculate(expression); outputView.printCalculatedResult(result); calculatorRepository.save(generateTotalResult(expression, result)); } - private int calculate(String expression) { - Calculator calculator = new Calculator(expression); - return calculator.calculate(); - } - private String generateTotalResult(String expression, int result) { return expression + EQUAL + result; } diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java b/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java index 8e3d88e44..a172a3160 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java @@ -1,24 +1,18 @@ package com.programmers.junho.domain; -import java.util.Objects; import java.util.Stack; import static com.programmers.junho.domain.ArithmeticOperators.convertTokenToOperator; import static com.programmers.junho.domain.ArithmeticOperators.isNotOperator; +import static com.programmers.junho.domain.constant.CalculatorConstant.DELIMITER; import static com.programmers.junho.domain.utils.Util.convertStringToInt; public class Calculator { - private static final String DELIMITER = " "; - private final Expression expression; - - public Calculator(String expression) { - this.expression = new Expression(expression); - } - - public int calculate() { + public int calculate(String value) { + Expression expression = new Expression(value); String postfixExpression = expression.getPostfixExpression(); - String[] tokens = postfixExpression.split(DELIMITER); + String[] tokens = postfixExpression.split(DELIMITER.getValue()); Stack stack = new Stack<>(); for (String token : tokens) { @@ -36,17 +30,4 @@ private void evaluatePostfixNotation(Stack stack, String token) { Integer firstValue = stack.pop(); stack.push(convertTokenToOperator(token).apply(firstValue, secondValue)); } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Calculator that = (Calculator) o; - return Objects.equals(expression, that.expression); - } - - @Override - public int hashCode() { - return Objects.hash(expression); - } } diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java index d0b52e2d1..17cb8ffbd 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java @@ -6,11 +6,9 @@ import static com.programmers.junho.domain.ArithmeticOperators.convertTokenToOperator; import static com.programmers.junho.domain.ArithmeticOperators.isNotOperator; +import static com.programmers.junho.domain.constant.CalculatorConstant.*; public class Expression { - private static final String REGEX = "^\\d+\\s([-+*/]\\s\\d+\\s)+$"; - private static final String DELIMITER = " "; - private static final String BLANK = " "; private final String expression; public Expression(String expression) { @@ -19,20 +17,20 @@ public Expression(String expression) { } private void validateExpression(String expression) { - if (!Pattern.matches(REGEX, appendBlankForRegex(expression))) { + if (!Pattern.matches(REDEX.getValue(), appendBlankForRegex(expression))) { throw new IllegalArgumentException("잘못된 형식의 식을 입력하셨습니다."); } } private String appendBlankForRegex(String expression) { - return expression + BLANK; + return expression + BLANK.getValue(); } public String getPostfixExpression() { StringBuilder postfixExpression = new StringBuilder(); Stack stack = new Stack<>(); - String[] tokens = this.expression.split(DELIMITER); + String[] tokens = this.expression.split(DELIMITER.getValue()); for (String token : tokens) { convertToPostfix(postfixExpression, stack, token); } @@ -42,19 +40,19 @@ public String getPostfixExpression() { private void convertToPostfix(StringBuilder postfixExpression, Stack stack, String token) { if (isNotOperator(token)) { - postfixExpression.append(token).append(BLANK); + postfixExpression.append(token).append(BLANK.getValue()); return; } var operator = convertTokenToOperator(token); while (isStackNotEmptyAndOperatorPriorityLower(stack, operator)) { - postfixExpression.append(stack.pop().getOperator()).append(BLANK); + postfixExpression.append(stack.pop().getOperator()).append(BLANK.getValue()); } stack.push(operator); } private void appendAllExistingElement(StringBuilder postfixExpression, Stack stack) { while (!stack.isEmpty()) { - postfixExpression.append(stack.pop().getOperator()).append(BLANK); + postfixExpression.append(stack.pop().getOperator()).append(BLANK.getValue()); } } private boolean isStackNotEmptyAndOperatorPriorityLower(Stack stack, ArithmeticOperators operator) { diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/constant/CalculatorConstant.java b/java-calculator/src/main/java/com/programmers/junho/domain/constant/CalculatorConstant.java new file mode 100644 index 000000000..7d8a25c0d --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/junho/domain/constant/CalculatorConstant.java @@ -0,0 +1,17 @@ +package com.programmers.junho.domain.constant; + +public enum CalculatorConstant { + REDEX("^\\d+\\s([-+*/]\\s\\d+\\s)+$"), + DELIMITER(" "), + BLANK(" "); + + private final String value; + + CalculatorConstant(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} From 39d55172e3c777d88a4a1d6920b36b0691829b9d Mon Sep 17 00:00:00 2001 From: juno-junho Date: Mon, 12 Jun 2023 21:01:01 +0900 Subject: [PATCH 64/92] =?UTF-8?q?refactor:=20calculator=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/programmers/junho/domain/Calculator.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java b/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java index a172a3160..9055d1aac 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java @@ -12,6 +12,10 @@ public class Calculator { public int calculate(String value) { Expression expression = new Expression(value); String postfixExpression = expression.getPostfixExpression(); + return calculateWithPostfixExpression(postfixExpression); + } + + private Integer calculateWithPostfixExpression(String postfixExpression) { String[] tokens = postfixExpression.split(DELIMITER.getValue()); Stack stack = new Stack<>(); From 64b690da1ef3a3f9b993be224d79cf54d7026b48 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Mon, 12 Jun 2023 21:02:55 +0900 Subject: [PATCH 65/92] =?UTF-8?q?refactor:=20Util=20->=20StringUtil=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/programmers/junho/domain/Calculator.java | 2 +- .../junho/domain/utils/{Util.java => StringUtil.java} | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename java-calculator/src/main/java/com/programmers/junho/domain/utils/{Util.java => StringUtil.java} (88%) diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java b/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java index 9055d1aac..731bc0184 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java @@ -5,7 +5,7 @@ import static com.programmers.junho.domain.ArithmeticOperators.convertTokenToOperator; import static com.programmers.junho.domain.ArithmeticOperators.isNotOperator; import static com.programmers.junho.domain.constant.CalculatorConstant.DELIMITER; -import static com.programmers.junho.domain.utils.Util.convertStringToInt; +import static com.programmers.junho.domain.utils.StringUtil.convertStringToInt; public class Calculator { diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/utils/Util.java b/java-calculator/src/main/java/com/programmers/junho/domain/utils/StringUtil.java similarity index 88% rename from java-calculator/src/main/java/com/programmers/junho/domain/utils/Util.java rename to java-calculator/src/main/java/com/programmers/junho/domain/utils/StringUtil.java index 51a82a9ba..03798c855 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/utils/Util.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/utils/StringUtil.java @@ -1,8 +1,8 @@ package com.programmers.junho.domain.utils; -public class Util { +public class StringUtil { - private Util() { + private StringUtil() { throw new AssertionError("Util 클래스 생성 불가합니다."); } From 69bca5d1f0724bbd7c4bc937984d129dff1a651e Mon Sep 17 00:00:00 2001 From: juno-junho Date: Mon, 12 Jun 2023 21:13:22 +0900 Subject: [PATCH 66/92] =?UTF-8?q?refactor:=20OutputView=20=EC=9D=B8?= =?UTF-8?q?=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=8B=A4=EC=8B=9C=20=EB=90=98?= =?UTF-8?q?=EB=8F=8C=EB=A6=AC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/programmers/junho/Application.java | 5 ++++- .../programmers/junho/controller/CalculatorController.java | 1 + .../src/main/java/com/programmers/junho/view/OutputView.java | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/java-calculator/src/main/java/com/programmers/junho/Application.java b/java-calculator/src/main/java/com/programmers/junho/Application.java index 9a80740e3..8b406b7a1 100644 --- a/java-calculator/src/main/java/com/programmers/junho/Application.java +++ b/java-calculator/src/main/java/com/programmers/junho/Application.java @@ -1,7 +1,10 @@ package com.programmers.junho; import com.programmers.junho.controller.CalculatorController; -import com.programmers.junho.view.*; +import com.programmers.junho.view.BufferedReaderInputView; +import com.programmers.junho.view.InputView; +import com.programmers.junho.view.OutputView; +import com.programmers.junho.view.PrintStreamOutputView; public class Application { public static void main(String[] args) { diff --git a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java b/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java index 1919af28f..01b052654 100644 --- a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java +++ b/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java @@ -42,6 +42,7 @@ public void run() { } private Selection getCode() { + outputView.printChoiceMessage(); return findByCode(inputView.getSelectedCode()); } diff --git a/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java b/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java index d8192a388..5147bfb53 100644 --- a/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java +++ b/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java @@ -4,6 +4,8 @@ public interface OutputView { void printChoiceMessage(); + void printExpressions(List expressions); + void printCalculatedResult(int result); } From f2064c962fd37df54f35032a2644d3e5784c3347 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Mon, 12 Jun 2023 21:19:11 +0900 Subject: [PATCH 67/92] =?UTF-8?q?test:=20calculator=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81=EC=97=90=20=EB=94=B0=EB=A5=B8=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../junho/domain/CalculatorTest.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java b/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java index ef1446c53..00e4cad40 100644 --- a/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java +++ b/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java @@ -1,5 +1,6 @@ package com.programmers.junho.domain; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -11,13 +12,18 @@ class CalculatorTest { + private Calculator calculator; + + @BeforeEach + void setUp() { + calculator = new Calculator(); + } + @DisplayName("계산 식을 입력하면 올바른 계산 결과를 반환한다.") @ParameterizedTest(name = "식: {0}, 결과: {1}") @CsvSource(value = {"1 + 2:3", "1 + 2 * 3:7", "3 - 2 * 2:-1", "44 / 2 * 8:176", "22 * 8:176", "12 + 44 / 2 * 8 - 10 + 18 / 2 / 3:181"}, delimiter = ':') void when_ExpressionIsGiven_CalculateCorrectResult(String expression, int calculatedResult) { - Calculator calculator = new Calculator(expression); - - int actual = calculator.calculate(); + int actual = calculator.calculate(expression); assertThat(actual).isEqualTo(calculatedResult); } @@ -26,15 +32,15 @@ void when_ExpressionIsGiven_CalculateCorrectResult(String expression, int calcul @ParameterizedTest(name = "식: {0}") @ValueSource(strings = {"999999 * 999999 * 99999 * 9999999","1 - 999999999 - 999999999 - 999999999 - 999999999"}) void when_CalculatedResultIsOutOfIntegerRange_Expects_ThrowException(String expression) { - assertThatThrownBy(() -> new Calculator(expression).calculate()) + assertThatThrownBy(() -> calculator.calculate(expression)) .isInstanceOf(ArithmeticException.class); } @DisplayName("입력값인 식에 정수 범위를 초과하는 값이 있으면 예외를 발생한다.") @Test void when_InputIsOutOfIntegerRange_Expects_ThrowException() { - Calculator calculator = new Calculator("999999999999999 + 1"); - assertThatThrownBy(calculator::calculate) + String expression = "999999999999999 + 1"; + assertThatThrownBy(() -> calculator.calculate(expression)) .isInstanceOf(IllegalArgumentException.class); } } \ No newline at end of file From d5b9315ad4ccdf8ee08ea7c62d66740de92f2b07 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Mon, 12 Jun 2023 21:21:04 +0900 Subject: [PATCH 68/92] =?UTF-8?q?refactor:=20REGEX=20=EC=98=A4=ED=83=80=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 --- .../src/main/java/com/programmers/junho/domain/Expression.java | 2 +- .../programmers/junho/domain/constant/CalculatorConstant.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java index 17cb8ffbd..d2c4618da 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java @@ -17,7 +17,7 @@ public Expression(String expression) { } private void validateExpression(String expression) { - if (!Pattern.matches(REDEX.getValue(), appendBlankForRegex(expression))) { + if (!Pattern.matches(REGEX.getValue(), appendBlankForRegex(expression))) { throw new IllegalArgumentException("잘못된 형식의 식을 입력하셨습니다."); } } diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/constant/CalculatorConstant.java b/java-calculator/src/main/java/com/programmers/junho/domain/constant/CalculatorConstant.java index 7d8a25c0d..4dd6b8e75 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/constant/CalculatorConstant.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/constant/CalculatorConstant.java @@ -1,7 +1,7 @@ package com.programmers.junho.domain.constant; public enum CalculatorConstant { - REDEX("^\\d+\\s([-+*/]\\s\\d+\\s)+$"), + REGEX("^\\d+\\s([-+*/]\\s\\d+\\s)+$"), DELIMITER(" "), BLANK(" "); From 552bdd31554d820e1264d4821d8778eb0a693c8d Mon Sep 17 00:00:00 2001 From: juno-junho Date: Mon, 12 Jun 2023 21:32:55 +0900 Subject: [PATCH 69/92] =?UTF-8?q?refactor:=20line=20break=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/programmers/junho/domain/ArithmeticOperators.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java b/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java index 9030c6c21..ad7865fa6 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java @@ -35,11 +35,15 @@ public int apply(int a, int b) { } public static ArithmeticOperators convertTokenToOperator(String token) { - return Arrays.stream(values()).filter(operator -> operator.getOperator().equals(token)).findAny().orElseThrow(); + return Arrays.stream(values()) + .filter(operator -> operator.getOperator().equals(token)) + .findAny() + .orElseThrow(); } public static boolean isNotOperator(String token) { - return Arrays.stream(values()).noneMatch(operator -> operator.getOperator().equals(token)); + return Arrays.stream(values()) + .noneMatch(operator -> operator.getOperator().equals(token)); } public String getOperator() { From 9df608872c5b12c0bd6ee6895dfcbc78da69907c Mon Sep 17 00:00:00 2001 From: juno-junho Date: Mon, 12 Jun 2023 21:40:50 +0900 Subject: [PATCH 70/92] =?UTF-8?q?test:=20expression=EA=B0=92=EC=9D=B4=20?= =?UTF-8?q?=EA=B0=99=EC=9C=BC=EB=A9=B4=20Expression=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EA=B0=80=20=EB=8F=99=EC=9D=BC=ED=95=A8=EC=9D=84=20?= =?UTF-8?q?=EB=B3=B4=EC=9E=A5=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/programmers/junho/domain/ExpressionTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java b/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java index 89d6c4314..96f7fdc7c 100644 --- a/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java +++ b/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java @@ -2,6 +2,7 @@ import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.ValueSource; @@ -50,4 +51,15 @@ void when_InfixNotationIsGiven_Expects_ReturnPostfixNotation(String infixExpress assertThat(actual).isEqualTo(postfixExpression); } + + @DisplayName("동일한 식을 가진 Expression 객체의 동등성을 보장한다.") + @Test + public void when_givenEqualExpression_Expects_Equal() { + String expression = "3 + 4 * 2"; + + Expression expression1 = new Expression(expression); + Expression expression2 = new Expression(expression); + + assertThat(expression1).isEqualTo(expression2); + } } \ No newline at end of file From a425b61eb0fd547cf92f495a10fef2326a2b0657 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Mon, 12 Jun 2023 21:54:58 +0900 Subject: [PATCH 71/92] =?UTF-8?q?refactor:=20Operator=20=EC=9D=B8=ED=84=B0?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=8A=A4=20~able=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/programmers/junho/domain/ArithmeticOperators.java | 2 +- .../programmers/junho/domain/{Operator.java => Operable.java} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename java-calculator/src/main/java/com/programmers/junho/domain/{Operator.java => Operable.java} (76%) diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java b/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java index ad7865fa6..253eae9af 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java @@ -2,7 +2,7 @@ import java.util.Arrays; -public enum ArithmeticOperators implements Operator { +public enum ArithmeticOperators implements Operable { ADDITION("+", 0) { @Override public int apply(int a, int b) { diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Operator.java b/java-calculator/src/main/java/com/programmers/junho/domain/Operable.java similarity index 76% rename from java-calculator/src/main/java/com/programmers/junho/domain/Operator.java rename to java-calculator/src/main/java/com/programmers/junho/domain/Operable.java index b03293782..1c7ddaf0a 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Operator.java +++ b/java-calculator/src/main/java/com/programmers/junho/domain/Operable.java @@ -1,6 +1,6 @@ package com.programmers.junho.domain; @FunctionalInterface -public interface Operator { +public interface Operable { int apply(int a, int b); } From 37b970692eb8412652ca132a4813e85f9e7b5478 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Thu, 15 Jun 2023 15:54:36 +0900 Subject: [PATCH 72/92] =?UTF-8?q?chore:=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/programmers/blackdog/Application.java | 17 +++++++++++++++++ .../controller/CalculatorController.java | 4 ++-- .../{junho => blackdog}/domain/Calculator.java | 8 +++----- .../{junho => blackdog}/domain/Expression.java | 16 ++++++++-------- .../java/com/programmers/junho/Application.java | 17 ----------------- .../domain/ArithmeticOperatorsTest.java | 4 ++-- .../domain/CalculatorTest.java | 4 ++-- .../domain/ExpressionTest.java | 2 +- 8 files changed, 35 insertions(+), 37 deletions(-) create mode 100644 java-calculator/src/main/java/com/programmers/blackdog/Application.java rename java-calculator/src/main/java/com/programmers/{junho => blackdog}/controller/CalculatorController.java (93%) rename java-calculator/src/main/java/com/programmers/{junho => blackdog}/domain/Calculator.java (70%) rename java-calculator/src/main/java/com/programmers/{junho => blackdog}/domain/Expression.java (82%) delete mode 100644 java-calculator/src/main/java/com/programmers/junho/Application.java rename java-calculator/src/test/java/com/programmers/{junho => blackdog}/domain/ArithmeticOperatorsTest.java (90%) rename java-calculator/src/test/java/com/programmers/{junho => blackdog}/domain/CalculatorTest.java (95%) rename java-calculator/src/test/java/com/programmers/{junho => blackdog}/domain/ExpressionTest.java (98%) diff --git a/java-calculator/src/main/java/com/programmers/blackdog/Application.java b/java-calculator/src/main/java/com/programmers/blackdog/Application.java new file mode 100644 index 000000000..6eae988f0 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/blackdog/Application.java @@ -0,0 +1,17 @@ +package com.programmers.blackdog; + +import com.programmers.blackdog.controller.CalculatorController; +import com.programmers.blackdog.view.InputView; +import com.programmers.blackdog.view.OutputView; +import com.programmers.blackdog.view.PrintStreamOutputView; +import com.programmers.blackdog.view.ScannerInputView; + +public class Application { + public static void main(String[] args) { + InputView inputView = new ScannerInputView(); + OutputView outputView = new PrintStreamOutputView(); + + CalculatorController calculator = new CalculatorController(inputView, outputView); + calculator.run(); + } +} diff --git a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java b/java-calculator/src/main/java/com/programmers/blackdog/controller/CalculatorController.java similarity index 93% rename from java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java rename to java-calculator/src/main/java/com/programmers/blackdog/controller/CalculatorController.java index 01b052654..941db2c0a 100644 --- a/java-calculator/src/main/java/com/programmers/junho/controller/CalculatorController.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/controller/CalculatorController.java @@ -9,7 +9,7 @@ import java.util.List; -import static com.programmers.junho.controller.constant.Selection.findByCode; +import static com.programmers.blackdog.controller.constant.Selection.findByCode; public class CalculatorController { @@ -33,7 +33,7 @@ public void run() { printAllPreviousData(); break; case CALCULATE: - printCalculatedResultAndSave(calculator); +// printCalculatedResultAndSave(); break; default: throw new IllegalArgumentException("잘못된 값을 입력하셨습니다."); diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/Calculator.java similarity index 70% rename from java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java rename to java-calculator/src/main/java/com/programmers/blackdog/domain/Calculator.java index 731bc0184..7f06b3a94 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Calculator.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/Calculator.java @@ -2,10 +2,8 @@ import java.util.Stack; -import static com.programmers.junho.domain.ArithmeticOperators.convertTokenToOperator; -import static com.programmers.junho.domain.ArithmeticOperators.isNotOperator; -import static com.programmers.junho.domain.constant.CalculatorConstant.DELIMITER; -import static com.programmers.junho.domain.utils.StringUtil.convertStringToInt; +import static com.programmers.blackdog.domain.ArithmeticOperators.*; +import static com.programmers.blackdog.domain.utils.StringUtil.convertStringToInt; public class Calculator { @@ -16,7 +14,7 @@ public int calculate(String value) { } private Integer calculateWithPostfixExpression(String postfixExpression) { - String[] tokens = postfixExpression.split(DELIMITER.getValue()); + String[] tokens = postfixExpression.split(DELIMITER); Stack stack = new Stack<>(); for (String token : tokens) { diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/Expression.java similarity index 82% rename from java-calculator/src/main/java/com/programmers/junho/domain/Expression.java rename to java-calculator/src/main/java/com/programmers/blackdog/domain/Expression.java index d2c4618da..10c7ddbc3 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Expression.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/Expression.java @@ -4,9 +4,9 @@ import java.util.Stack; import java.util.regex.Pattern; -import static com.programmers.junho.domain.ArithmeticOperators.convertTokenToOperator; -import static com.programmers.junho.domain.ArithmeticOperators.isNotOperator; -import static com.programmers.junho.domain.constant.CalculatorConstant.*; +import static com.programmers.blackdog.domain.ArithmeticOperators.*; +import static com.programmers.blackdog.domain.ArithmeticOperators.convertTokenToOperator; +import static com.programmers.blackdog.domain.ArithmeticOperators.isNotOperator; public class Expression { private final String expression; @@ -23,14 +23,14 @@ private void validateExpression(String expression) { } private String appendBlankForRegex(String expression) { - return expression + BLANK.getValue(); + return expression + BLANK; } public String getPostfixExpression() { StringBuilder postfixExpression = new StringBuilder(); Stack stack = new Stack<>(); - String[] tokens = this.expression.split(DELIMITER.getValue()); + String[] tokens = this.expression.split(DELIMITER); for (String token : tokens) { convertToPostfix(postfixExpression, stack, token); } @@ -40,19 +40,19 @@ public String getPostfixExpression() { private void convertToPostfix(StringBuilder postfixExpression, Stack stack, String token) { if (isNotOperator(token)) { - postfixExpression.append(token).append(BLANK.getValue()); + postfixExpression.append(token).append(BLANK); return; } var operator = convertTokenToOperator(token); while (isStackNotEmptyAndOperatorPriorityLower(stack, operator)) { - postfixExpression.append(stack.pop().getOperator()).append(BLANK.getValue()); + postfixExpression.append(stack.pop().getOperator()).append(BLANK); } stack.push(operator); } private void appendAllExistingElement(StringBuilder postfixExpression, Stack stack) { while (!stack.isEmpty()) { - postfixExpression.append(stack.pop().getOperator()).append(BLANK.getValue()); + postfixExpression.append(stack.pop().getOperator()).append(BLANK); } } private boolean isStackNotEmptyAndOperatorPriorityLower(Stack stack, ArithmeticOperators operator) { diff --git a/java-calculator/src/main/java/com/programmers/junho/Application.java b/java-calculator/src/main/java/com/programmers/junho/Application.java deleted file mode 100644 index 8b406b7a1..000000000 --- a/java-calculator/src/main/java/com/programmers/junho/Application.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.programmers.junho; - -import com.programmers.junho.controller.CalculatorController; -import com.programmers.junho.view.BufferedReaderInputView; -import com.programmers.junho.view.InputView; -import com.programmers.junho.view.OutputView; -import com.programmers.junho.view.PrintStreamOutputView; - -public class Application { - public static void main(String[] args) { - InputView inputView = new BufferedReaderInputView(); - OutputView outputView = new PrintStreamOutputView(); - - CalculatorController calculator = new CalculatorController(inputView, outputView); - calculator.run(); - } -} diff --git a/java-calculator/src/test/java/com/programmers/junho/domain/ArithmeticOperatorsTest.java b/java-calculator/src/test/java/com/programmers/blackdog/domain/ArithmeticOperatorsTest.java similarity index 90% rename from java-calculator/src/test/java/com/programmers/junho/domain/ArithmeticOperatorsTest.java rename to java-calculator/src/test/java/com/programmers/blackdog/domain/ArithmeticOperatorsTest.java index 695f7b341..a6132dc69 100644 --- a/java-calculator/src/test/java/com/programmers/junho/domain/ArithmeticOperatorsTest.java +++ b/java-calculator/src/test/java/com/programmers/blackdog/domain/ArithmeticOperatorsTest.java @@ -1,9 +1,9 @@ -package com.programmers.junho.domain; +package com.programmers.blackdog.domain; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import static com.programmers.junho.domain.ArithmeticOperators.*; +import static com.programmers.blackdog.domain.ArithmeticOperators.*; import static org.assertj.core.api.Assertions.assertThat; class ArithmeticOperatorsTest { diff --git a/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java b/java-calculator/src/test/java/com/programmers/blackdog/domain/CalculatorTest.java similarity index 95% rename from java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java rename to java-calculator/src/test/java/com/programmers/blackdog/domain/CalculatorTest.java index 00e4cad40..b88c2029a 100644 --- a/java-calculator/src/test/java/com/programmers/junho/domain/CalculatorTest.java +++ b/java-calculator/src/test/java/com/programmers/blackdog/domain/CalculatorTest.java @@ -1,4 +1,4 @@ -package com.programmers.junho.domain; +package com.programmers.blackdog.domain; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -30,7 +30,7 @@ void when_ExpressionIsGiven_CalculateCorrectResult(String expression, int calcul @DisplayName("계산 값이 정수 형 값을 벗어났을 경우 예외가 발생한다.") @ParameterizedTest(name = "식: {0}") - @ValueSource(strings = {"999999 * 999999 * 99999 * 9999999","1 - 999999999 - 999999999 - 999999999 - 999999999"}) + @ValueSource(strings = {"999999 * 999999 * 99999 * 9999999", "1 - 999999999 - 999999999 - 999999999 - 999999999"}) void when_CalculatedResultIsOutOfIntegerRange_Expects_ThrowException(String expression) { assertThatThrownBy(() -> calculator.calculate(expression)) .isInstanceOf(ArithmeticException.class); diff --git a/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java b/java-calculator/src/test/java/com/programmers/blackdog/domain/ExpressionTest.java similarity index 98% rename from java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java rename to java-calculator/src/test/java/com/programmers/blackdog/domain/ExpressionTest.java index 96f7fdc7c..af26eb425 100644 --- a/java-calculator/src/test/java/com/programmers/junho/domain/ExpressionTest.java +++ b/java-calculator/src/test/java/com/programmers/blackdog/domain/ExpressionTest.java @@ -1,4 +1,4 @@ -package com.programmers.junho.domain; +package com.programmers.blackdog.domain; import org.junit.jupiter.api.DisplayName; From e1bb1da478a9bfff6f1f4c248e63594b9789fc3f Mon Sep 17 00:00:00 2001 From: juno-junho Date: Thu, 15 Jun 2023 18:43:57 +0900 Subject: [PATCH 73/92] =?UTF-8?q?feat:=20regex=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20?= =?UTF-8?q?=EC=83=81=EC=88=98=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java-calculator/README.md | 5 ++- .../blackdog/domain/RegexGenerator.java | 27 ++++++++++++ .../blackdog/domain/constant/Regex.java | 14 +++++++ .../com/programmers/junho/view/InputView.java | 6 --- .../blackdog/domain/RegexGeneratorTest.java | 42 +++++++++++++++++++ 5 files changed, 87 insertions(+), 7 deletions(-) create mode 100644 java-calculator/src/main/java/com/programmers/blackdog/domain/RegexGenerator.java create mode 100644 java-calculator/src/main/java/com/programmers/blackdog/domain/constant/Regex.java delete mode 100644 java-calculator/src/main/java/com/programmers/junho/view/InputView.java create mode 100644 java-calculator/src/test/java/com/programmers/blackdog/domain/RegexGeneratorTest.java diff --git a/java-calculator/README.md b/java-calculator/README.md index 598e4c919..9a77dfc77 100644 --- a/java-calculator/README.md +++ b/java-calculator/README.md @@ -82,7 +82,10 @@ 3. 계산을 한 뒤, 결과 값은 다시 스택에 넣는다. 이 과정을 수식이 끝날 때 까지 반복한다. 4. 수식이 끝났다면 스택에 마지막 남은 값이 결과 값이 된다. ``` - +- [ ] 식을 입력 받을 때 계산기에서 수행가능한 연산 범위를 제한 할 수 있다. + - [ ] Regex를 통해서 검증하기. +- [ ] 중위표현식, 후위 표현식에 따른 계산 확장 가능성 기능 구현 +- [ ] - [x] 예외 처리 - [x] 조회(1), 계산(2) 이외의 값을 입력 했을 경우 `IllegalArgumentException` 발생 -> controller에서 처리 diff --git a/java-calculator/src/main/java/com/programmers/blackdog/domain/RegexGenerator.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/RegexGenerator.java new file mode 100644 index 000000000..c97cd68e5 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/RegexGenerator.java @@ -0,0 +1,27 @@ +package com.programmers.blackdog.domain; + +import java.util.Arrays; +import java.util.stream.Collectors; + +import static com.programmers.blackdog.domain.ArithmeticOperators.values; + +public class RegexGenerator { + + private static final String REGEX_PREFIX = "^\\d+\\s(["; + private static final String REGEX_SUFFIX = "]\\s\\d+\\s)+$"; + + public String generateWithOperator(ArithmeticOperators... arithmeticOperators) { + StringBuilder operators = new StringBuilder(); + for (ArithmeticOperators arithmeticOperator : arithmeticOperators) { + operators.append(arithmeticOperator.getOperator()); + } + return REGEX_PREFIX + operators.append(REGEX_SUFFIX); + } + + public String generateWithAllOperator() { + String allOperators = Arrays.stream(values()) + .map(ArithmeticOperators::getOperator) + .collect(Collectors.joining()); + return REGEX_PREFIX + allOperators + REGEX_SUFFIX; + } +} diff --git a/java-calculator/src/main/java/com/programmers/blackdog/domain/constant/Regex.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/constant/Regex.java new file mode 100644 index 000000000..ec9b73025 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/constant/Regex.java @@ -0,0 +1,14 @@ +package com.programmers.blackdog.domain.constant; + +import com.programmers.blackdog.domain.RegexGenerator; + +public class Regex { + public static final String BLANK = " "; + public static final String DELIMITER; + public static final String REGEX; + + static { + DELIMITER = " "; + REGEX = new RegexGenerator().generateWithAllOperator(); + } +} diff --git a/java-calculator/src/main/java/com/programmers/junho/view/InputView.java b/java-calculator/src/main/java/com/programmers/junho/view/InputView.java deleted file mode 100644 index 6469e01be..000000000 --- a/java-calculator/src/main/java/com/programmers/junho/view/InputView.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.programmers.junho.view; - -public interface InputView { - int getSelectedCode(); - String getExpression(); -} diff --git a/java-calculator/src/test/java/com/programmers/blackdog/domain/RegexGeneratorTest.java b/java-calculator/src/test/java/com/programmers/blackdog/domain/RegexGeneratorTest.java new file mode 100644 index 000000000..99b6034d4 --- /dev/null +++ b/java-calculator/src/test/java/com/programmers/blackdog/domain/RegexGeneratorTest.java @@ -0,0 +1,42 @@ +package com.programmers.blackdog.domain; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.Assertions.assertThat; + + +class RegexGeneratorTest { + + private static final String REGEX_PREFIX = "^\\d+\\s(["; + private static final String REGEX_SUFFIX = "]\\s\\d+\\s)+$"; + + private RegexGenerator regexGenerator; + + @BeforeEach + void setUp() { + regexGenerator = new RegexGenerator(); + } + + @DisplayName("연산자 설정에 따른 정규식을 만들어 반환한다.") + @ParameterizedTest + @CsvSource(value = {"ADDITION/SUBTRACTION", "SUBTRACTION/ADDITION", "SUBTRACTION/DIVISION"}, delimiter = '/') + void when_ConfineSpecificOperator_Expects_GenerateRegexWithInputOperator(ArithmeticOperators firstOperator, ArithmeticOperators secondOperator) { + String regex = regexGenerator.generateWithOperator(firstOperator, secondOperator); + + assertThat(regex).isEqualTo(REGEX_PREFIX + firstOperator.getOperator()+ secondOperator.getOperator() + REGEX_SUFFIX); + } + + @DisplayName("모든 연산자를 포함한 정규식을 반환한다.") + @Test + void when_GenerateWithAllOperator_Expects_GenerateRegexWithAllOperator() { + String regex = regexGenerator.generateWithAllOperator(); + + String expected = "^\\d+\\s([+-*/]\\s\\d+\\s)+$"; + + assertThat(regex).isEqualTo(expected); + } +} \ No newline at end of file From 235f332c4b8a5c20ea93eb487272f623a35e501a Mon Sep 17 00:00:00 2001 From: juno-junho Date: Thu, 15 Jun 2023 18:45:40 +0900 Subject: [PATCH 74/92] =?UTF-8?q?refactor:=20Expression=EC=9D=84=20InfixEx?= =?UTF-8?q?pression=EC=9C=BC=EB=A1=9C=20=EC=84=B8=EB=B6=84=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackdog/domain/Expression.java | 76 +------------------ .../blackdog/domain/InfixExpression.java | 74 ++++++++++++++++++ ...sionTest.java => InfixExpressionTest.java} | 18 ++--- 3 files changed, 86 insertions(+), 82 deletions(-) create mode 100644 java-calculator/src/main/java/com/programmers/blackdog/domain/InfixExpression.java rename java-calculator/src/test/java/com/programmers/blackdog/domain/{ExpressionTest.java => InfixExpressionTest.java} (79%) diff --git a/java-calculator/src/main/java/com/programmers/blackdog/domain/Expression.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/Expression.java index 10c7ddbc3..f4d140b97 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/domain/Expression.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/Expression.java @@ -1,74 +1,4 @@ -package com.programmers.junho.domain; +package com.programmers.blackdog.domain; -import java.util.Objects; -import java.util.Stack; -import java.util.regex.Pattern; - -import static com.programmers.blackdog.domain.ArithmeticOperators.*; -import static com.programmers.blackdog.domain.ArithmeticOperators.convertTokenToOperator; -import static com.programmers.blackdog.domain.ArithmeticOperators.isNotOperator; - -public class Expression { - private final String expression; - - public Expression(String expression) { - validateExpression(expression); - this.expression = expression; - } - - private void validateExpression(String expression) { - if (!Pattern.matches(REGEX.getValue(), appendBlankForRegex(expression))) { - throw new IllegalArgumentException("잘못된 형식의 식을 입력하셨습니다."); - } - } - - private String appendBlankForRegex(String expression) { - return expression + BLANK; - } - - public String getPostfixExpression() { - StringBuilder postfixExpression = new StringBuilder(); - Stack stack = new Stack<>(); - - String[] tokens = this.expression.split(DELIMITER); - for (String token : tokens) { - convertToPostfix(postfixExpression, stack, token); - } - appendAllExistingElement(postfixExpression, stack); - return postfixExpression.toString().trim(); - } - - private void convertToPostfix(StringBuilder postfixExpression, Stack stack, String token) { - if (isNotOperator(token)) { - postfixExpression.append(token).append(BLANK); - return; - } - var operator = convertTokenToOperator(token); - while (isStackNotEmptyAndOperatorPriorityLower(stack, operator)) { - postfixExpression.append(stack.pop().getOperator()).append(BLANK); - } - stack.push(operator); - } - - private void appendAllExistingElement(StringBuilder postfixExpression, Stack stack) { - while (!stack.isEmpty()) { - postfixExpression.append(stack.pop().getOperator()).append(BLANK); - } - } - private boolean isStackNotEmptyAndOperatorPriorityLower(Stack stack, ArithmeticOperators operator) { - return !stack.isEmpty() && stack.peek().getPriority() >= operator.getPriority(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Expression that = (Expression) o; - return Objects.equals(expression, that.expression); - } - - @Override - public int hashCode() { - return Objects.hash(expression); - } -} \ No newline at end of file +public interface Expression { +} diff --git a/java-calculator/src/main/java/com/programmers/blackdog/domain/InfixExpression.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/InfixExpression.java new file mode 100644 index 000000000..498b7fa36 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/InfixExpression.java @@ -0,0 +1,74 @@ +package com.programmers.blackdog.domain; + +import java.util.Objects; +import java.util.Stack; +import java.util.regex.Pattern; + +import static com.programmers.blackdog.domain.ArithmeticOperators.convertTokenToOperator; +import static com.programmers.blackdog.domain.ArithmeticOperators.isNotOperator; +import static com.programmers.blackdog.domain.constant.Regex.*; + +public class InfixExpression implements Expression { + private final String expression; + + public InfixExpression(String expression) { + validateInfixExpression(expression); + this.expression = expression; + } + + private void validateInfixExpression(String expression) { + if (!Pattern.matches(REGEX, appendBlankForRegex(expression))) { + throw new IllegalArgumentException("잘못된 형식의 식을 입력하셨습니다."); + } + } + + private String appendBlankForRegex(String expression) { + return expression + BLANK; + } + + public String getPostfixExpression() { + StringBuilder postfixExpression = new StringBuilder(); + Stack stack = new Stack<>(); + + String[] tokens = this.expression.split(DELIMITER); + for (String token : tokens) { + convertToPostfix(postfixExpression, stack, token); + } + appendAllExistingElement(postfixExpression, stack); + return postfixExpression.toString().trim(); + } + + private void convertToPostfix(StringBuilder postfixExpression, Stack stack, String token) { + if (isNotOperator(token)) { + postfixExpression.append(token).append(BLANK); + return; + } + var operator = convertTokenToOperator(token); + while (isStackNotEmptyAndOperatorPriorityLower(stack, operator)) { + postfixExpression.append(stack.pop().getOperator()).append(BLANK); + } + stack.push(operator); + } + + private void appendAllExistingElement(StringBuilder postfixExpression, Stack stack) { + while (!stack.isEmpty()) { + postfixExpression.append(stack.pop().getOperator()).append(BLANK); + } + } + private boolean isStackNotEmptyAndOperatorPriorityLower(Stack stack, ArithmeticOperators operator) { + return !stack.isEmpty() && stack.peek().getPriority() >= operator.getPriority(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + InfixExpression that = (InfixExpression) o; + return Objects.equals(expression, that.expression); + } + + @Override + public int hashCode() { + return Objects.hash(expression); + } +} \ No newline at end of file diff --git a/java-calculator/src/test/java/com/programmers/blackdog/domain/ExpressionTest.java b/java-calculator/src/test/java/com/programmers/blackdog/domain/InfixExpressionTest.java similarity index 79% rename from java-calculator/src/test/java/com/programmers/blackdog/domain/ExpressionTest.java rename to java-calculator/src/test/java/com/programmers/blackdog/domain/InfixExpressionTest.java index af26eb425..de3c867a6 100644 --- a/java-calculator/src/test/java/com/programmers/blackdog/domain/ExpressionTest.java +++ b/java-calculator/src/test/java/com/programmers/blackdog/domain/InfixExpressionTest.java @@ -9,19 +9,19 @@ import static org.assertj.core.api.Assertions.*; -class ExpressionTest { +class InfixExpressionTest { @DisplayName("올바른 형식의 식이면 예외가 발생하지 않는다.") @ParameterizedTest @ValueSource(strings = {"1 + 2", "1 - 3", "1 * 2", "4 / 2", "12 + 23 * 45"}) void when_CorrectFormat_Expects_DoesNotThrowException(String expression) { - assertThatNoException().isThrownBy(() -> new Expression(expression)); + assertThatNoException().isThrownBy(() -> new InfixExpression(expression)); } @DisplayName("값과 연산자 사이에 공백이 존재하지 않으면 예외가 발생한다.") @ParameterizedTest @ValueSource(strings = {"1+2", "1-3", "12+23* 45"}) void when_SpaceDoesNotExists_Expects_ThrowException(String expression) { - assertThatThrownBy(() -> new Expression(expression)) + assertThatThrownBy(() -> new InfixExpression(expression)) .isInstanceOf(IllegalArgumentException.class); } @@ -29,7 +29,7 @@ void when_SpaceDoesNotExists_Expects_ThrowException(String expression) { @ParameterizedTest @ValueSource(strings = {"1 + 2, 1 - 2", "3 * 4 / 6"}) void when_MoreThanOneSpaceExists_Expects_ThrowException(String expression) { - assertThatThrownBy(() -> new Expression(expression)) + assertThatThrownBy(() -> new InfixExpression(expression)) .isInstanceOf(IllegalArgumentException.class); } @@ -37,7 +37,7 @@ void when_MoreThanOneSpaceExists_Expects_ThrowException(String expression) { @ParameterizedTest @ValueSource(strings = {"1 & 2", "/ 1 + ", "1 / + 2"}) void when_WrongFormat_Expects_ThrowException(String expression) { - assertThatThrownBy(() -> new Expression(expression)) + assertThatThrownBy(() -> new InfixExpression(expression)) .isInstanceOf(IllegalArgumentException.class); } @@ -45,7 +45,7 @@ void when_WrongFormat_Expects_ThrowException(String expression) { @ParameterizedTest(name = "중위 : {0}, 후위 : {1}") @CsvSource(value = {"3 + 4 * 2:3 4 2 * +", "1 + 2 * 3 + 4 / 2 + 2:1 2 3 * + 4 2 / + 2 +", "4 + 5 * 6 / 2 - 3:4 5 6 * 2 / + 3 -", "44 / 2:44 2 /"}, delimiter = ':') void when_InfixNotationIsGiven_Expects_ReturnPostfixNotation(String infixExpression, String postfixExpression) { - Expression expression = new Expression(infixExpression); + InfixExpression expression = new InfixExpression(infixExpression); String actual = expression.getPostfixExpression(); @@ -57,9 +57,9 @@ void when_InfixNotationIsGiven_Expects_ReturnPostfixNotation(String infixExpress public void when_givenEqualExpression_Expects_Equal() { String expression = "3 + 4 * 2"; - Expression expression1 = new Expression(expression); - Expression expression2 = new Expression(expression); + InfixExpression infixExpression1 = new InfixExpression(expression); + InfixExpression infixExpression2 = new InfixExpression(expression); - assertThat(expression1).isEqualTo(expression2); + assertThat(infixExpression1).isEqualTo(infixExpression2); } } \ No newline at end of file From 06518a62702aaaf388e5c6a492bc84090c888981 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Thu, 15 Jun 2023 19:08:20 +0900 Subject: [PATCH 75/92] =?UTF-8?q?refactor:=20=EB=8F=84=EB=A9=94=EC=9D=B8?= =?UTF-8?q?=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=95=88=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=B0=8F=20=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EC=A0=84=EC=B2=B4=EC=A0=81=EC=9D=B8=20refactor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/programmers/blackdog/domain/Calculator.java | 12 ++++++++---- .../com/programmers/blackdog/domain/Expression.java | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/java-calculator/src/main/java/com/programmers/blackdog/domain/Calculator.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/Calculator.java index 7f06b3a94..dcdd1b749 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/domain/Calculator.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/Calculator.java @@ -1,14 +1,18 @@ package com.programmers.junho.domain; +import com.programmers.blackdog.domain.calculator.AbstractCalculator; + import java.util.Stack; -import static com.programmers.blackdog.domain.ArithmeticOperators.*; +import static com.programmers.blackdog.domain.ArithmeticOperators.convertTokenToOperator; +import static com.programmers.blackdog.domain.ArithmeticOperators.isNotOperator; +import static com.programmers.blackdog.domain.constant.Regex.DELIMITER; import static com.programmers.blackdog.domain.utils.StringUtil.convertStringToInt; -public class Calculator { +public class Calculator implements AbstractCalculator { - public int calculate(String value) { - Expression expression = new Expression(value); + @Override + public int calculate(Expression expression) { String postfixExpression = expression.getPostfixExpression(); return calculateWithPostfixExpression(postfixExpression); } diff --git a/java-calculator/src/main/java/com/programmers/blackdog/domain/Expression.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/Expression.java index f4d140b97..ddc483e3b 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/domain/Expression.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/Expression.java @@ -1,4 +1,5 @@ package com.programmers.blackdog.domain; public interface Expression { + String getPostfixExpression(); } From 665e71545605b0179fd836396d4957b5f37e9634 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Thu, 15 Jun 2023 19:09:22 +0900 Subject: [PATCH 76/92] =?UTF-8?q?refactor:=20=EB=8F=84=EB=A9=94=EC=9D=B8?= =?UTF-8?q?=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=95=88=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=B0=8F=20=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EC=A0=84=EC=B2=B4=EC=A0=81=EC=9D=B8=20refactor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{junho => blackdog}/domain/ArithmeticOperators.java | 2 +- .../main/java/com/programmers/blackdog/domain/Calculator.java | 2 +- .../com/programmers/{junho => blackdog}/domain/Operable.java | 2 +- .../{junho => blackdog}/domain/utils/StringUtil.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename java-calculator/src/main/java/com/programmers/{junho => blackdog}/domain/ArithmeticOperators.java (99%) rename java-calculator/src/main/java/com/programmers/{junho => blackdog}/domain/Operable.java (98%) rename java-calculator/src/main/java/com/programmers/{junho => blackdog}/domain/utils/StringUtil.java (99%) diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/ArithmeticOperators.java similarity index 99% rename from java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java rename to java-calculator/src/main/java/com/programmers/blackdog/domain/ArithmeticOperators.java index 253eae9af..a05dba101 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/ArithmeticOperators.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/ArithmeticOperators.java @@ -53,4 +53,4 @@ public String getOperator() { public int getPriority() { return priority; } -} +} \ No newline at end of file diff --git a/java-calculator/src/main/java/com/programmers/blackdog/domain/Calculator.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/Calculator.java index dcdd1b749..4af1353f5 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/domain/Calculator.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/Calculator.java @@ -36,4 +36,4 @@ private void evaluatePostfixNotation(Stack stack, String token) { Integer firstValue = stack.pop(); stack.push(convertTokenToOperator(token).apply(firstValue, secondValue)); } -} +} \ No newline at end of file diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/Operable.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/Operable.java similarity index 98% rename from java-calculator/src/main/java/com/programmers/junho/domain/Operable.java rename to java-calculator/src/main/java/com/programmers/blackdog/domain/Operable.java index 1c7ddaf0a..28ecd4651 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/Operable.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/Operable.java @@ -3,4 +3,4 @@ @FunctionalInterface public interface Operable { int apply(int a, int b); -} +} \ No newline at end of file diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/utils/StringUtil.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/utils/StringUtil.java similarity index 99% rename from java-calculator/src/main/java/com/programmers/junho/domain/utils/StringUtil.java rename to java-calculator/src/main/java/com/programmers/blackdog/domain/utils/StringUtil.java index 03798c855..ffbef6441 100644 --- a/java-calculator/src/main/java/com/programmers/junho/domain/utils/StringUtil.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/utils/StringUtil.java @@ -13,4 +13,4 @@ public static int convertStringToInt(String str) { throw new IllegalArgumentException("정수형 범위를 초과했습니다"); } } -} +} \ No newline at end of file From 4e396678c3e9917afdfe56d5ad2486b5f10152c4 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Thu, 15 Jun 2023 20:22:05 +0900 Subject: [PATCH 77/92] =?UTF-8?q?feat:=20service=20=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackdog/service/CalculatorService.java | 42 +++++++++++++++++++ .../programmers/blackdog/service/Service.java | 12 ++++++ 2 files changed, 54 insertions(+) create mode 100644 java-calculator/src/main/java/com/programmers/blackdog/service/CalculatorService.java create mode 100644 java-calculator/src/main/java/com/programmers/blackdog/service/Service.java diff --git a/java-calculator/src/main/java/com/programmers/blackdog/service/CalculatorService.java b/java-calculator/src/main/java/com/programmers/blackdog/service/CalculatorService.java new file mode 100644 index 000000000..69a2c9a59 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/blackdog/service/CalculatorService.java @@ -0,0 +1,42 @@ +package com.programmers.blackdog.service; + +import com.programmers.blackdog.domain.Calculator; +import com.programmers.blackdog.domain.Expression; +import com.programmers.blackdog.domain.InfixExpression; +import com.programmers.blackdog.domain.calculator.AbstractCalculator; +import com.programmers.blackdog.repository.CalculatorRepository; +import com.programmers.blackdog.repository.MemoryCalculatorRepository; + +import java.util.List; + +// 계산 및 저장 로직 담당 +public class CalculatorService implements Service { + private static final String EQUAL = "="; + private final CalculatorRepository calculatorRepository; + private final AbstractCalculator calculator; + + public CalculatorService() { + this.calculatorRepository = new MemoryCalculatorRepository(); + this.calculator = new Calculator(); + } + + @Override + public int calculate(String value) { + Expression expression = new InfixExpression(value); + return calculator.calculate(expression); + } + + @Override + public void save(String expression, int result) { + this.calculatorRepository.save(generateTotalResult(expression, result)); + } + + private String generateTotalResult(String expression, int result) { + return expression + EQUAL + result; + } + + @Override + public List findAll() { + return this.calculatorRepository.findAll(); + } +} diff --git a/java-calculator/src/main/java/com/programmers/blackdog/service/Service.java b/java-calculator/src/main/java/com/programmers/blackdog/service/Service.java new file mode 100644 index 000000000..01d461152 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/blackdog/service/Service.java @@ -0,0 +1,12 @@ +package com.programmers.blackdog.service; + +import java.util.List; + +public interface Service { + int calculate(String expression); + + void save(String expression, int result); + + List findAll(); + +} From 7e20296af84d52e3eb76b195c3b387814028e395 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Thu, 15 Jun 2023 20:45:53 +0900 Subject: [PATCH 78/92] =?UTF-8?q?feat(view):=20=EC=BD=98=EC=86=94=EB=A1=9C?= =?UTF-8?q?=20input=EA=B3=BC=20output=20=ED=95=A9=EC=B9=98=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=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 --- .../view/BufferedReaderInputView.java | 19 +++++++ .../programmers/blackdog/view/Console.java | 55 +++++++++++++++++++ .../programmers/blackdog/view/InputView.java | 5 ++ .../programmers/blackdog/view/OutputView.java | 11 ++++ .../blackdog/view/PrintStreamOutputView.java | 21 +++++++ .../view/ScannerInputView.java | 9 +-- .../junho/view/BufferedReaderInputView.java | 30 ---------- .../programmers/junho/view/OutputView.java | 11 ---- .../junho/view/PrintStreamOutputView.java | 30 ---------- 9 files changed, 112 insertions(+), 79 deletions(-) create mode 100644 java-calculator/src/main/java/com/programmers/blackdog/view/BufferedReaderInputView.java create mode 100644 java-calculator/src/main/java/com/programmers/blackdog/view/Console.java create mode 100644 java-calculator/src/main/java/com/programmers/blackdog/view/InputView.java create mode 100644 java-calculator/src/main/java/com/programmers/blackdog/view/OutputView.java create mode 100644 java-calculator/src/main/java/com/programmers/blackdog/view/PrintStreamOutputView.java rename java-calculator/src/main/java/com/programmers/{junho => blackdog}/view/ScannerInputView.java (57%) delete mode 100644 java-calculator/src/main/java/com/programmers/junho/view/BufferedReaderInputView.java delete mode 100644 java-calculator/src/main/java/com/programmers/junho/view/OutputView.java delete mode 100644 java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java diff --git a/java-calculator/src/main/java/com/programmers/blackdog/view/BufferedReaderInputView.java b/java-calculator/src/main/java/com/programmers/blackdog/view/BufferedReaderInputView.java new file mode 100644 index 000000000..7dcfd84ef --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/blackdog/view/BufferedReaderInputView.java @@ -0,0 +1,19 @@ +package com.programmers.blackdog.view; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class BufferedReaderInputView implements InputView { + + private final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); + + @Override + public String read() { + try { + return bufferedReader.readLine(); + } catch (IOException e) { + throw new RuntimeException("입출력 관련 문제가 생겼습니다."); + } + } +} diff --git a/java-calculator/src/main/java/com/programmers/blackdog/view/Console.java b/java-calculator/src/main/java/com/programmers/blackdog/view/Console.java new file mode 100644 index 000000000..1ed84e599 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/blackdog/view/Console.java @@ -0,0 +1,55 @@ +package com.programmers.blackdog.view; + +import java.util.List; + +public class Console { + + private static final String CHOICE_MESSAGE = "1. 조회\n" + "2. 계산"; + + private final InputView inputView; + private final OutputView outputView; + + public Console(InputView inputView, OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + } + + public int getSelectionCode() { + outputView.print(CHOICE_MESSAGE); + outputView.print("선택 : "); + try { + return Integer.parseInt(inputView.read()); + } catch (NumberFormatException e) { + throw new NumberFormatException("잘못된 값을 입력하셨습니다."); + } + } + + + public void printExpressions(List calculatedData) { + validateIfIsEmpty(calculatedData); + outputView.print(calculatedData); + } + + private void validateIfIsEmpty(List expressions) { + if (expressions.isEmpty()) { + outputView.print("계산 값이 존재하지 않습니다."); + } + } + + public String getExpression() { + outputView.print("식 : "); + return inputView.read(); + } + + public void printCalculatedResult(int result) { + outputView.print(result); + } + + public void printEndMessage() { + outputView.print("프로그램을 종료합니다."); + } + + public void printErrorMessage(String message) { + outputView.print(message); + } +} diff --git a/java-calculator/src/main/java/com/programmers/blackdog/view/InputView.java b/java-calculator/src/main/java/com/programmers/blackdog/view/InputView.java new file mode 100644 index 000000000..32ed4488e --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/blackdog/view/InputView.java @@ -0,0 +1,5 @@ +package com.programmers.blackdog.view; + +public interface InputView { + String read(); +} diff --git a/java-calculator/src/main/java/com/programmers/blackdog/view/OutputView.java b/java-calculator/src/main/java/com/programmers/blackdog/view/OutputView.java new file mode 100644 index 000000000..653ad2d24 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/blackdog/view/OutputView.java @@ -0,0 +1,11 @@ +package com.programmers.blackdog.view; + +import java.util.List; + +public interface OutputView { + void print(List list); + + void print(String string); + + void print(int integer); +} diff --git a/java-calculator/src/main/java/com/programmers/blackdog/view/PrintStreamOutputView.java b/java-calculator/src/main/java/com/programmers/blackdog/view/PrintStreamOutputView.java new file mode 100644 index 000000000..d787c6e0d --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/blackdog/view/PrintStreamOutputView.java @@ -0,0 +1,21 @@ +package com.programmers.blackdog.view; + +import java.util.List; + +public class PrintStreamOutputView implements OutputView { + + @Override + public void print(int result) { + System.out.println(result); + } + + @Override + public void print(List list) { + list.forEach(System.out::println); + } + + @Override + public void print(String string) { + System.out.println(string); + } +} diff --git a/java-calculator/src/main/java/com/programmers/junho/view/ScannerInputView.java b/java-calculator/src/main/java/com/programmers/blackdog/view/ScannerInputView.java similarity index 57% rename from java-calculator/src/main/java/com/programmers/junho/view/ScannerInputView.java rename to java-calculator/src/main/java/com/programmers/blackdog/view/ScannerInputView.java index 00c13328f..a9892cd66 100644 --- a/java-calculator/src/main/java/com/programmers/junho/view/ScannerInputView.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/view/ScannerInputView.java @@ -6,14 +6,7 @@ public class ScannerInputView implements InputView{ private static final Scanner scanner = new Scanner(System.in); @Override - public int getSelectedCode() { - System.out.print("선택 : "); - return scanner.nextInt(); - } - - @Override - public String getExpression() { - System.out.print("식 : "); + public String read() { scanner.nextLine(); return scanner.nextLine(); } diff --git a/java-calculator/src/main/java/com/programmers/junho/view/BufferedReaderInputView.java b/java-calculator/src/main/java/com/programmers/junho/view/BufferedReaderInputView.java deleted file mode 100644 index 3eb6dc302..000000000 --- a/java-calculator/src/main/java/com/programmers/junho/view/BufferedReaderInputView.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.programmers.junho.view; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; - -public class BufferedReaderInputView implements InputView { - - private static final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); - - @Override - public int getSelectedCode() { - try { - System.out.print("선택 : "); - return Integer.parseInt(bufferedReader.readLine()); - } catch (IOException | NumberFormatException e) { - throw new IllegalArgumentException("잘못된 값을 입력하셨습니다."); - } - } - - @Override - public String getExpression() { - try { - System.out.print("식 : "); - return bufferedReader.readLine(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } -} diff --git a/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java b/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java deleted file mode 100644 index 5147bfb53..000000000 --- a/java-calculator/src/main/java/com/programmers/junho/view/OutputView.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.programmers.junho.view; - -import java.util.List; - -public interface OutputView { - void printChoiceMessage(); - - void printExpressions(List expressions); - - void printCalculatedResult(int result); -} diff --git a/java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java b/java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java deleted file mode 100644 index a1ddd1c50..000000000 --- a/java-calculator/src/main/java/com/programmers/junho/view/PrintStreamOutputView.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.programmers.junho.view; - -import java.util.List; - -public class PrintStreamOutputView implements OutputView { - - private static final String CHOICE_MESSAGE = "1. 조회\n" + "2. 계산"; - - @Override - public void printChoiceMessage() { - System.out.println(CHOICE_MESSAGE); - } - - @Override - public void printExpressions(List expressions) { - validateIfIsEmpty(expressions); - expressions.forEach(System.out::println); - } - - private void validateIfIsEmpty(List expressions) { - if (expressions.isEmpty()) { - System.out.println("계산 값이 존재하지 않습니다."); - } - } - - @Override - public void printCalculatedResult(int result) { - System.out.println(result); - } -} From 500eddffe9f02a4daddfe17dd98fede1f9229757 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Thu, 15 Jun 2023 20:48:07 +0900 Subject: [PATCH 79/92] =?UTF-8?q?refactor(domain):=20REGEX=20=EC=83=81?= =?UTF-8?q?=EC=88=98=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=9D=B8=EC=8A=A4?= =?UTF-8?q?=ED=84=B4=EC=8A=A4=ED=99=94=20=EB=B0=8F=20=EC=83=81=EC=86=8D=20?= =?UTF-8?q?=EB=A7=89=EB=8A=94=20=EA=B8=B0=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 --- .../com/programmers/blackdog/domain/constant/Regex.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/java-calculator/src/main/java/com/programmers/blackdog/domain/constant/Regex.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/constant/Regex.java index ec9b73025..29ca661b4 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/domain/constant/Regex.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/constant/Regex.java @@ -2,7 +2,13 @@ import com.programmers.blackdog.domain.RegexGenerator; -public class Regex { +public final class Regex { + + private Regex(){ + throw new AssertionError("인스턴스화 할 수 없습니다!"); + } + + public static final String BLANK = " "; public static final String DELIMITER; public static final String REGEX; From 95d0f50c4ed66c7e74e7960c5eddbb57183bc1dd Mon Sep 17 00:00:00 2001 From: juno-junho Date: Thu, 15 Jun 2023 20:55:12 +0900 Subject: [PATCH 80/92] =?UTF-8?q?refactor(application):=20application=20?= =?UTF-8?q?=EC=A3=BC=EC=9E=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/programmers/blackdog/Application.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/java-calculator/src/main/java/com/programmers/blackdog/Application.java b/java-calculator/src/main/java/com/programmers/blackdog/Application.java index 6eae988f0..739bc8a0e 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/Application.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/Application.java @@ -1,17 +1,15 @@ package com.programmers.blackdog; import com.programmers.blackdog.controller.CalculatorController; -import com.programmers.blackdog.view.InputView; -import com.programmers.blackdog.view.OutputView; -import com.programmers.blackdog.view.PrintStreamOutputView; -import com.programmers.blackdog.view.ScannerInputView; +import com.programmers.blackdog.view.*; public class Application { public static void main(String[] args) { InputView inputView = new ScannerInputView(); OutputView outputView = new PrintStreamOutputView(); + Console console = new Console(inputView, outputView); - CalculatorController calculator = new CalculatorController(inputView, outputView); + CalculatorController calculator = new CalculatorController(console); calculator.run(); } } From 07d518ba218a46e996f17ed9c33e821b84dd2325 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Thu, 15 Jun 2023 20:55:43 +0900 Subject: [PATCH 81/92] =?UTF-8?q?feat(controller):=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EB=9E=A8=20=EC=A2=85=EB=A3=8C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{junho => blackdog}/controller/constant/Selection.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename java-calculator/src/main/java/com/programmers/{junho => blackdog}/controller/constant/Selection.java (92%) diff --git a/java-calculator/src/main/java/com/programmers/junho/controller/constant/Selection.java b/java-calculator/src/main/java/com/programmers/blackdog/controller/constant/Selection.java similarity index 92% rename from java-calculator/src/main/java/com/programmers/junho/controller/constant/Selection.java rename to java-calculator/src/main/java/com/programmers/blackdog/controller/constant/Selection.java index ceb4116c2..ede80a647 100644 --- a/java-calculator/src/main/java/com/programmers/junho/controller/constant/Selection.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/controller/constant/Selection.java @@ -3,7 +3,7 @@ import java.util.Arrays; public enum Selection { - CHECK_DATA(1), CALCULATE(2); + CHECK_DATA(1), CALCULATE(2), EXIT(3); private final int code; From 64dae336b44f698eb72ba2dec23f85a9c17b8b1d Mon Sep 17 00:00:00 2001 From: juno-junho Date: Thu, 15 Jun 2023 20:58:59 +0900 Subject: [PATCH 82/92] =?UTF-8?q?chore:=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/{ => calculator}/Calculator.java | 2 +- .../domain/{ => expression}/Expression.java | 2 +- .../domain/{ => expression}/InfixExpression.java | 4 +++- .../blackdog/domain/utils/StringUtil.java | 4 ++-- .../blackdog/service/CalculatorService.java | 6 +++--- .../programmers/blackdog/domain/CalculatorTest.java | 13 ++++++++++--- .../blackdog/domain/InfixExpressionTest.java | 1 + 7 files changed, 21 insertions(+), 11 deletions(-) rename java-calculator/src/main/java/com/programmers/blackdog/domain/{ => calculator}/Calculator.java (95%) rename java-calculator/src/main/java/com/programmers/blackdog/domain/{ => expression}/Expression.java (56%) rename java-calculator/src/main/java/com/programmers/blackdog/domain/{ => expression}/InfixExpression.java (95%) diff --git a/java-calculator/src/main/java/com/programmers/blackdog/domain/Calculator.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/calculator/Calculator.java similarity index 95% rename from java-calculator/src/main/java/com/programmers/blackdog/domain/Calculator.java rename to java-calculator/src/main/java/com/programmers/blackdog/domain/calculator/Calculator.java index 4af1353f5..1e1c97d74 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/domain/Calculator.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/calculator/Calculator.java @@ -1,6 +1,6 @@ package com.programmers.junho.domain; -import com.programmers.blackdog.domain.calculator.AbstractCalculator; +import com.programmers.blackdog.domain.expression.Expression; import java.util.Stack; diff --git a/java-calculator/src/main/java/com/programmers/blackdog/domain/Expression.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/expression/Expression.java similarity index 56% rename from java-calculator/src/main/java/com/programmers/blackdog/domain/Expression.java rename to java-calculator/src/main/java/com/programmers/blackdog/domain/expression/Expression.java index ddc483e3b..d02ea6ce4 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/domain/Expression.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/expression/Expression.java @@ -1,4 +1,4 @@ -package com.programmers.blackdog.domain; +package com.programmers.blackdog.domain.expression; public interface Expression { String getPostfixExpression(); diff --git a/java-calculator/src/main/java/com/programmers/blackdog/domain/InfixExpression.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/expression/InfixExpression.java similarity index 95% rename from java-calculator/src/main/java/com/programmers/blackdog/domain/InfixExpression.java rename to java-calculator/src/main/java/com/programmers/blackdog/domain/expression/InfixExpression.java index 498b7fa36..88c0013b6 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/domain/InfixExpression.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/expression/InfixExpression.java @@ -1,4 +1,6 @@ -package com.programmers.blackdog.domain; +package com.programmers.blackdog.domain.expression; + +import com.programmers.blackdog.domain.ArithmeticOperators; import java.util.Objects; import java.util.Stack; diff --git a/java-calculator/src/main/java/com/programmers/blackdog/domain/utils/StringUtil.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/utils/StringUtil.java index ffbef6441..476414da8 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/domain/utils/StringUtil.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/utils/StringUtil.java @@ -1,6 +1,6 @@ -package com.programmers.junho.domain.utils; +package com.programmers.blackdog.domain.utils; -public class StringUtil { +public final class StringUtil { private StringUtil() { throw new AssertionError("Util 클래스 생성 불가합니다."); diff --git a/java-calculator/src/main/java/com/programmers/blackdog/service/CalculatorService.java b/java-calculator/src/main/java/com/programmers/blackdog/service/CalculatorService.java index 69a2c9a59..a3144c4ff 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/service/CalculatorService.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/service/CalculatorService.java @@ -1,8 +1,8 @@ package com.programmers.blackdog.service; -import com.programmers.blackdog.domain.Calculator; -import com.programmers.blackdog.domain.Expression; -import com.programmers.blackdog.domain.InfixExpression; +import com.programmers.blackdog.domain.calculator.Calculator; +import com.programmers.blackdog.domain.expression.Expression; +import com.programmers.blackdog.domain.expression.InfixExpression; import com.programmers.blackdog.domain.calculator.AbstractCalculator; import com.programmers.blackdog.repository.CalculatorRepository; import com.programmers.blackdog.repository.MemoryCalculatorRepository; diff --git a/java-calculator/src/test/java/com/programmers/blackdog/domain/CalculatorTest.java b/java-calculator/src/test/java/com/programmers/blackdog/domain/CalculatorTest.java index b88c2029a..bf7d01bb4 100644 --- a/java-calculator/src/test/java/com/programmers/blackdog/domain/CalculatorTest.java +++ b/java-calculator/src/test/java/com/programmers/blackdog/domain/CalculatorTest.java @@ -1,5 +1,8 @@ package com.programmers.blackdog.domain; +import com.programmers.blackdog.domain.calculator.Calculator; +import com.programmers.blackdog.domain.expression.Expression; +import com.programmers.blackdog.domain.expression.InfixExpression; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -19,11 +22,15 @@ void setUp() { calculator = new Calculator(); } + private static Expression getExpression(String expression) { + return new InfixExpression(expression); + } + @DisplayName("계산 식을 입력하면 올바른 계산 결과를 반환한다.") @ParameterizedTest(name = "식: {0}, 결과: {1}") @CsvSource(value = {"1 + 2:3", "1 + 2 * 3:7", "3 - 2 * 2:-1", "44 / 2 * 8:176", "22 * 8:176", "12 + 44 / 2 * 8 - 10 + 18 / 2 / 3:181"}, delimiter = ':') void when_ExpressionIsGiven_CalculateCorrectResult(String expression, int calculatedResult) { - int actual = calculator.calculate(expression); + int actual = calculator.calculate(getExpression(expression)); assertThat(actual).isEqualTo(calculatedResult); } @@ -32,7 +39,7 @@ void when_ExpressionIsGiven_CalculateCorrectResult(String expression, int calcul @ParameterizedTest(name = "식: {0}") @ValueSource(strings = {"999999 * 999999 * 99999 * 9999999", "1 - 999999999 - 999999999 - 999999999 - 999999999"}) void when_CalculatedResultIsOutOfIntegerRange_Expects_ThrowException(String expression) { - assertThatThrownBy(() -> calculator.calculate(expression)) + assertThatThrownBy(() -> calculator.calculate(getExpression(expression))) .isInstanceOf(ArithmeticException.class); } @@ -40,7 +47,7 @@ void when_CalculatedResultIsOutOfIntegerRange_Expects_ThrowException(String expr @Test void when_InputIsOutOfIntegerRange_Expects_ThrowException() { String expression = "999999999999999 + 1"; - assertThatThrownBy(() -> calculator.calculate(expression)) + assertThatThrownBy(() -> calculator.calculate(getExpression(expression))) .isInstanceOf(IllegalArgumentException.class); } } \ No newline at end of file diff --git a/java-calculator/src/test/java/com/programmers/blackdog/domain/InfixExpressionTest.java b/java-calculator/src/test/java/com/programmers/blackdog/domain/InfixExpressionTest.java index de3c867a6..cd721eb5b 100644 --- a/java-calculator/src/test/java/com/programmers/blackdog/domain/InfixExpressionTest.java +++ b/java-calculator/src/test/java/com/programmers/blackdog/domain/InfixExpressionTest.java @@ -1,6 +1,7 @@ package com.programmers.blackdog.domain; +import com.programmers.blackdog.domain.expression.InfixExpression; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; From 73da710f6b7de6e5d0b152472a6231b4882fff55 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Thu, 15 Jun 2023 21:44:36 +0900 Subject: [PATCH 83/92] =?UTF-8?q?fix:=20=EC=A0=95=EA=B7=9C=EC=8B=9D=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0=20(\\=EC=B6=94=EA=B0=80?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/programmers/blackdog/domain/RegexGenerator.java | 6 ++++-- .../com/programmers/blackdog/domain/RegexGeneratorTest.java | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/java-calculator/src/main/java/com/programmers/blackdog/domain/RegexGenerator.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/RegexGenerator.java index c97cd68e5..23ee93387 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/domain/RegexGenerator.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/RegexGenerator.java @@ -9,11 +9,13 @@ public class RegexGenerator { private static final String REGEX_PREFIX = "^\\d+\\s(["; private static final String REGEX_SUFFIX = "]\\s\\d+\\s)+$"; + public static final String PREFIX = "\\"; + public static final String SUFFIX = ""; public String generateWithOperator(ArithmeticOperators... arithmeticOperators) { StringBuilder operators = new StringBuilder(); for (ArithmeticOperators arithmeticOperator : arithmeticOperators) { - operators.append(arithmeticOperator.getOperator()); + operators.append(PREFIX).append(arithmeticOperator.getOperator()); } return REGEX_PREFIX + operators.append(REGEX_SUFFIX); } @@ -21,7 +23,7 @@ public String generateWithOperator(ArithmeticOperators... arithmeticOperators) { public String generateWithAllOperator() { String allOperators = Arrays.stream(values()) .map(ArithmeticOperators::getOperator) - .collect(Collectors.joining()); + .collect(Collectors.joining(PREFIX, PREFIX, SUFFIX)); return REGEX_PREFIX + allOperators + REGEX_SUFFIX; } } diff --git a/java-calculator/src/test/java/com/programmers/blackdog/domain/RegexGeneratorTest.java b/java-calculator/src/test/java/com/programmers/blackdog/domain/RegexGeneratorTest.java index 99b6034d4..ca0e1a24e 100644 --- a/java-calculator/src/test/java/com/programmers/blackdog/domain/RegexGeneratorTest.java +++ b/java-calculator/src/test/java/com/programmers/blackdog/domain/RegexGeneratorTest.java @@ -13,6 +13,7 @@ class RegexGeneratorTest { private static final String REGEX_PREFIX = "^\\d+\\s(["; private static final String REGEX_SUFFIX = "]\\s\\d+\\s)+$"; + public static final String OPERATOR_PREFIX = "\\"; private RegexGenerator regexGenerator; @@ -27,7 +28,7 @@ void setUp() { void when_ConfineSpecificOperator_Expects_GenerateRegexWithInputOperator(ArithmeticOperators firstOperator, ArithmeticOperators secondOperator) { String regex = regexGenerator.generateWithOperator(firstOperator, secondOperator); - assertThat(regex).isEqualTo(REGEX_PREFIX + firstOperator.getOperator()+ secondOperator.getOperator() + REGEX_SUFFIX); + assertThat(regex).isEqualTo(REGEX_PREFIX + OPERATOR_PREFIX + firstOperator.getOperator()+ OPERATOR_PREFIX + secondOperator.getOperator() + REGEX_SUFFIX); } @DisplayName("모든 연산자를 포함한 정규식을 반환한다.") @@ -35,7 +36,7 @@ void when_ConfineSpecificOperator_Expects_GenerateRegexWithInputOperator(Arithme void when_GenerateWithAllOperator_Expects_GenerateRegexWithAllOperator() { String regex = regexGenerator.generateWithAllOperator(); - String expected = "^\\d+\\s([+-*/]\\s\\d+\\s)+$"; + String expected = "^\\d+\\s([\\+\\-\\*\\/]\\s\\d+\\s)+$"; assertThat(regex).isEqualTo(expected); } From de9f0c15dd4c6052160432358088fb26e1c2255b Mon Sep 17 00:00:00 2001 From: juno-junho Date: Thu, 15 Jun 2023 21:45:08 +0900 Subject: [PATCH 84/92] =?UTF-8?q?fix:=20=3D=20=EA=B8=B0=ED=98=B8=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 --- .../com/programmers/blackdog/service/CalculatorService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java-calculator/src/main/java/com/programmers/blackdog/service/CalculatorService.java b/java-calculator/src/main/java/com/programmers/blackdog/service/CalculatorService.java index a3144c4ff..2722487cb 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/service/CalculatorService.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/service/CalculatorService.java @@ -11,7 +11,7 @@ // 계산 및 저장 로직 담당 public class CalculatorService implements Service { - private static final String EQUAL = "="; + private static final String EQUAL = " = "; private final CalculatorRepository calculatorRepository; private final AbstractCalculator calculator; From 988d8f822bc5075be8591d37b692bb02192f4a8d Mon Sep 17 00:00:00 2001 From: juno-junho Date: Thu, 15 Jun 2023 21:46:07 +0900 Subject: [PATCH 85/92] =?UTF-8?q?refactor:=20=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC=20=EC=BD=98=EC=86=94=20=EB=B0=8F=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=EB=A1=9C=20=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CalculatorController.java | 66 +++++++++++-------- .../programmers/blackdog/view/Console.java | 2 +- .../blackdog/view/ScannerInputView.java | 1 - 3 files changed, 38 insertions(+), 31 deletions(-) diff --git a/java-calculator/src/main/java/com/programmers/blackdog/controller/CalculatorController.java b/java-calculator/src/main/java/com/programmers/blackdog/controller/CalculatorController.java index 941db2c0a..3590445d1 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/controller/CalculatorController.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/controller/CalculatorController.java @@ -1,11 +1,9 @@ package com.programmers.junho.controller; -import com.programmers.junho.controller.constant.Selection; -import com.programmers.junho.domain.Calculator; -import com.programmers.junho.repository.CalculatorRepository; -import com.programmers.junho.repository.MemoryCalculatorRepository; -import com.programmers.junho.view.InputView; -import com.programmers.junho.view.OutputView; +import com.programmers.blackdog.controller.constant.Selection; +import com.programmers.blackdog.service.CalculatorService; +import com.programmers.blackdog.service.Service; +import com.programmers.blackdog.view.Console; import java.util.List; @@ -13,42 +11,52 @@ public class CalculatorController { - public static final String EQUAL = " = "; - private final CalculatorRepository calculatorRepository; - private final InputView inputView; - private final OutputView outputView; + private final Service service; + private final Console console; - public CalculatorController(InputView inputView, OutputView outputView) { - this.inputView = inputView; - this.outputView = outputView; - this.calculatorRepository = new MemoryCalculatorRepository(); - System.out.println(); + public CalculatorController(Console console) { + this.console = console; + this.service = new CalculatorService(); } public void run() { - Calculator calculator = new Calculator(); while (true) { - switch (getCode()){ - case CHECK_DATA: - printAllPreviousData(); - break; - case CALCULATE: -// printCalculatedResultAndSave(); - break; - default: - throw new IllegalArgumentException("잘못된 값을 입력하셨습니다."); + try { + switch (getCode()) { + case CHECK_DATA: + printAllPreviousData(); + break; + case CALCULATE: + printCalculatedResultAndSave(); + break; + case EXIT: + exitProgram(); + return; + } + } catch (Exception e) { + console.printErrorMessage(e.getMessage()); } } } private Selection getCode() { - outputView.printChoiceMessage(); - return findByCode(inputView.getSelectedCode()); + int selectionCode = console.getSelectionCode(); + return findByCode(selectionCode); } + private void printAllPreviousData() { - List calculatedData = calculatorRepository.findAll(); - outputView.printExpressions(calculatedData); + List calculatedData = service.findAll(); + console.printExpressions(calculatedData); + } + + private void printCalculatedResultAndSave() { + String expression = console.getExpression(); + int result = service.calculate(expression); + + service.save(expression, result); + + console.printCalculatedResult(result); } private void printCalculatedResultAndSave(Calculator calculator) { diff --git a/java-calculator/src/main/java/com/programmers/blackdog/view/Console.java b/java-calculator/src/main/java/com/programmers/blackdog/view/Console.java index 1ed84e599..37296ad78 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/view/Console.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/view/Console.java @@ -4,7 +4,7 @@ public class Console { - private static final String CHOICE_MESSAGE = "1. 조회\n" + "2. 계산"; + private static final String CHOICE_MESSAGE = "1. 조회\n" + "2. 계산\n" + "3. 종료\n"; private final InputView inputView; private final OutputView outputView; diff --git a/java-calculator/src/main/java/com/programmers/blackdog/view/ScannerInputView.java b/java-calculator/src/main/java/com/programmers/blackdog/view/ScannerInputView.java index a9892cd66..90302eb5d 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/view/ScannerInputView.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/view/ScannerInputView.java @@ -7,7 +7,6 @@ public class ScannerInputView implements InputView{ @Override public String read() { - scanner.nextLine(); return scanner.nextLine(); } } From 0c6d27b6c517c933e00aad0f88bd56e66560bde2 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Thu, 15 Jun 2023 21:47:05 +0900 Subject: [PATCH 86/92] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java-calculator/README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/java-calculator/README.md b/java-calculator/README.md index 9a77dfc77..9a87edead 100644 --- a/java-calculator/README.md +++ b/java-calculator/README.md @@ -82,10 +82,12 @@ 3. 계산을 한 뒤, 결과 값은 다시 스택에 넣는다. 이 과정을 수식이 끝날 때 까지 반복한다. 4. 수식이 끝났다면 스택에 마지막 남은 값이 결과 값이 된다. ``` -- [ ] 식을 입력 받을 때 계산기에서 수행가능한 연산 범위를 제한 할 수 있다. - - [ ] Regex를 통해서 검증하기. -- [ ] 중위표현식, 후위 표현식에 따른 계산 확장 가능성 기능 구현 -- [ ] +- [x] 식을 입력 받을 때 계산기에서 수행가능한 연산 범위를 제한 할 수 있다. + - [x] Regex를 통해서 검증하기. +- [x] 중위표현식, 후위 표현식에 따른 계산 확장 가능성 기능 구현 + +- [x] 정규식 문제 해결 => \\ 추가해서 해설 + - [x] 예외 처리 - [x] 조회(1), 계산(2) 이외의 값을 입력 했을 경우 `IllegalArgumentException` 발생 -> controller에서 처리 From c210056a09254f50e8c18b5ba5fd54188fe4e947 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Thu, 15 Jun 2023 21:48:33 +0900 Subject: [PATCH 87/92] =?UTF-8?q?chore:=20=ED=8F=B4=EB=8D=94=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CalculatorController.java | 15 ++++----------- .../blackdog/controller/constant/Selection.java | 2 +- .../blackdog/domain/ArithmeticOperators.java | 2 +- .../programmers/blackdog/domain/Operable.java | 2 +- .../domain/calculator/AbstractCalculator.java | 7 +++++++ .../blackdog/domain/calculator/Calculator.java | 2 +- .../repository/CalculatorRepository.java | 2 +- .../repository/MemoryCalculatorRepository.java | 2 +- .../blackdog/view/ScannerInputView.java | 6 +++--- .../domain/constant/CalculatorConstant.java | 17 ----------------- 10 files changed, 20 insertions(+), 37 deletions(-) create mode 100644 java-calculator/src/main/java/com/programmers/blackdog/domain/calculator/AbstractCalculator.java rename java-calculator/src/main/java/com/programmers/{junho => blackdog}/repository/CalculatorRepository.java (75%) rename java-calculator/src/main/java/com/programmers/{junho => blackdog}/repository/MemoryCalculatorRepository.java (92%) delete mode 100644 java-calculator/src/main/java/com/programmers/junho/domain/constant/CalculatorConstant.java diff --git a/java-calculator/src/main/java/com/programmers/blackdog/controller/CalculatorController.java b/java-calculator/src/main/java/com/programmers/blackdog/controller/CalculatorController.java index 3590445d1..f56e60e9f 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/controller/CalculatorController.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/controller/CalculatorController.java @@ -1,4 +1,4 @@ -package com.programmers.junho.controller; +package com.programmers.blackdog.controller; import com.programmers.blackdog.controller.constant.Selection; import com.programmers.blackdog.service.CalculatorService; @@ -59,14 +59,7 @@ private void printCalculatedResultAndSave() { console.printCalculatedResult(result); } - private void printCalculatedResultAndSave(Calculator calculator) { - String expression = inputView.getExpression(); - int result = calculator.calculate(expression); - outputView.printCalculatedResult(result); - calculatorRepository.save(generateTotalResult(expression, result)); + private void exitProgram() { + console.printEndMessage(); } - - private String generateTotalResult(String expression, int result) { - return expression + EQUAL + result; - } -} \ No newline at end of file +} diff --git a/java-calculator/src/main/java/com/programmers/blackdog/controller/constant/Selection.java b/java-calculator/src/main/java/com/programmers/blackdog/controller/constant/Selection.java index ede80a647..35bd773aa 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/controller/constant/Selection.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/controller/constant/Selection.java @@ -1,4 +1,4 @@ -package com.programmers.junho.controller.constant; +package com.programmers.blackdog.controller.constant; import java.util.Arrays; diff --git a/java-calculator/src/main/java/com/programmers/blackdog/domain/ArithmeticOperators.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/ArithmeticOperators.java index a05dba101..9e0be6dae 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/domain/ArithmeticOperators.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/ArithmeticOperators.java @@ -1,4 +1,4 @@ -package com.programmers.junho.domain; +package com.programmers.blackdog.domain; import java.util.Arrays; diff --git a/java-calculator/src/main/java/com/programmers/blackdog/domain/Operable.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/Operable.java index 28ecd4651..58102b1ee 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/domain/Operable.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/Operable.java @@ -1,4 +1,4 @@ -package com.programmers.junho.domain; +package com.programmers.blackdog.domain; @FunctionalInterface public interface Operable { diff --git a/java-calculator/src/main/java/com/programmers/blackdog/domain/calculator/AbstractCalculator.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/calculator/AbstractCalculator.java new file mode 100644 index 000000000..fb14afb89 --- /dev/null +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/calculator/AbstractCalculator.java @@ -0,0 +1,7 @@ +package com.programmers.blackdog.domain.calculator; + +import com.programmers.blackdog.domain.expression.Expression; + +public interface AbstractCalculator { + int calculate(Expression expression); +} diff --git a/java-calculator/src/main/java/com/programmers/blackdog/domain/calculator/Calculator.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/calculator/Calculator.java index 1e1c97d74..47aabc4c2 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/domain/calculator/Calculator.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/calculator/Calculator.java @@ -1,4 +1,4 @@ -package com.programmers.junho.domain; +package com.programmers.blackdog.domain.calculator; import com.programmers.blackdog.domain.expression.Expression; diff --git a/java-calculator/src/main/java/com/programmers/junho/repository/CalculatorRepository.java b/java-calculator/src/main/java/com/programmers/blackdog/repository/CalculatorRepository.java similarity index 75% rename from java-calculator/src/main/java/com/programmers/junho/repository/CalculatorRepository.java rename to java-calculator/src/main/java/com/programmers/blackdog/repository/CalculatorRepository.java index b765e2dc5..56060338f 100644 --- a/java-calculator/src/main/java/com/programmers/junho/repository/CalculatorRepository.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/repository/CalculatorRepository.java @@ -1,4 +1,4 @@ -package com.programmers.junho.repository; +package com.programmers.blackdog.repository; import java.util.List; diff --git a/java-calculator/src/main/java/com/programmers/junho/repository/MemoryCalculatorRepository.java b/java-calculator/src/main/java/com/programmers/blackdog/repository/MemoryCalculatorRepository.java similarity index 92% rename from java-calculator/src/main/java/com/programmers/junho/repository/MemoryCalculatorRepository.java rename to java-calculator/src/main/java/com/programmers/blackdog/repository/MemoryCalculatorRepository.java index 3a4087fe1..1b8dca115 100644 --- a/java-calculator/src/main/java/com/programmers/junho/repository/MemoryCalculatorRepository.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/repository/MemoryCalculatorRepository.java @@ -1,4 +1,4 @@ -package com.programmers.junho.repository; +package com.programmers.blackdog.repository; import java.util.ArrayList; import java.util.Collections; diff --git a/java-calculator/src/main/java/com/programmers/blackdog/view/ScannerInputView.java b/java-calculator/src/main/java/com/programmers/blackdog/view/ScannerInputView.java index 90302eb5d..0ea677ffe 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/view/ScannerInputView.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/view/ScannerInputView.java @@ -1,9 +1,9 @@ -package com.programmers.junho.view; +package com.programmers.blackdog.view; import java.util.Scanner; -public class ScannerInputView implements InputView{ - private static final Scanner scanner = new Scanner(System.in); +public class ScannerInputView implements InputView { + private final Scanner scanner = new Scanner(System.in); @Override public String read() { diff --git a/java-calculator/src/main/java/com/programmers/junho/domain/constant/CalculatorConstant.java b/java-calculator/src/main/java/com/programmers/junho/domain/constant/CalculatorConstant.java deleted file mode 100644 index 4dd6b8e75..000000000 --- a/java-calculator/src/main/java/com/programmers/junho/domain/constant/CalculatorConstant.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.programmers.junho.domain.constant; - -public enum CalculatorConstant { - REGEX("^\\d+\\s([-+*/]\\s\\d+\\s)+$"), - DELIMITER(" "), - BLANK(" "); - - private final String value; - - CalculatorConstant(String value) { - this.value = value; - } - - public String getValue() { - return value; - } -} From ff23b5e6592eb2ea6995f4772d5d37f2355a342c Mon Sep 17 00:00:00 2001 From: juno-junho Date: Thu, 15 Jun 2023 22:14:54 +0900 Subject: [PATCH 88/92] =?UTF-8?q?feat:=200=EC=9C=BC=EB=A1=9C=20=EB=82=98?= =?UTF-8?q?=EB=88=8C=20=EA=B2=BD=EC=9A=B0=20=EC=98=88=EC=99=B8=20=EB=B0=9C?= =?UTF-8?q?=EC=83=9D=20=EA=B8=B0=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 --- .../programmers/blackdog/domain/ArithmeticOperators.java | 7 +++++++ .../blackdog/domain/expression/InfixExpression.java | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/java-calculator/src/main/java/com/programmers/blackdog/domain/ArithmeticOperators.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/ArithmeticOperators.java index 9e0be6dae..e46561777 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/domain/ArithmeticOperators.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/ArithmeticOperators.java @@ -21,10 +21,17 @@ public int apply(int a, int b) { }, DIVISION("/", 1) { @Override public int apply(int a, int b) { + validateDivideNumIsZero(b); return a / b; } }; + private static void validateDivideNumIsZero(int num) { + if (num == 0) { + throw new ArithmeticException("0으로 나눌 수 없습니다."); + } + } + private final String operator; private final int priority; diff --git a/java-calculator/src/main/java/com/programmers/blackdog/domain/expression/InfixExpression.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/expression/InfixExpression.java index 88c0013b6..be1e4f2d4 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/domain/expression/InfixExpression.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/expression/InfixExpression.java @@ -45,7 +45,7 @@ private void convertToPostfix(StringBuilder postfixExpression, Stack Date: Thu, 15 Jun 2023 22:15:56 +0900 Subject: [PATCH 89/92] =?UTF-8?q?test:=200=EC=9C=BC=EB=A1=9C=20=EB=82=98?= =?UTF-8?q?=EB=88=8C=20=EA=B2=BD=EC=9A=B0=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=B0=8F=20delimiter=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackdog/domain/ArithmeticOperatorsTest.java | 8 ++++++++ .../com/programmers/blackdog/domain/CalculatorTest.java | 2 +- .../programmers/blackdog/domain/InfixExpressionTest.java | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/java-calculator/src/test/java/com/programmers/blackdog/domain/ArithmeticOperatorsTest.java b/java-calculator/src/test/java/com/programmers/blackdog/domain/ArithmeticOperatorsTest.java index a6132dc69..eaf2aefd4 100644 --- a/java-calculator/src/test/java/com/programmers/blackdog/domain/ArithmeticOperatorsTest.java +++ b/java-calculator/src/test/java/com/programmers/blackdog/domain/ArithmeticOperatorsTest.java @@ -5,6 +5,7 @@ import static com.programmers.blackdog.domain.ArithmeticOperators.*; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; class ArithmeticOperatorsTest { @@ -35,4 +36,11 @@ void when_DivideTwoNum_Expects_correctResult() { int result = DIVISION.apply(4, 2); assertThat(result).isEqualTo(2); } + + @DisplayName("0으로 나누면 예외를 발생한다.") + @Test + void when_DivideWithZero_Expects_ThrowsException() { + assertThatThrownBy(() -> DIVISION.apply(10, 0)) + .isInstanceOf(ArithmeticException.class); + } } diff --git a/java-calculator/src/test/java/com/programmers/blackdog/domain/CalculatorTest.java b/java-calculator/src/test/java/com/programmers/blackdog/domain/CalculatorTest.java index bf7d01bb4..22ed67383 100644 --- a/java-calculator/src/test/java/com/programmers/blackdog/domain/CalculatorTest.java +++ b/java-calculator/src/test/java/com/programmers/blackdog/domain/CalculatorTest.java @@ -28,7 +28,7 @@ private static Expression getExpression(String expression) { @DisplayName("계산 식을 입력하면 올바른 계산 결과를 반환한다.") @ParameterizedTest(name = "식: {0}, 결과: {1}") - @CsvSource(value = {"1 + 2:3", "1 + 2 * 3:7", "3 - 2 * 2:-1", "44 / 2 * 8:176", "22 * 8:176", "12 + 44 / 2 * 8 - 10 + 18 / 2 / 3:181"}, delimiter = ':') + @CsvSource(value = {"1 + 2=3", "1 + 2 * 3=7", "3 - 2 * 2=-1", "44 / 2 * 8=176", "22 * 8=176", "12 + 44 / 2 * 8 - 10 + 18 / 2 / 3=181"}, delimiter = '=') void when_ExpressionIsGiven_CalculateCorrectResult(String expression, int calculatedResult) { int actual = calculator.calculate(getExpression(expression)); diff --git a/java-calculator/src/test/java/com/programmers/blackdog/domain/InfixExpressionTest.java b/java-calculator/src/test/java/com/programmers/blackdog/domain/InfixExpressionTest.java index cd721eb5b..921a9d594 100644 --- a/java-calculator/src/test/java/com/programmers/blackdog/domain/InfixExpressionTest.java +++ b/java-calculator/src/test/java/com/programmers/blackdog/domain/InfixExpressionTest.java @@ -44,7 +44,7 @@ void when_WrongFormat_Expects_ThrowException(String expression) { @DisplayName("중위 표현식을 후위 표현식으로 변환한다.") @ParameterizedTest(name = "중위 : {0}, 후위 : {1}") - @CsvSource(value = {"3 + 4 * 2:3 4 2 * +", "1 + 2 * 3 + 4 / 2 + 2:1 2 3 * + 4 2 / + 2 +", "4 + 5 * 6 / 2 - 3:4 5 6 * 2 / + 3 -", "44 / 2:44 2 /"}, delimiter = ':') + @CsvSource(value = {"3 + 4 * 2=3 4 2 * +", "1 + 2 * 3 + 4 / 2 + 2=1 2 3 * + 4 2 / + 2 +", "4 + 5 * 6 / 2 - 3=4 5 6 * 2 / + 3 -", "44 / 2=44 2 /"}, delimiter = '=') void when_InfixNotationIsGiven_Expects_ReturnPostfixNotation(String infixExpression, String postfixExpression) { InfixExpression expression = new InfixExpression(infixExpression); From 9edbbd788bc607660935055f6e90492f87ab7e47 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Thu, 15 Jun 2023 22:32:05 +0900 Subject: [PATCH 90/92] =?UTF-8?q?test:=20StringUtil=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=B0=8F=20Expression=20hashCode=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackdog/domain/InfixExpressionTest.java | 1 + .../blackdog/domain/utils/StringUtilTest.java | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 java-calculator/src/test/java/com/programmers/blackdog/domain/utils/StringUtilTest.java diff --git a/java-calculator/src/test/java/com/programmers/blackdog/domain/InfixExpressionTest.java b/java-calculator/src/test/java/com/programmers/blackdog/domain/InfixExpressionTest.java index 921a9d594..9ca4e6e16 100644 --- a/java-calculator/src/test/java/com/programmers/blackdog/domain/InfixExpressionTest.java +++ b/java-calculator/src/test/java/com/programmers/blackdog/domain/InfixExpressionTest.java @@ -61,6 +61,7 @@ public void when_givenEqualExpression_Expects_Equal() { InfixExpression infixExpression1 = new InfixExpression(expression); InfixExpression infixExpression2 = new InfixExpression(expression); + assertThat(infixExpression1).hasSameHashCodeAs(infixExpression2); assertThat(infixExpression1).isEqualTo(infixExpression2); } } \ No newline at end of file diff --git a/java-calculator/src/test/java/com/programmers/blackdog/domain/utils/StringUtilTest.java b/java-calculator/src/test/java/com/programmers/blackdog/domain/utils/StringUtilTest.java new file mode 100644 index 000000000..0db7c9e1c --- /dev/null +++ b/java-calculator/src/test/java/com/programmers/blackdog/domain/utils/StringUtilTest.java @@ -0,0 +1,27 @@ +package com.programmers.blackdog.domain.utils; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatNoException; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class StringUtilTest { + @DisplayName("입력값이 숫자가 아니면 예외를 발생한다.") + @Test + void when_InputIsNotNumber_Expects_ThrowsException() { + String input = "a"; + + assertThatThrownBy(() -> StringUtil.convertStringToInt(input)) + .isInstanceOf(IllegalArgumentException.class); + } + + @DisplayName("입력값이 숫자이면 예외를 발생하지 않는다.") + @Test + void when_InputIsNumber_Expects_DoesNotThrowsException() { + String input = "111"; + + assertThatNoException() + .isThrownBy(() -> StringUtil.convertStringToInt(input)); + } +} \ No newline at end of file From 038ad399c11a3ab41f32ed650d3efbc463d2cc57 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Thu, 15 Jun 2023 22:32:27 +0900 Subject: [PATCH 91/92] =?UTF-8?q?chore:=20line=20break=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/programmers/blackdog/domain/constant/Regex.java | 1 - 1 file changed, 1 deletion(-) diff --git a/java-calculator/src/main/java/com/programmers/blackdog/domain/constant/Regex.java b/java-calculator/src/main/java/com/programmers/blackdog/domain/constant/Regex.java index 29ca661b4..441303783 100644 --- a/java-calculator/src/main/java/com/programmers/blackdog/domain/constant/Regex.java +++ b/java-calculator/src/main/java/com/programmers/blackdog/domain/constant/Regex.java @@ -8,7 +8,6 @@ private Regex(){ throw new AssertionError("인스턴스화 할 수 없습니다!"); } - public static final String BLANK = " "; public static final String DELIMITER; public static final String REGEX; From 3bd42498365b63d97dd937f4a501c882b129d5c7 Mon Sep 17 00:00:00 2001 From: juno-junho Date: Thu, 15 Jun 2023 22:32:53 +0900 Subject: [PATCH 92/92] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=B2=B4=ED=81=AC=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java-calculator/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java-calculator/README.md b/java-calculator/README.md index 9a87edead..37cb21731 100644 --- a/java-calculator/README.md +++ b/java-calculator/README.md @@ -87,7 +87,8 @@ - [x] 중위표현식, 후위 표현식에 따른 계산 확장 가능성 기능 구현 - [x] 정규식 문제 해결 => \\ 추가해서 해설 - +- [x] 0으로 나눌 경우 문제 해결 +- [x] var 사용 x -> 정확히 타입 표기를 통한 명시성 증가ㅈ - [x] 예외 처리 - [x] 조회(1), 계산(2) 이외의 값을 입력 했을 경우 `IllegalArgumentException` 발생 -> controller에서 처리