From 2859d2172fb84f1484c3f2bd877ba0a3ea5cb042 Mon Sep 17 00:00:00 2001 From: yeunsuh Date: Thu, 6 Feb 2025 03:51:52 +0900 Subject: [PATCH 01/11] docs(README.md): initializing created feature list --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bd90ef0..36cdeb8 100644 --- a/README.md +++ b/README.md @@ -1 +1,11 @@ -# java-calculator-precourse \ No newline at end of file +# java-calculator-precourse + +# 기능 목록 +1. 콘솔 입출력 매니저 +2. 구분자 인식 기능 + - 기본 구분자 인식 + - 커스텀 구분자 저장 및 인식 +3. 수 변환 및 합산 기능 + - 수 변환 + - 트리거에 따라 저장된 변환 수 합산 +4. 메인 예외처리 기능 From 312fa46bd82318977b133b0c38ce07109e5e1ccc Mon Sep 17 00:00:00 2001 From: yeunsuh Date: Fri, 7 Feb 2025 22:29:40 +0900 Subject: [PATCH 02/11] feat($main): created Console(MVC's view) Console's .read() & .print() : mapped UTC and java's method --- src/main/java/calculator/view/Console.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/calculator/view/Console.java diff --git a/src/main/java/calculator/view/Console.java b/src/main/java/calculator/view/Console.java new file mode 100644 index 0000000..4567082 --- /dev/null +++ b/src/main/java/calculator/view/Console.java @@ -0,0 +1,11 @@ +package calculator.view; + +public class Console { + public String read(){ + return camp.nextstep.edu.missionutils.Console.readLine(); + } + + public void print(String arg){ + System.out.println(arg); + } +} From 160a5959f0fba431a52c215f99ff5d9f4122cef2 Mon Sep 17 00:00:00 2001 From: yeunsuh Date: Fri, 7 Feb 2025 22:30:42 +0900 Subject: [PATCH 03/11] feat($main): created SeparatorRecognizeService normalDetect(char word, int index, int len) specialDetect(char word, int index, int len) --- .../service/SeparatorRecognizeService.java | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 src/main/java/calculator/service/SeparatorRecognizeService.java diff --git a/src/main/java/calculator/service/SeparatorRecognizeService.java b/src/main/java/calculator/service/SeparatorRecognizeService.java new file mode 100644 index 0000000..ad5b2c5 --- /dev/null +++ b/src/main/java/calculator/service/SeparatorRecognizeService.java @@ -0,0 +1,112 @@ +package calculator.service; + +import calculator.Model.DetectResult; + +public class SeparatorRecognizeService { + + private String normalClause=""; + private String specialClause=""; + + private String specialSeparator=""; + + private boolean normalDetected=false; + private boolean specialDetected=false; + private int specialState = 0; + private int specialSeparatorDetected=0; + + public DetectResult normalDetect(char word, int index, int len){ + DetectResult detectResult = new DetectResult(); + if(normalDetected) { + if(word==':'||word==',') { + int result = NumberProcessService.stringToInt(normalClause); + normalDetected = false; + normalClause = ""; + + detectResult.setDetected(true); + detectResult.setResultNum(result); + + }else{ + normalClause += word; + detectResult.setDetected(false); + } + + }else{ + if(word==':'||word==',') { + normalDetected = true; + }else if(Character.isDigit(word)){ + normalClause+=word; + normalDetected=true; + } + detectResult.setDetected(false); + } + + if(len-1==index){ + int result = NumberProcessService.stringToInt(normalClause); + normalDetected = false; + normalClause = ""; + + detectResult.setDetected(true); + detectResult.setResultNum(result); + } + + return detectResult; + } + + public DetectResult specialDetect(char word, int index, int len){ + DetectResult detectResult = new DetectResult(); + switch (specialState) { + case 0: + detectResult.setDetected(false); + if (specialSeparator!=""&&word == specialSeparator.charAt(specialSeparatorDetected)) { + specialSeparatorDetected++; + + if (specialSeparator.length() > 1 && specialSeparator.length() == specialSeparatorDetected) { + specialSeparatorDetected = 0; + specialDetected = true; + } else if (specialDetected) { + int result = NumberProcessService.stringToInt(specialClause); + specialDetected = false; + specialClause = ""; + + detectResult.setDetected(true); + detectResult.setResultNum(result); + } + + } else if (specialDetected) { + specialClause += word; + if(len-1==index){ + int result = NumberProcessService.stringToInt(specialClause); + specialDetected = false; + specialClause = ""; + + detectResult.setDetected(true); + detectResult.setResultNum(result); + } + } else if (word == '/') specialState++; + else specialSeparatorDetected = 0; + + return detectResult; + case 1: + if (word == '/') specialState++; + else throw new IllegalArgumentException("Invalid string format"); + + detectResult.setDetected(false); + return detectResult; + case 2: + if (word == '\\') specialState++; + else specialSeparator += word; + + detectResult.setDetected(false); + return detectResult; + case 3: + if (word == 'n') specialState = 0; + else throw new IllegalArgumentException("Invalid string format"); + + detectResult.setDetected(false); + return detectResult; + } + detectResult.setDetected(false); + return detectResult; + } +} + From 4523ec68d3d73feeda82b9cb8715be6d59e022ee Mon Sep 17 00:00:00 2001 From: yeunsuh Date: Fri, 7 Feb 2025 22:32:20 +0900 Subject: [PATCH 04/11] feat($main): created NumberProcessService stringToInt(String arg) intToString(int num) : is utility class --- .../service/NumberProcessService.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/java/calculator/service/NumberProcessService.java diff --git a/src/main/java/calculator/service/NumberProcessService.java b/src/main/java/calculator/service/NumberProcessService.java new file mode 100644 index 0000000..5151ebc --- /dev/null +++ b/src/main/java/calculator/service/NumberProcessService.java @@ -0,0 +1,18 @@ +package calculator.service; + +import java.util.List; + +public class NumberProcessService { + public static int stringToInt(String arg){ + if(!arg.matches("\\d+")) throw new IllegalArgumentException("Invalid number format"); + return Integer.parseInt(arg); + } + + public static String intToString(int num){ + return String.valueOf(num); + } + + public static int addAll(List targetList){ + return targetList.stream().mapToInt(Integer::intValue).sum(); + } +} From b639ccfea38a2c817d192dd2f7a23ffbf50824b0 Mon Sep 17 00:00:00 2001 From: yeunsuh Date: Fri, 7 Feb 2025 22:33:34 +0900 Subject: [PATCH 05/11] feat($main): created CalculatorController consisted of input, process, output DetectResult for data handling --- .../java/calculator/Model/DetectResult.java | 27 +++++++++ .../controller/CalculatorController.java | 60 +++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 src/main/java/calculator/Model/DetectResult.java create mode 100644 src/main/java/calculator/controller/CalculatorController.java diff --git a/src/main/java/calculator/Model/DetectResult.java b/src/main/java/calculator/Model/DetectResult.java new file mode 100644 index 0000000..37cd4bc --- /dev/null +++ b/src/main/java/calculator/Model/DetectResult.java @@ -0,0 +1,27 @@ +package calculator.Model; + +public class DetectResult { + private boolean isDetected; + private int resultNum; + + public DetectResult(){ + this.isDetected = false; + this.resultNum = 0; + } + + public int getResultNum(){ + return resultNum; + } + + public boolean getDetected(){ + return isDetected; + } + + public void setDetected(boolean bool){ + this.isDetected = bool; + } + + public void setResultNum(int resultNum) { + this.resultNum = resultNum; + } +} diff --git a/src/main/java/calculator/controller/CalculatorController.java b/src/main/java/calculator/controller/CalculatorController.java new file mode 100644 index 0000000..a236bd3 --- /dev/null +++ b/src/main/java/calculator/controller/CalculatorController.java @@ -0,0 +1,60 @@ +package calculator.controller; + +import calculator.Model.DetectResult; +import calculator.service.NumberProcessService; +import calculator.service.SeparatorRecognizeService; +import calculator.view.Console; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +import static calculator.service.NumberProcessService.addAll; + +public class CalculatorController { + + private Console console; + + private SeparatorRecognizeService separatorRecognizeService; + + private static String rawArg; + private List numberList = new ArrayList<>(); + private int calculationResult; + private DetectResult[] detectResult = new DetectResult[2]; + private char temp; + + public CalculatorController(Console console){ + this.console = console; + separatorRecognizeService = new SeparatorRecognizeService(); + } + + public void input(){ + console.print("덧셈할 문자열을 입력해 주세요."); + rawArg = console.read(); + if(Objects.equals(rawArg, ""))calculationResult=0; + } + + public void process(){ + int leng = rawArg.length(); + for(int i=0; i Date: Fri, 7 Feb 2025 22:34:30 +0900 Subject: [PATCH 06/11] feat($main): completed Application completed, error catch for exiting --- build.gradle | 4 ++++ src/main/java/calculator/Application.java | 20 ++++++++++++++++++- src/test/java/calculator/ApplicationTest.java | 2 +- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index ae93bdf..79504de 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,10 @@ java { } } +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} + repositories { mavenCentral() maven { url 'https://jitpack.io' } diff --git a/src/main/java/calculator/Application.java b/src/main/java/calculator/Application.java index 573580f..d6f0f1f 100644 --- a/src/main/java/calculator/Application.java +++ b/src/main/java/calculator/Application.java @@ -1,7 +1,25 @@ package calculator; +import calculator.controller.CalculatorController; +import calculator.view.Console; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + try{ + new Application().run(); + + } catch (IllegalArgumentException e) { + System.err.println("ERROR : " + e.getMessage()); + return; + } + } + + public void run(){ + Console console = new Console(); + CalculatorController controller = new CalculatorController(console); + + controller.input(); + controller.process(); + controller.output(); } } diff --git a/src/test/java/calculator/ApplicationTest.java b/src/test/java/calculator/ApplicationTest.java index 93771fb..6629b00 100644 --- a/src/test/java/calculator/ApplicationTest.java +++ b/src/test/java/calculator/ApplicationTest.java @@ -9,7 +9,7 @@ class ApplicationTest extends NsTest { @Test - void 커스텀_구분자_사용() { + void su_구분자_사용() { assertSimpleTest(() -> { run("//;\\n1"); assertThat(output()).contains("결과 : 1"); From 23fa09054c6f81da41140e97ec038bfcb09fa90b Mon Sep 17 00:00:00 2001 From: yeunsuh Date: Fri, 7 Feb 2025 22:36:07 +0900 Subject: [PATCH 07/11] docs($README.md): added some contents --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 36cdeb8..6016633 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,13 @@ # java-calculator-precourse # 기능 목록 -1. 콘솔 입출력 매니저 -2. 구분자 인식 기능 + *MVC에 따라 구현해 기능목록 외의 커밋 존재 + +1. 콘솔 입출력 관리 : Console +2. 구분자 인식 기능 : SeparatorRecognizeService - 기본 구분자 인식 - 커스텀 구분자 저장 및 인식 -3. 수 변환 및 합산 기능 +3. 수 변환 및 합산 기능 : NumberProcessService - 수 변환 - 트리거에 따라 저장된 변환 수 합산 4. 메인 예외처리 기능 From 11a8897b0062350039ba32a1db2c86527821ac07 Mon Sep 17 00:00:00 2001 From: yeunsuh Date: Fri, 7 Feb 2025 22:54:38 +0900 Subject: [PATCH 08/11] fix($main): testcase error fixed --- src/main/java/calculator/Application.java | 8 +------- .../java/calculator/controller/CalculatorController.java | 3 ++- .../calculator/service/SeparatorRecognizeService.java | 2 ++ src/test/java/calculator/ApplicationTest.java | 2 +- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/main/java/calculator/Application.java b/src/main/java/calculator/Application.java index d6f0f1f..f58b633 100644 --- a/src/main/java/calculator/Application.java +++ b/src/main/java/calculator/Application.java @@ -5,13 +5,7 @@ public class Application { public static void main(String[] args) { - try{ - new Application().run(); - - } catch (IllegalArgumentException e) { - System.err.println("ERROR : " + e.getMessage()); - return; - } + new Application().run(); } public void run(){ diff --git a/src/main/java/calculator/controller/CalculatorController.java b/src/main/java/calculator/controller/CalculatorController.java index a236bd3..8eb1706 100644 --- a/src/main/java/calculator/controller/CalculatorController.java +++ b/src/main/java/calculator/controller/CalculatorController.java @@ -55,6 +55,7 @@ public void process(){ } public void output(){ - console.print("결과 : " + calculationResult); + String content = "결과 : " + calculationResult; + console.print(content); } } diff --git a/src/main/java/calculator/service/SeparatorRecognizeService.java b/src/main/java/calculator/service/SeparatorRecognizeService.java index ad5b2c5..21ba6e4 100644 --- a/src/main/java/calculator/service/SeparatorRecognizeService.java +++ b/src/main/java/calculator/service/SeparatorRecognizeService.java @@ -36,6 +36,8 @@ public DetectResult normalDetect(char word, int index, int len){ }else if(Character.isDigit(word)){ normalClause+=word; normalDetected=true; + }else{ + throw new IllegalArgumentException("Invalid string format"); } detectResult.setDetected(false); } diff --git a/src/test/java/calculator/ApplicationTest.java b/src/test/java/calculator/ApplicationTest.java index 6629b00..93771fb 100644 --- a/src/test/java/calculator/ApplicationTest.java +++ b/src/test/java/calculator/ApplicationTest.java @@ -9,7 +9,7 @@ class ApplicationTest extends NsTest { @Test - void su_구분자_사용() { + void 커스텀_구분자_사용() { assertSimpleTest(() -> { run("//;\\n1"); assertThat(output()).contains("결과 : 1"); From fc173b00cf721a317eef526429b9ff31c8e6bd42 Mon Sep 17 00:00:00 2001 From: yeunsuh Date: Fri, 7 Feb 2025 23:21:10 +0900 Subject: [PATCH 09/11] fix($main): testcase error fixed --- .../java/calculator/Model/DetectResult.java | 10 ++--- .../controller/CalculatorController.java | 20 +++++---- .../service/SeparatorRecognizeService.java | 41 +++++++++++-------- 3 files changed, 39 insertions(+), 32 deletions(-) diff --git a/src/main/java/calculator/Model/DetectResult.java b/src/main/java/calculator/Model/DetectResult.java index 37cd4bc..2c8bd33 100644 --- a/src/main/java/calculator/Model/DetectResult.java +++ b/src/main/java/calculator/Model/DetectResult.java @@ -1,11 +1,11 @@ package calculator.Model; public class DetectResult { - private boolean isDetected; + private int isDetected; private int resultNum; public DetectResult(){ - this.isDetected = false; + this.isDetected = 0; this.resultNum = 0; } @@ -13,12 +13,12 @@ public int getResultNum(){ return resultNum; } - public boolean getDetected(){ + public int getDetected(){ return isDetected; } - public void setDetected(boolean bool){ - this.isDetected = bool; + public void setDetected(int num){ + this.isDetected = num; } public void setResultNum(int resultNum) { diff --git a/src/main/java/calculator/controller/CalculatorController.java b/src/main/java/calculator/controller/CalculatorController.java index 8eb1706..75cccab 100644 --- a/src/main/java/calculator/controller/CalculatorController.java +++ b/src/main/java/calculator/controller/CalculatorController.java @@ -39,15 +39,17 @@ public void process(){ int leng = rawArg.length(); for(int i=0; i 1 && specialSeparator.length() == specialSeparatorDetected) { specialSeparatorDetected = 0; - specialDetected = true; - } else if (specialDetected) { + specialDetected = 1; + } else if (specialDetected==1) { int result = NumberProcessService.stringToInt(specialClause); - specialDetected = false; + specialDetected = 0; specialClause = ""; - detectResult.setDetected(true); + detectResult.setDetected(1); detectResult.setResultNum(result); } - } else if (specialDetected) { + } else if (specialDetected==1) { + detectResult.setDetected(2); specialClause += word; if(len-1==index){ int result = NumberProcessService.stringToInt(specialClause); - specialDetected = false; + specialDetected = 0; specialClause = ""; - detectResult.setDetected(true); + detectResult.setDetected(1); detectResult.setResultNum(result); } - } else if (word == '/') specialState++; + } else if (word == '/') { + detectResult.setDetected(2); + specialState++; + } else specialSeparatorDetected = 0; return detectResult; @@ -92,22 +97,22 @@ public DetectResult specialDetect(char word, int index, int len){ if (word == '/') specialState++; else throw new IllegalArgumentException("Invalid string format"); - detectResult.setDetected(false); + detectResult.setDetected(2); return detectResult; case 2: if (word == '\\') specialState++; else specialSeparator += word; - detectResult.setDetected(false); + detectResult.setDetected(2); return detectResult; case 3: if (word == 'n') specialState = 0; else throw new IllegalArgumentException("Invalid string format"); - detectResult.setDetected(false); + detectResult.setDetected(2); return detectResult; } - detectResult.setDetected(false); + detectResult.setDetected(0); return detectResult; } } From 0b6c83793bc96f81ce58764174c8416b6d8e2a78 Mon Sep 17 00:00:00 2001 From: yeunsuh Date: Fri, 14 Feb 2025 04:22:50 +0900 Subject: [PATCH 10/11] fix($main): error fixed&refactored - firmed MVC pattern : implemented observer, amended model and service - build.gradle modify -> gradle.properties modify - used regex --- build.gradle | 4 - gradle.properties | 1 + settings.gradle | 2 +- src/main/java/calculator/Application.java | 11 +- .../calculator/Model/CalculatorModel.java | 54 ++++++++ .../java/calculator/Model/DetectResult.java | 27 ---- .../java/calculator/Model/ModelObserver.java | 5 + .../controller/CalculatorController.java | 55 ++------ .../service/SeparatorRecognizeService.java | 129 ++++-------------- .../calculator/util/MessageConstants.java | 16 +++ .../NumberProcessUtil.java} | 4 +- .../java/calculator/view/CalculatorView.java | 17 +++ src/main/java/calculator/view/Console.java | 11 -- src/test/java/calculator/ApplicationTest.java | 8 ++ 14 files changed, 150 insertions(+), 194 deletions(-) create mode 100644 gradle.properties create mode 100644 src/main/java/calculator/Model/CalculatorModel.java delete mode 100644 src/main/java/calculator/Model/DetectResult.java create mode 100644 src/main/java/calculator/Model/ModelObserver.java create mode 100644 src/main/java/calculator/util/MessageConstants.java rename src/main/java/calculator/{service/NumberProcessService.java => util/NumberProcessUtil.java} (87%) create mode 100644 src/main/java/calculator/view/CalculatorView.java delete mode 100644 src/main/java/calculator/view/Console.java diff --git a/build.gradle b/build.gradle index 79504de..ae93bdf 100644 --- a/build.gradle +++ b/build.gradle @@ -11,10 +11,6 @@ java { } } -tasks.withType(JavaCompile) { - options.encoding = 'UTF-8' -} - repositories { mavenCentral() maven { url 'https://jitpack.io' } diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..656f2e6 --- /dev/null +++ b/gradle.properties @@ -0,0 +1 @@ +org.gradle.jvmargs=-Dfile.encoding=UTF-8 \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index eaf082f..a963097 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,4 @@ plugins { id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' } -rootProject.name = 'java-calculator' +rootProject.name = 'java-calculator' \ No newline at end of file diff --git a/src/main/java/calculator/Application.java b/src/main/java/calculator/Application.java index f58b633..c7f1611 100644 --- a/src/main/java/calculator/Application.java +++ b/src/main/java/calculator/Application.java @@ -1,7 +1,8 @@ package calculator; import calculator.controller.CalculatorController; -import calculator.view.Console; +import calculator.service.SeparatorRecognizeService; +import calculator.view.CalculatorView; public class Application { public static void main(String[] args) { @@ -9,11 +10,11 @@ public static void main(String[] args) { } public void run(){ - Console console = new Console(); - CalculatorController controller = new CalculatorController(console); + CalculatorView calculatorView = new CalculatorView(); + SeparatorRecognizeService separatorRecognizeService = new SeparatorRecognizeService(); + CalculatorController controller = new CalculatorController(calculatorView, separatorRecognizeService); controller.input(); - controller.process(); - controller.output(); + controller.calculate(); } } diff --git a/src/main/java/calculator/Model/CalculatorModel.java b/src/main/java/calculator/Model/CalculatorModel.java new file mode 100644 index 0000000..51fe54f --- /dev/null +++ b/src/main/java/calculator/Model/CalculatorModel.java @@ -0,0 +1,54 @@ +package calculator.Model; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class CalculatorModel { + private ModelObserver observer; + private int resultNum; + private String inputLine; + private List separatorList; + private String separatorCheckRegex; + private final Pattern customCheckPattern = Pattern.compile("//(.*?)\\\\n"); + + public CalculatorModel(String inputLine){ + this.resultNum = 0; + this.inputLine = inputLine; + this.separatorList = new ArrayList<>(List.of(":", ",")); + } + + public static CalculatorModel setInputLine(String inputLine) { + return new CalculatorModel(inputLine); + } + + public void stripInputLine(String regex) { + inputLine = inputLine.replaceFirst(regex, ""); + } + + public String[] getSplittedInputLine() { + return inputLine.split(separatorCheckRegex); + } + + public void setObserver(ModelObserver observer){ + this.observer = observer; + } + + public Matcher getCustomCheckMatcher(){ + return customCheckPattern.matcher(inputLine); + } + + public void addSeparator(String separator){ + separatorList.add(separator); + } + + public void generateSeparatorCheckRegex(){ + separatorCheckRegex = String.join("|", separatorList); + } + + public void setResultNum(int resultNum) { + this.resultNum = resultNum; + observer.onCalculateFinished(resultNum); + } +} diff --git a/src/main/java/calculator/Model/DetectResult.java b/src/main/java/calculator/Model/DetectResult.java deleted file mode 100644 index 2c8bd33..0000000 --- a/src/main/java/calculator/Model/DetectResult.java +++ /dev/null @@ -1,27 +0,0 @@ -package calculator.Model; - -public class DetectResult { - private int isDetected; - private int resultNum; - - public DetectResult(){ - this.isDetected = 0; - this.resultNum = 0; - } - - public int getResultNum(){ - return resultNum; - } - - public int getDetected(){ - return isDetected; - } - - public void setDetected(int num){ - this.isDetected = num; - } - - public void setResultNum(int resultNum) { - this.resultNum = resultNum; - } -} diff --git a/src/main/java/calculator/Model/ModelObserver.java b/src/main/java/calculator/Model/ModelObserver.java new file mode 100644 index 0000000..2b016a8 --- /dev/null +++ b/src/main/java/calculator/Model/ModelObserver.java @@ -0,0 +1,5 @@ +package calculator.Model; + +public interface ModelObserver { + void onCalculateFinished(int result); +} diff --git a/src/main/java/calculator/controller/CalculatorController.java b/src/main/java/calculator/controller/CalculatorController.java index 75cccab..a2f7d53 100644 --- a/src/main/java/calculator/controller/CalculatorController.java +++ b/src/main/java/calculator/controller/CalculatorController.java @@ -1,63 +1,30 @@ package calculator.controller; -import calculator.Model.DetectResult; -import calculator.service.NumberProcessService; import calculator.service.SeparatorRecognizeService; -import calculator.view.Console; +import calculator.view.CalculatorView; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; - -import static calculator.service.NumberProcessService.addAll; public class CalculatorController { - private Console console; + private CalculatorView calculatorView; private SeparatorRecognizeService separatorRecognizeService; - private static String rawArg; - private List numberList = new ArrayList<>(); - private int calculationResult; - private DetectResult[] detectResult = new DetectResult[2]; - private char temp; - public CalculatorController(Console console){ - this.console = console; - separatorRecognizeService = new SeparatorRecognizeService(); + public CalculatorController(CalculatorView calculatorView, SeparatorRecognizeService separatorRecognizeService){ + this.calculatorView = calculatorView; + this.separatorRecognizeService = separatorRecognizeService; } public void input(){ - console.print("덧셈할 문자열을 입력해 주세요."); - rawArg = console.read(); - if(Objects.equals(rawArg, ""))calculationResult=0; + String inputLine = calculatorView.read(); + separatorRecognizeService.setInput(inputLine); + separatorRecognizeService.addObserver(calculatorView); } - public void process(){ - int leng = rawArg.length(); - for(int i=0; i 1 && specialSeparator.length() == specialSeparatorDetected) { - specialSeparatorDetected = 0; - specialDetected = 1; - } else if (specialDetected==1) { - int result = NumberProcessService.stringToInt(specialClause); - specialDetected = 0; - specialClause = ""; - - detectResult.setDetected(1); - detectResult.setResultNum(result); - } - } else if (specialDetected==1) { - detectResult.setDetected(2); - specialClause += word; - if(len-1==index){ - int result = NumberProcessService.stringToInt(specialClause); - specialDetected = 0; - specialClause = ""; - - detectResult.setDetected(1); - detectResult.setResultNum(result); - } - } else if (word == '/') { - detectResult.setDetected(2); - specialState++; - } - else specialSeparatorDetected = 0; - - return detectResult; - case 1: - if (word == '/') specialState++; - else throw new IllegalArgumentException("Invalid string format"); - - detectResult.setDetected(2); - return detectResult; - case 2: - if (word == '\\') specialState++; - else specialSeparator += word; - - detectResult.setDetected(2); - return detectResult; - case 3: - if (word == 'n') specialState = 0; - else throw new IllegalArgumentException("Invalid string format"); - - detectResult.setDetected(2); - return detectResult; - } - detectResult.setDetected(0); - return detectResult; - } } diff --git a/src/main/java/calculator/util/MessageConstants.java b/src/main/java/calculator/util/MessageConstants.java new file mode 100644 index 0000000..3d58dff --- /dev/null +++ b/src/main/java/calculator/util/MessageConstants.java @@ -0,0 +1,16 @@ +package calculator.util; + +public enum MessageConstants { + INPUT_GUIDE("덧셈할 문자열을 입력해 주세요."), + RESULT_GUIDE("결과 : "); + + private final String message; + + MessageConstants(String message) { + this.message = message; + } + + public String getMessage() { + return this.message; + } +} diff --git a/src/main/java/calculator/service/NumberProcessService.java b/src/main/java/calculator/util/NumberProcessUtil.java similarity index 87% rename from src/main/java/calculator/service/NumberProcessService.java rename to src/main/java/calculator/util/NumberProcessUtil.java index 5151ebc..b8706f8 100644 --- a/src/main/java/calculator/service/NumberProcessService.java +++ b/src/main/java/calculator/util/NumberProcessUtil.java @@ -1,8 +1,8 @@ -package calculator.service; +package calculator.util; import java.util.List; -public class NumberProcessService { +public class NumberProcessUtil { public static int stringToInt(String arg){ if(!arg.matches("\\d+")) throw new IllegalArgumentException("Invalid number format"); return Integer.parseInt(arg); diff --git a/src/main/java/calculator/view/CalculatorView.java b/src/main/java/calculator/view/CalculatorView.java new file mode 100644 index 0000000..728af1e --- /dev/null +++ b/src/main/java/calculator/view/CalculatorView.java @@ -0,0 +1,17 @@ +package calculator.view; + +import calculator.Model.ModelObserver; +import calculator.util.MessageConstants; + +public class CalculatorView implements ModelObserver { + + public String read(){ + System.out.println(MessageConstants.INPUT_GUIDE.getMessage()); + return camp.nextstep.edu.missionutils.Console.readLine(); + } + + @Override + public void onCalculateFinished(int result){ + System.out.println(MessageConstants.RESULT_GUIDE.getMessage() + result); + } +} diff --git a/src/main/java/calculator/view/Console.java b/src/main/java/calculator/view/Console.java deleted file mode 100644 index 4567082..0000000 --- a/src/main/java/calculator/view/Console.java +++ /dev/null @@ -1,11 +0,0 @@ -package calculator.view; - -public class Console { - public String read(){ - return camp.nextstep.edu.missionutils.Console.readLine(); - } - - public void print(String arg){ - System.out.println(arg); - } -} diff --git a/src/test/java/calculator/ApplicationTest.java b/src/test/java/calculator/ApplicationTest.java index 93771fb..05d9053 100644 --- a/src/test/java/calculator/ApplicationTest.java +++ b/src/test/java/calculator/ApplicationTest.java @@ -24,6 +24,14 @@ class ApplicationTest extends NsTest { ); } + @Test + void 여러개_테스트(){ + assertSimpleTest(()-> { + run("1://;\\n1;2"); + assertThat(output()).contains("결과 : 4"); + }); + } + @Override public void runMain() { Application.main(new String[]{}); From 1e3b3a57f132b1a6944c1ccdd3a69930fe608222 Mon Sep 17 00:00:00 2001 From: yeunsuh Date: Fri, 14 Feb 2025 04:30:58 +0900 Subject: [PATCH 11/11] fix($main): NumberProcessUtil clarifying added arg == null according to feedback --- src/main/java/calculator/util/NumberProcessUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/calculator/util/NumberProcessUtil.java b/src/main/java/calculator/util/NumberProcessUtil.java index b8706f8..30c98f0 100644 --- a/src/main/java/calculator/util/NumberProcessUtil.java +++ b/src/main/java/calculator/util/NumberProcessUtil.java @@ -4,7 +4,7 @@ public class NumberProcessUtil { public static int stringToInt(String arg){ - if(!arg.matches("\\d+")) throw new IllegalArgumentException("Invalid number format"); + if(arg == null || !arg.matches("\\d+")) throw new IllegalArgumentException("Invalid number format"); return Integer.parseInt(arg); }