diff --git a/README.md b/README.md index bd90ef0..6016633 100644 --- a/README.md +++ b/README.md @@ -1 +1,13 @@ -# java-calculator-precourse \ No newline at end of file +# java-calculator-precourse + +# 기능 목록 + *MVC에 따라 구현해 기능목록 외의 커밋 존재 + +1. 콘솔 입출력 관리 : Console +2. 구분자 인식 기능 : SeparatorRecognizeService + - 기본 구분자 인식 + - 커스텀 구분자 저장 및 인식 +3. 수 변환 및 합산 기능 : NumberProcessService + - 수 변환 + - 트리거에 따라 저장된 변환 수 합산 +4. 메인 예외처리 기능 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 573580f..c7f1611 100644 --- a/src/main/java/calculator/Application.java +++ b/src/main/java/calculator/Application.java @@ -1,7 +1,20 @@ package calculator; +import calculator.controller.CalculatorController; +import calculator.service.SeparatorRecognizeService; +import calculator.view.CalculatorView; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + new Application().run(); + } + + public void run(){ + CalculatorView calculatorView = new CalculatorView(); + SeparatorRecognizeService separatorRecognizeService = new SeparatorRecognizeService(); + CalculatorController controller = new CalculatorController(calculatorView, separatorRecognizeService); + + controller.input(); + 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/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 new file mode 100644 index 0000000..a2f7d53 --- /dev/null +++ b/src/main/java/calculator/controller/CalculatorController.java @@ -0,0 +1,30 @@ +package calculator.controller; + +import calculator.service.SeparatorRecognizeService; +import calculator.view.CalculatorView; + + +public class CalculatorController { + + private CalculatorView calculatorView; + + private SeparatorRecognizeService separatorRecognizeService; + + + public CalculatorController(CalculatorView calculatorView, SeparatorRecognizeService separatorRecognizeService){ + this.calculatorView = calculatorView; + this.separatorRecognizeService = separatorRecognizeService; + } + + public void input(){ + String inputLine = calculatorView.read(); + separatorRecognizeService.setInput(inputLine); + separatorRecognizeService.addObserver(calculatorView); + } + + public void calculate(){ + separatorRecognizeService.specialDetect(); + separatorRecognizeService.normalDetect(); + } + +} diff --git a/src/main/java/calculator/service/SeparatorRecognizeService.java b/src/main/java/calculator/service/SeparatorRecognizeService.java new file mode 100644 index 0000000..f0cffb7 --- /dev/null +++ b/src/main/java/calculator/service/SeparatorRecognizeService.java @@ -0,0 +1,48 @@ +package calculator.service; + +import calculator.Model.CalculatorModel; +import calculator.Model.ModelObserver; +import calculator.util.NumberProcessUtil; + +import java.util.regex.Matcher; + +public class SeparatorRecognizeService { + + private CalculatorModel calculatorModel; + + public void setInput(String inputLine){ + calculatorModel = CalculatorModel.setInputLine(inputLine); + } + + public void addObserver(ModelObserver view){ + calculatorModel.setObserver(view); + } + + public void specialDetect(){ + Matcher customCheckMatch = calculatorModel.getCustomCheckMatcher(); + + //커스텀 구분자를 전부 추출 + while(customCheckMatch.find()){ + String extracted = customCheckMatch.group(1); + //구분자 목록에 커스텀 구분자 추가 + calculatorModel.addSeparator(extracted); + //입력받은 문자열에서 해당 부분 제거 + calculatorModel.stripInputLine("//" + extracted + "\\\\n"); + } + } + + public void normalDetect(){ + int tempNum = 0; + calculatorModel.generateSeparatorCheckRegex(); + + String[] splittedInputLine = calculatorModel.getSplittedInputLine(); + for(String i : splittedInputLine){ + tempNum += NumberProcessUtil.stringToInt(i); + } + + calculatorModel.setResultNum(tempNum); + } + + +} + 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/util/NumberProcessUtil.java b/src/main/java/calculator/util/NumberProcessUtil.java new file mode 100644 index 0000000..30c98f0 --- /dev/null +++ b/src/main/java/calculator/util/NumberProcessUtil.java @@ -0,0 +1,18 @@ +package calculator.util; + +import java.util.List; + +public class NumberProcessUtil { + public static int stringToInt(String arg){ + if(arg == null || !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(); + } +} 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/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[]{});