From d7d51cd8e0371084c9b56a92ec77c16dd21d56f0 Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Sat, 19 Oct 2024 19:24:02 +0900 Subject: [PATCH 01/25] =?UTF-8?q?style=20:=20README=20=EC=9A=94=EA=B5=AC?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 106 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bd90ef0247..1b86cb3377 100644 --- a/README.md +++ b/README.md @@ -1 +1,106 @@ -# java-calculator-precourse \ No newline at end of file +## 학습 목표 +- Git, GitHub, IDE 등 실제 개발을 위한 환경에 익숙해진다. +- 교육 분야에 맞는 프로그래밍 언어를 사용하여 간단한 문제를 해결한다. + + +# 프리코스 진행 방식 + +## 진행 방식 + +- 미션은 **과제 진행 요구 사항, 기능 요구 사항, 프로그래밍 요구 사항** 세 가지로 구성되어 있다. +- 세 개의 요구 사항을 만족하기 위해 노력한다. 특히 기능을 구현하기 전에 기능 목록을 만들고, 기능 단위로 커밋 하는 방식으로 진행한다. +- 기능 요구 사항에 기재되지 않은 내용은 스스로 판단하여 구현한다. +- 매주 진행할 미션은 화요일 오후 3시부터 확인할 수 있으며, 다음 주 월요일까지 구현을 완료하여 제출해야 한다. 제출은 일요일 오후 3시부터 가능하다. + - 정해진 시간을 지키지 않을 경우 미션을 제출하지 않은 것으로 간주한다. + - 종료 일시 이후에는 추가 푸시를 허용하지 않는다. + +--- + + + +## 미션 제출 방법 + +- 미션 구현을 완료한 후 GitHub을 통해 제출해야 한다. + - GitHub을 활용한 제출 방법은 [프리코스 과제 제출 문서](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 를 참고해 제출한다. +- GitHub에 미션을 제출한 후 [우아한테크코스 지원 플랫폼](https://apply.techcourse.co.kr) 에 접속하여 프리코스 과제를 제출한다. + - 자세한 방법은 [링크](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse#제출-가이드) 를 참고한다. + - 과제를 수행하면서 느낀 점, 배운 점, 많은 시간을 투자한 부분 등 자유롭게 작성한다. + +## 과제 제출 전 체크리스트 + +- 기능을 올바르게 구현했더라도 **요구 사항에 명시된 출력 형식**을 따르지 않으면 0점을 받게 된다. +- 기능 구현을 완료한 후 아래 가이드에 따라 모든 테스트가 성공적으로 실행되는지 확인한다. +- **테스트가 실패하면 점수가 0점**이 되므로 제출하기 전에 반드시 확인한다. + +## 테스트 실행 가이드 +- 터미널에서 `java -version`을 실행하여 Java 버전이 21인지 확인한다. Eclipse 또는 IntelliJ IDEA와 같은 IDE에서 Java 21로 실행되는지 확인한다. +- 터미널에서 Mac 또는 Linux 사용자의 경우 `./gradlew clean test` 명령을 실행하고, Windows 사용자의 경우 `gradlew.bat clean test`
+또는 .\gradlew.bat clean test 명령을 실행할 때 모든 테스트가 아래와 같이 통과하는지 확인한다. + +``` +BUILD SUCCESSFUL in 0s +``` + + + +
+ +# 문자열 덧셈 계산기 + +--- + +## 과제 진행 요구 사항 + +--- +- 미션은 [문자열 덧셈 계산기 저장소](https://github.com/woowacourse-precourse/java-calculator-7)를 포크하고 클론하는 것으로 시작한다. +- **기능을 구현하기 전 `README.md`에 구현할 기능 목록을 정리**해 추가한다. + - Git의 커밋 단위는 앞 단계에서 `README.md`에 정리한 기능 목록 단위로 추가한다. + - [AngularJS Git Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153)을 참고해 커밋 메시지를 작성한다. +- 자세한 과제 진행 방법은 프리코스 진행 가이드 문서를 참고한다. + + + +## 기능 요구 사항 +입력한 문자열에서 숫자를 추출하여 더하는 계산기를 구현한다. +- 쉼표(,) 또는 콜론(:)을 구분자로 가지는 문자열을 전달하는 경우 구분자를 기준으로 분리한 각 숫자의 합을 반환한다. + - 예: "" => 0, "1,2" => 3, "1,2,3" => 6, "1,2:3" => 6 +- 앞의 기본 구분자(쉼표, 콜론) 외에 커스텀 구분자를 지정할 수 있다. 커스텀 구분자는 문자열 앞부분의 "//"와 "\n" 사이에 위치하는 문자를 커스텀 구분자로 사용한다. + - 예를 들어 "//;\n1;2;3"과 같이 값을 입력할 경우 커스텀 구분자는 세미콜론(;)이며, 결과 값은 6이 반환되어야 한다. +- 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`을 발생시킨 후 애플리케이션은 종료되어야 한다. + +### 입출력 요구 사항 +#### 입력 +- 구분자와 양수로 구성된 문자열 + +#### 출력 +- 덧셈 결과 +``` +결과 : 6 +``` +#### 실행 결과 예시 +``` +덧셈할 문자열을 입력해 주세요. +1,2:3 +결과 : 6 +``` + + +## 프로그래밍 요구 사항 + +--- + +- JDK 21 버전에서 실행 가능해야 한다. +- 프로그램을 실행하는 시작점은 `Application`의 `main()`이다. +- build.gradle 파일은 변경할 수 없으며, **제공된 라이브러리 이외의 외부 라이브러리는 사용하지 않는다.** +- 프로그램 종료 시 System.exit()를 호출하지 않는다. +- 프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 등의 이름을 바꾸거나 이동하지 않는다. +- 자바 코드 컨벤션을 지키면서 프로그래밍한다. + - 기본적으로 Java Style Guide를 원칙으로 한다. + +### 라이브러리 + +- `camp.nextstep.edu.missionutils`에서 제공하는 Console API를 사용하여 구현해야 한다. + - 사용자가 입력하는 값은 `camp.nextstep.edu.missionutils.Console`의 `readLine()`을 활용한다. + +
+ From 6df25876834a9705156d3f64546956bf17b0cd7e Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Sat, 19 Oct 2024 20:48:49 +0900 Subject: [PATCH 02/25] =?UTF-8?q?style=20:=20README=20=EA=B8=B0=EB=8A=A5?= =?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 --- README.md | 45 +++++++++++++++++++++++ src/main/java/calculator/Application.java | 2 +- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1b86cb3377..545bfcde3b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,48 @@ +# 기능목록 + +## 도메인 + +입력받은 문자열을 구분자를 이용해 나눈다. + - [] 구분자는 기본적으로 쉼표(,)와 콜론(:)이 포함되어야 한다. + - [] 문자열 앞부분의 //와 \n사이에 위치하는 문자를 커스텀 구분자로 추가해야한다. + - [] 커스텀 구분자는 숫자의 특성상 부호를 표기하는 +, -와 소숫점을 표현하는 .은 잘못된 것으로 처리하여 예외를 던진다. + - [] 구분자라는 특성상 커스텀 구분자의 속하는 문자열의 길이가 2이상일 경우 각각 하나의 문자를 커스텀 구분자로 사용한다. + - (예시) "//n;^$\n1;2^3" 의 경우 ;^$라는 길이 3짜리 구분자를 사용하는 것이 아닌 ; ^ $ 이 셋을 각각 하나의 구분자로 사용한다. + - [] 기본 구분자 쉼표(,)와 콜론(:) 그리고 추가된 커스텀 문자를 제외한 문자열이 나타난 경우 잘못된 것으로 처리하여 예외를 던진다. + - [] 커스텀 구분자를 등록한 이후 숫자와 구분자가 있어야할 부분에서 숫자와 구분자가 번갈아 등장하지 않고 연속으로 등장한 경우 예외를 던진다. + +
+ + 숫자의 제한조건은 양수라는 것 외에는 없다. 따라서 확장성을 위하여 문자를 숫자로 변환하는 객체를 인터페이스로 추상화한다. + - [] 나눠진 문자열을 숫자로 변환한다. + - [] 변환한 숫자들을 더하여 문자로 반환한다. + +## 출력 + - [] 프로그램 실행시 안내메시지를 출력한다. + - [] 결과를 출력한다. + +## 테스트 + - [] 기본 구분자를 통해 문자열이 잘 나누어지는지 확인한다. + - [] 커스텀 구분자가 추가된 경우 문자열이 잘 나누어지는지 확인한다. + - [] 여러개의 커스텀 구분자가 추가된 경우도 확인한다. + - [] +, -, .이 커스텀 구분자로 포함될 경우 예외를 던진다. + - [] 구분자가 연속으로 등장한 경우 예외를 던진다. + + + + + + + + + + + + +--- + + + ## 학습 목표 - Git, GitHub, IDE 등 실제 개발을 위한 환경에 익숙해진다. - 교육 분야에 맞는 프로그래밍 언어를 사용하여 간단한 문제를 해결한다. diff --git a/src/main/java/calculator/Application.java b/src/main/java/calculator/Application.java index 573580fb40..5530f7161c 100644 --- a/src/main/java/calculator/Application.java +++ b/src/main/java/calculator/Application.java @@ -2,6 +2,6 @@ public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + } } From 1b486a6754c2be5408bd950aeb54317c5e482078 Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Sun, 20 Oct 2024 00:24:23 +0900 Subject: [PATCH 03/25] =?UTF-8?q?feat=20:=20=EB=AC=B8=EC=9E=90=EC=97=B4?= =?UTF-8?q?=EC=9D=84=20=EA=B5=AC=EB=B6=84=ED=95=98=EB=8A=94=20StringSplitt?= =?UTF-8?q?er=EC=99=80=20DefaultStringSplitter=20=EA=B0=9D=EC=B2=B4=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 --- .../java/calculator/DefaultStringSplitter.java | 15 +++++++++++++++ src/main/java/calculator/StringSplitter.java | 9 +++++++++ 2 files changed, 24 insertions(+) create mode 100644 src/main/java/calculator/DefaultStringSplitter.java create mode 100644 src/main/java/calculator/StringSplitter.java diff --git a/src/main/java/calculator/DefaultStringSplitter.java b/src/main/java/calculator/DefaultStringSplitter.java new file mode 100644 index 0000000000..67d73d11dd --- /dev/null +++ b/src/main/java/calculator/DefaultStringSplitter.java @@ -0,0 +1,15 @@ +package calculator; + +import java.util.Arrays; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class DefaultStringSplitter implements StringSplitter{ + + @Override + public List splitString (String defaultDelimiter, String str) { + String[] split = str.split(defaultDelimiter); + return Arrays.asList(split); + } +} diff --git a/src/main/java/calculator/StringSplitter.java b/src/main/java/calculator/StringSplitter.java new file mode 100644 index 0000000000..6cfbd561b9 --- /dev/null +++ b/src/main/java/calculator/StringSplitter.java @@ -0,0 +1,9 @@ +package calculator; + +import java.util.List; + +public interface StringSplitter { + + List splitString(String defaultDelimiter, String str); + +} From 23c539d2827ad65322248957cf38dee208a6f924 Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Sun, 20 Oct 2024 00:32:01 +0900 Subject: [PATCH 04/25] =?UTF-8?q?refactor=20:=20StringSplitter=EC=9D=98=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=EC=9D=98=20=EC=9D=B8=EC=9E=90?= =?UTF-8?q?=EB=A5=BC=201=EA=B0=9C=EB=A1=9C=20=EC=88=98=EC=A0=95=ED=95=98?= =?UTF-8?q?=EA=B3=A0=20=EB=A9=A4=EB=B2=84=EB=B3=80=EC=88=98=EB=A1=9C=20?= =?UTF-8?q?=EB=A7=8C=EB=93=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/DefaultStringSplitter.java | 4 ++-- src/main/java/calculator/StringSplitter.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/calculator/DefaultStringSplitter.java b/src/main/java/calculator/DefaultStringSplitter.java index 67d73d11dd..086e55fa3b 100644 --- a/src/main/java/calculator/DefaultStringSplitter.java +++ b/src/main/java/calculator/DefaultStringSplitter.java @@ -8,8 +8,8 @@ public class DefaultStringSplitter implements StringSplitter{ @Override - public List splitString (String defaultDelimiter, String str) { - String[] split = str.split(defaultDelimiter); + public List splitString (String str) { + String[] split = str.split(DEFAULT_DELIMITERS); return Arrays.asList(split); } } diff --git a/src/main/java/calculator/StringSplitter.java b/src/main/java/calculator/StringSplitter.java index 6cfbd561b9..eb7efa1cf9 100644 --- a/src/main/java/calculator/StringSplitter.java +++ b/src/main/java/calculator/StringSplitter.java @@ -4,6 +4,6 @@ public interface StringSplitter { - List splitString(String defaultDelimiter, String str); - + static final String DEFAULT_DELIMITERS = ",:"; + List splitString(String str); } From f7b1c47e44a4ef427f319cc157caeab9740302aa Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Sun, 20 Oct 2024 01:28:57 +0900 Subject: [PATCH 05/25] =?UTF-8?q?feat=20:=20CustomStringSplitter=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/calculator/CustomStringSplitter.java | 69 +++++++++++++++++++ .../calculator/DefaultStringSplitter.java | 4 +- src/main/java/calculator/StringSplitter.java | 3 +- 3 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 src/main/java/calculator/CustomStringSplitter.java diff --git a/src/main/java/calculator/CustomStringSplitter.java b/src/main/java/calculator/CustomStringSplitter.java new file mode 100644 index 0000000000..f7b305dd37 --- /dev/null +++ b/src/main/java/calculator/CustomStringSplitter.java @@ -0,0 +1,69 @@ +package calculator; + +import java.util.Arrays; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class CustomStringSplitter implements StringSplitter{ + + private static final String CUSTOM_DELIMITER_HEADER = "\\/\\/"; + private static final String CUSTOM_DELIMITER_FOOTER = "\\\n"; + + @Override + public List splitString (String str) { + String patternRegex = generatePatternRegex(); + Pattern pattern = Pattern.compile(patternRegex); + Matcher matcher = pattern.matcher(str); + + boolean isFound = matcher.find(); + validateMatcher(isFound, str); + + String customDelimiter = matcher.group(1); + validateCustomDelimiter(customDelimiter, str); + String conjoinedDelimiter = DEFAULT_DELIMITER + customDelimiter; + + String numbersAndDelimiter = matcher.group(2); + String[] split = numbersAndDelimiter.split(conjoinedDelimiter); + validateContinuousDelimiter(split, str); + + return Arrays.asList(split); + } + + private String generatePatternRegex() { + StringBuilder delimiterBuilder = new StringBuilder(); + + delimiterBuilder.append("^") + .append(CUSTOM_DELIMITER_HEADER) + .append("(.+)") + .append(CUSTOM_DELIMITER_FOOTER) + .append("(.+)"); + + return delimiterBuilder.toString(); + } + + private void validateMatcher(boolean isFound, String str) { + boolean notFound = !isFound; + if (notFound) { + throw new IllegalArgumentException(str); + } + } + + private void validateCustomDelimiter(String customDelimiter, String str) { + boolean hasInvalidDelimiter = Arrays.stream(customDelimiter.split("")) + .anyMatch(s -> INVALID_DELIMITER.contains(s)); + + if (hasInvalidDelimiter) { + throw new IllegalArgumentException(str); + } + } + + private void validateContinuousDelimiter(String[] split, String str) { + boolean hasContinuousDelimiter = Arrays.stream(split) + .anyMatch(s -> s.isEmpty()); + + if (hasContinuousDelimiter) { + throw new IllegalArgumentException(str); + } + } +} diff --git a/src/main/java/calculator/DefaultStringSplitter.java b/src/main/java/calculator/DefaultStringSplitter.java index 086e55fa3b..640ed961b2 100644 --- a/src/main/java/calculator/DefaultStringSplitter.java +++ b/src/main/java/calculator/DefaultStringSplitter.java @@ -2,14 +2,12 @@ import java.util.Arrays; import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; public class DefaultStringSplitter implements StringSplitter{ @Override public List splitString (String str) { - String[] split = str.split(DEFAULT_DELIMITERS); + String[] split = str.split(DEFAULT_DELIMITER); return Arrays.asList(split); } } diff --git a/src/main/java/calculator/StringSplitter.java b/src/main/java/calculator/StringSplitter.java index eb7efa1cf9..83141e5853 100644 --- a/src/main/java/calculator/StringSplitter.java +++ b/src/main/java/calculator/StringSplitter.java @@ -4,6 +4,7 @@ public interface StringSplitter { - static final String DEFAULT_DELIMITERS = ",:"; + static final String DEFAULT_DELIMITER = ",:"; + static final String INVALID_DELIMITER = "-+."; List splitString(String str); } From d33c78e2bfd5dc92522970f46a4f01b3d067b492 Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Sun, 20 Oct 2024 01:40:42 +0900 Subject: [PATCH 06/25] =?UTF-8?q?test=20:=20DefaultStringSplitter=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=A9=94=EC=86=8C=EB=93=9C=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=8B=A4=ED=8C=A8=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/calculator/CustomStringSplitterTest.java | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/test/java/calculator/CustomStringSplitterTest.java diff --git a/src/test/java/calculator/CustomStringSplitterTest.java b/src/test/java/calculator/CustomStringSplitterTest.java new file mode 100644 index 0000000000..1192a516b0 --- /dev/null +++ b/src/test/java/calculator/CustomStringSplitterTest.java @@ -0,0 +1,2 @@ +package calculator;public class CustomStringSplitterTest { +} From 3e98caac0276708253186a07dff6d0ce657eb156 Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Sun, 20 Oct 2024 21:37:55 +0900 Subject: [PATCH 07/25] =?UTF-8?q?refactor=20:=20DefaultStringSplitter?= =?UTF-8?q?=EC=9D=98=EB=AC=B8=EC=9E=90=EC=97=B4=20=EB=82=98=EB=88=84?= =?UTF-8?q?=EB=8A=94=20=EB=A9=94=EC=86=8C=EB=93=9C=20StringTokenizer?= =?UTF-8?q?=EB=A5=BC=20=EC=9D=B4=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../calculator/DefaultStringSplitter.java | 10 +++++-- .../calculator/CustomStringSplitterTest.java | 2 -- .../calculator/DefaultStringSplitterTest.java | 29 +++++++++++++++++++ 4 files changed, 38 insertions(+), 5 deletions(-) delete mode 100644 src/test/java/calculator/CustomStringSplitterTest.java create mode 100644 src/test/java/calculator/DefaultStringSplitterTest.java diff --git a/README.md b/README.md index 545bfcde3b..bcd6242402 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ - [] 문자열 앞부분의 //와 \n사이에 위치하는 문자를 커스텀 구분자로 추가해야한다. - [] 커스텀 구분자는 숫자의 특성상 부호를 표기하는 +, -와 소숫점을 표현하는 .은 잘못된 것으로 처리하여 예외를 던진다. - [] 구분자라는 특성상 커스텀 구분자의 속하는 문자열의 길이가 2이상일 경우 각각 하나의 문자를 커스텀 구분자로 사용한다. - - (예시) "//n;^$\n1;2^3" 의 경우 ;^$라는 길이 3짜리 구분자를 사용하는 것이 아닌 ; ^ $ 이 셋을 각각 하나의 구분자로 사용한다. + - (예시) "//;^$\n1;2^3" 의 경우 ;^$라는 길이 3짜리 구분자를 사용하는 것이 아닌 ; ^ $ 이 셋을 각각 하나의 구분자로 사용한다. - [] 기본 구분자 쉼표(,)와 콜론(:) 그리고 추가된 커스텀 문자를 제외한 문자열이 나타난 경우 잘못된 것으로 처리하여 예외를 던진다. - [] 커스텀 구분자를 등록한 이후 숫자와 구분자가 있어야할 부분에서 숫자와 구분자가 번갈아 등장하지 않고 연속으로 등장한 경우 예외를 던진다. diff --git a/src/main/java/calculator/DefaultStringSplitter.java b/src/main/java/calculator/DefaultStringSplitter.java index 640ed961b2..8542d4c13e 100644 --- a/src/main/java/calculator/DefaultStringSplitter.java +++ b/src/main/java/calculator/DefaultStringSplitter.java @@ -1,13 +1,19 @@ package calculator; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.StringTokenizer; public class DefaultStringSplitter implements StringSplitter{ @Override public List splitString (String str) { - String[] split = str.split(DEFAULT_DELIMITER); - return Arrays.asList(split); + StringTokenizer stringTokenizer = new StringTokenizer(str, DEFAULT_DELIMITER); + List strings = new ArrayList<>(); + while (stringTokenizer.hasMoreTokens()) { + strings.add(stringTokenizer.nextToken()); + }; + return strings; } } diff --git a/src/test/java/calculator/CustomStringSplitterTest.java b/src/test/java/calculator/CustomStringSplitterTest.java deleted file mode 100644 index 1192a516b0..0000000000 --- a/src/test/java/calculator/CustomStringSplitterTest.java +++ /dev/null @@ -1,2 +0,0 @@ -package calculator;public class CustomStringSplitterTest { -} diff --git a/src/test/java/calculator/DefaultStringSplitterTest.java b/src/test/java/calculator/DefaultStringSplitterTest.java new file mode 100644 index 0000000000..df23e00a0b --- /dev/null +++ b/src/test/java/calculator/DefaultStringSplitterTest.java @@ -0,0 +1,29 @@ +package calculator; + + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import java.util.List; + +public class DefaultStringSplitterTest { + + StringSplitter stringSplitter = new DefaultStringSplitter(); + + @ParameterizedTest + @CsvSource({ + "'6:3:2', '6', '3', '2'", + "'12,34,56', '12', '34', '56'", + "'100:200,300', '100', '200', '300'", + }) + void 다양한_구분자_문자열_나누기(String input, String expected1, String expected2, String expected3) { + List strings = stringSplitter.splitString(input); + + Assertions.assertTrue(strings.contains(expected1)); + Assertions.assertTrue(strings.contains(expected2)); + Assertions.assertTrue(strings.contains(expected3)); + Assertions.assertTrue(strings.size() == 3); + } +} From 2197cd6a6b3409316c8db62df9cae30df6613670 Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Mon, 21 Oct 2024 00:45:12 +0900 Subject: [PATCH 08/25] =?UTF-8?q?refactor=20:=20CustomStringSplitter?= =?UTF-8?q?=EC=9D=98=20=EB=AC=B8=EC=9E=90=EC=97=B4=20=EB=82=98=EB=88=84?= =?UTF-8?q?=EB=8A=94=20=EB=A9=94=EC=86=8C=EB=93=9C=20StringTokenizer?= =?UTF-8?q?=EB=A5=BC=20=EC=9D=B4=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/calculator/CustomStringSplitter.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/main/java/calculator/CustomStringSplitter.java b/src/main/java/calculator/CustomStringSplitter.java index f7b305dd37..c60636684b 100644 --- a/src/main/java/calculator/CustomStringSplitter.java +++ b/src/main/java/calculator/CustomStringSplitter.java @@ -1,7 +1,9 @@ package calculator; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -24,10 +26,10 @@ public List splitString (String str) { String conjoinedDelimiter = DEFAULT_DELIMITER + customDelimiter; String numbersAndDelimiter = matcher.group(2); - String[] split = numbersAndDelimiter.split(conjoinedDelimiter); - validateContinuousDelimiter(split, str); + List result = splitSubstring(conjoinedDelimiter, numbersAndDelimiter); + validateContinuousDelimiter(result, str); - return Arrays.asList(split); + return result; } private String generatePatternRegex() { @@ -57,9 +59,19 @@ private void validateCustomDelimiter(String customDelimiter, String str) { throw new IllegalArgumentException(str); } } + + private List splitSubstring(String conjoinedDelimiter, String numbersAndDelimiter) { + StringTokenizer stringTokenizer = new StringTokenizer(numbersAndDelimiter, conjoinedDelimiter); + + List strings = new ArrayList<>(); + while (stringTokenizer.hasMoreTokens()) { + strings.add(stringTokenizer.nextToken()); + } + return strings; + } - private void validateContinuousDelimiter(String[] split, String str) { - boolean hasContinuousDelimiter = Arrays.stream(split) + private void validateContinuousDelimiter(List split, String str) { + boolean hasContinuousDelimiter = split.stream() .anyMatch(s -> s.isEmpty()); if (hasContinuousDelimiter) { From 8adbdd073d8f5fb18b7a913820a90b772e467731 Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Mon, 21 Oct 2024 02:10:30 +0900 Subject: [PATCH 09/25] =?UTF-8?q?test=20:=20CustomStringSplitter=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=BD=94=EB=93=9C=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 --- .../calculator/CustomStringSplitterTest.java | 52 +++++++++++++++++++ .../calculator/DefaultStringSplitterTest.java | 2 +- 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/test/java/calculator/CustomStringSplitterTest.java diff --git a/src/test/java/calculator/CustomStringSplitterTest.java b/src/test/java/calculator/CustomStringSplitterTest.java new file mode 100644 index 0000000000..6ee83f3715 --- /dev/null +++ b/src/test/java/calculator/CustomStringSplitterTest.java @@ -0,0 +1,52 @@ +package calculator; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import java.util.List; + +class CustomStringSplitterTest { + + StringSplitter stringSplitter = new CustomStringSplitter(); + + @ParameterizedTest + @CsvSource({ + "'//*\n2*23*4', '2', '23', '4'", + "'//i\n2i23i4', '2', '23', '4'" + }) + void 커스텀_문자열_나누기(String input, String expected1, String expected2, String expected3) { + List strings = stringSplitter.splitString(input); + + Assertions.assertTrue(strings.contains(expected1)); + Assertions.assertTrue(strings.contains(expected2)); + Assertions.assertTrue(strings.contains(expected3)); + Assertions.assertTrue(strings.size() == 3); + } + + @ParameterizedTest + @CsvSource({ + "'//*\n0*123,456:7890', '0', '123', '456', '7890'", + "'//**&^%\n0*123&456^7890', '0', '123', '456', '7890'" + }) + void 커스텀_문자열_나누기_기본_구분자_혼합(String input, String expected1, String expected2, String expected3, String expected4) { + List strings = stringSplitter.splitString(input); + + Assertions.assertTrue(strings.contains(expected1)); + Assertions.assertTrue(strings.contains(expected2)); + Assertions.assertTrue(strings.contains(expected3)); + Assertions.assertTrue(strings.contains(expected4)); + Assertions.assertTrue(strings.size() == 4); + } + + @ParameterizedTest + @CsvSource({ + "'//-\n12:34", + "'//.\n12:34", + "'//*-\n12:34" + }) + void 허용되지_않는_커스텀_구분자(String input) { + Assertions.assertThrows(IllegalArgumentException.class, () -> stringSplitter.splitString(input)); + } +} \ No newline at end of file diff --git a/src/test/java/calculator/DefaultStringSplitterTest.java b/src/test/java/calculator/DefaultStringSplitterTest.java index df23e00a0b..75392a9b2b 100644 --- a/src/test/java/calculator/DefaultStringSplitterTest.java +++ b/src/test/java/calculator/DefaultStringSplitterTest.java @@ -18,7 +18,7 @@ public class DefaultStringSplitterTest { "'12,34,56', '12', '34', '56'", "'100:200,300', '100', '200', '300'", }) - void 다양한_구분자_문자열_나누기(String input, String expected1, String expected2, String expected3) { + void 기본_문자열_나누기(String input, String expected1, String expected2, String expected3) { List strings = stringSplitter.splitString(input); Assertions.assertTrue(strings.contains(expected1)); From 6ad9d6ff3cd7edbec31fcafcba1902ac9b186ce7 Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Mon, 21 Oct 2024 02:16:36 +0900 Subject: [PATCH 10/25] =?UTF-8?q?refactor:=20INVALID=5FDELIMITER=20+-.?= =?UTF-8?q?=EC=97=90=EC=84=9C=20-.=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/StringSplitter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/calculator/StringSplitter.java b/src/main/java/calculator/StringSplitter.java index 83141e5853..785065014c 100644 --- a/src/main/java/calculator/StringSplitter.java +++ b/src/main/java/calculator/StringSplitter.java @@ -5,6 +5,6 @@ public interface StringSplitter { static final String DEFAULT_DELIMITER = ",:"; - static final String INVALID_DELIMITER = "-+."; + static final String INVALID_DELIMITER = "-."; List splitString(String str); } From a69c23d57882e50f917d7814335cbb6dd22ddd38 Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Mon, 21 Oct 2024 18:04:38 +0900 Subject: [PATCH 11/25] =?UTF-8?q?feat=20:=20SumCalculator=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=B6=94=EA=B0=80=20=EB=AC=B8=EC=9E=90=EC=97=B4=20?= =?UTF-8?q?=EC=A0=84=ED=99=98=20=ED=9B=84=20=EA=B3=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calculator/DefaultStringSplitter.java | 2 +- src/main/java/calculator/SumCalculator.java | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 src/main/java/calculator/SumCalculator.java diff --git a/src/main/java/calculator/DefaultStringSplitter.java b/src/main/java/calculator/DefaultStringSplitter.java index 8542d4c13e..29a4f9ad18 100644 --- a/src/main/java/calculator/DefaultStringSplitter.java +++ b/src/main/java/calculator/DefaultStringSplitter.java @@ -13,7 +13,7 @@ public List splitString (String str) { List strings = new ArrayList<>(); while (stringTokenizer.hasMoreTokens()) { strings.add(stringTokenizer.nextToken()); - }; + } return strings; } } diff --git a/src/main/java/calculator/SumCalculator.java b/src/main/java/calculator/SumCalculator.java new file mode 100644 index 0000000000..816ec5611b --- /dev/null +++ b/src/main/java/calculator/SumCalculator.java @@ -0,0 +1,31 @@ +package calculator; + +import java.math.BigDecimal; +import java.util.List; + +public class SumCalculator { + + private final List strings; + + public SumCalculator(List strings) { + this.strings = strings; + } + + public String calculateSum() { + BigDecimal sum = strings.stream() + .map(str -> convertToBigDecimal(str)) + .reduce(new BigDecimal("0"), (o1, o2) -> o1.add(o2)); + + return sum.toString(); + } + + private BigDecimal convertToBigDecimal(String str) { + if (str.equals("0")) { + throw new IllegalArgumentException(strings.toString()); + } + if (!str.matches("^[+]?[0-9]+")) { + throw new IllegalArgumentException(strings.toString()); + } + return new BigDecimal(str); + } +} From bf5c9089a688d3c700a178ce4094106558506d3e Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Mon, 21 Oct 2024 19:32:08 +0900 Subject: [PATCH 12/25] =?UTF-8?q?refactor=20:=20StringSplitter=EC=9D=98=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20canSupport=EC=B6=94,=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=EC=B2=B4=EB=93=A4=20canSupport=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/calculator/CustomStringSplitter.java | 25 +++++++++++-------- .../calculator/DefaultStringSplitter.java | 10 ++++++++ src/main/java/calculator/StringSplitter.java | 3 +++ 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/main/java/calculator/CustomStringSplitter.java b/src/main/java/calculator/CustomStringSplitter.java index c60636684b..9e26f97bb6 100644 --- a/src/main/java/calculator/CustomStringSplitter.java +++ b/src/main/java/calculator/CustomStringSplitter.java @@ -12,14 +12,26 @@ public class CustomStringSplitter implements StringSplitter{ private static final String CUSTOM_DELIMITER_HEADER = "\\/\\/"; private static final String CUSTOM_DELIMITER_FOOTER = "\\\n"; + @Override - public List splitString (String str) { + public boolean canSupport(String str) { String patternRegex = generatePatternRegex(); Pattern pattern = Pattern.compile(patternRegex); Matcher matcher = pattern.matcher(str); + boolean isFound = matcher.matches(); - boolean isFound = matcher.find(); - validateMatcher(isFound, str); + if (isFound) { + return true; + } + return false; + } + + @Override + public List splitString (String str) { + String patternRegex = generatePatternRegex(); + Pattern pattern = Pattern.compile(patternRegex); + Matcher matcher = pattern.matcher(str); + matcher.matches(); String customDelimiter = matcher.group(1); validateCustomDelimiter(customDelimiter, str); @@ -43,13 +55,6 @@ private String generatePatternRegex() { return delimiterBuilder.toString(); } - - private void validateMatcher(boolean isFound, String str) { - boolean notFound = !isFound; - if (notFound) { - throw new IllegalArgumentException(str); - } - } private void validateCustomDelimiter(String customDelimiter, String str) { boolean hasInvalidDelimiter = Arrays.stream(customDelimiter.split("")) diff --git a/src/main/java/calculator/DefaultStringSplitter.java b/src/main/java/calculator/DefaultStringSplitter.java index 29a4f9ad18..b7c5e1f0f9 100644 --- a/src/main/java/calculator/DefaultStringSplitter.java +++ b/src/main/java/calculator/DefaultStringSplitter.java @@ -4,9 +4,19 @@ import java.util.Arrays; import java.util.List; import java.util.StringTokenizer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class DefaultStringSplitter implements StringSplitter{ + + @Override + public boolean canSupport(String str) { + Pattern pattern = Pattern.compile("^[0-9]+([" + DEFAULT_DELIMITER + "][0-9]+)?"); + Matcher matcher = pattern.matcher(str); + return matcher.matches(); + } + @Override public List splitString (String str) { StringTokenizer stringTokenizer = new StringTokenizer(str, DEFAULT_DELIMITER); diff --git a/src/main/java/calculator/StringSplitter.java b/src/main/java/calculator/StringSplitter.java index 785065014c..ebb7250fce 100644 --- a/src/main/java/calculator/StringSplitter.java +++ b/src/main/java/calculator/StringSplitter.java @@ -6,5 +6,8 @@ public interface StringSplitter { static final String DEFAULT_DELIMITER = ",:"; static final String INVALID_DELIMITER = "-."; + + boolean canSupport(String str); List splitString(String str); + } From d2e1359e06627c53046f90624dbbf5def876336f Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Mon, 21 Oct 2024 19:35:46 +0900 Subject: [PATCH 13/25] =?UTF-8?q?test=20:=20=EB=82=98=EB=88=84=EC=96=B4?= =?UTF-8?q?=EC=A7=84=20=ED=81=AC=EA=B8=B0=EA=B0=80=201=EC=9D=B8=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/calculator/CustomStringSplitterTest.java | 13 ++++++++++++- .../java/calculator/DefaultStringSplitterTest.java | 12 ++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/test/java/calculator/CustomStringSplitterTest.java b/src/test/java/calculator/CustomStringSplitterTest.java index 6ee83f3715..6a3a3e9fc6 100644 --- a/src/test/java/calculator/CustomStringSplitterTest.java +++ b/src/test/java/calculator/CustomStringSplitterTest.java @@ -10,7 +10,6 @@ class CustomStringSplitterTest { StringSplitter stringSplitter = new CustomStringSplitter(); - @ParameterizedTest @CsvSource({ "'//*\n2*23*4', '2', '23', '4'", @@ -40,6 +39,18 @@ class CustomStringSplitterTest { Assertions.assertTrue(strings.size() == 4); } + @ParameterizedTest + @CsvSource({ + "'//*\n1', '1'", + "'//i\n2345678590', '2345678590'" + }) + void 나누어진_크기가_1인_문자열(String input, String expected1) { + List strings = stringSplitter.splitString(input); + + Assertions.assertTrue(strings.contains(expected1)); + Assertions.assertTrue(strings.size() == 1); + } + @ParameterizedTest @CsvSource({ "'//-\n12:34", diff --git a/src/test/java/calculator/DefaultStringSplitterTest.java b/src/test/java/calculator/DefaultStringSplitterTest.java index 75392a9b2b..e37fb09b70 100644 --- a/src/test/java/calculator/DefaultStringSplitterTest.java +++ b/src/test/java/calculator/DefaultStringSplitterTest.java @@ -26,4 +26,16 @@ public class DefaultStringSplitterTest { Assertions.assertTrue(strings.contains(expected3)); Assertions.assertTrue(strings.size() == 3); } + + @ParameterizedTest + @CsvSource({ + "'1', '1'", + "'234567890', '234567890'" + }) + void 나누어진_크기가_1인_문자열(String input, String expected1) { + List strings = stringSplitter.splitString(input); + + Assertions.assertTrue(strings.contains(expected1)); + Assertions.assertTrue(strings.size() == 1); + } } From af791a1598adc24f909fe14cce7fedb2a21a5182 Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Mon, 21 Oct 2024 19:52:51 +0900 Subject: [PATCH 14/25] =?UTF-8?q?refactor=20:=20=ED=97=88=EC=9A=A9?= =?UTF-8?q?=EB=90=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=BB=A4=EC=8A=A4?= =?UTF-8?q?=ED=85=80=EA=B5=AC=EB=B6=84=EC=9E=902=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calculator/CustomStringSplitterTest.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/test/java/calculator/CustomStringSplitterTest.java b/src/test/java/calculator/CustomStringSplitterTest.java index 6a3a3e9fc6..e30c16966b 100644 --- a/src/test/java/calculator/CustomStringSplitterTest.java +++ b/src/test/java/calculator/CustomStringSplitterTest.java @@ -45,6 +45,7 @@ class CustomStringSplitterTest { "'//i\n2345678590', '2345678590'" }) void 나누어진_크기가_1인_문자열(String input, String expected1) { + System.out.println(input); List strings = stringSplitter.splitString(input); Assertions.assertTrue(strings.contains(expected1)); @@ -53,9 +54,20 @@ class CustomStringSplitterTest { @ParameterizedTest @CsvSource({ - "'//-\n12:34", - "'//.\n12:34", - "'//*-\n12:34" + "'//-\n12:34'", + "'//.\n12:34'", + "'//*-\n12:34'" + }) + void 허용되지_않는_커스텀_구분자2(String input) { + System.out.println(input); + Assertions.assertTrue(stringSplitter.canSupport(input)); + } + + @ParameterizedTest + @CsvSource({ + "'//-\n12:34'", + "'//.\n12:34'", + "'//*-\n12:34'" }) void 허용되지_않는_커스텀_구분자(String input) { Assertions.assertThrows(IllegalArgumentException.class, () -> stringSplitter.splitString(input)); From ca48bca1214993c19c4df2c73a9e311da0bf4691 Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Mon, 21 Oct 2024 19:53:05 +0900 Subject: [PATCH 15/25] =?UTF-8?q?refactor=20:=20=ED=97=88=EC=9A=A9?= =?UTF-8?q?=EB=90=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EA=B5=AC=EB=B6=84?= =?UTF-8?q?=EC=9E=90=EC=97=90=20+=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/StringSplitter.java | 2 +- .../java/calculator/CustomStringSplitterTest.java | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/calculator/StringSplitter.java b/src/main/java/calculator/StringSplitter.java index ebb7250fce..00cad0174e 100644 --- a/src/main/java/calculator/StringSplitter.java +++ b/src/main/java/calculator/StringSplitter.java @@ -5,7 +5,7 @@ public interface StringSplitter { static final String DEFAULT_DELIMITER = ",:"; - static final String INVALID_DELIMITER = "-."; + static final String INVALID_DELIMITER = "+-."; boolean canSupport(String str); List splitString(String str); diff --git a/src/test/java/calculator/CustomStringSplitterTest.java b/src/test/java/calculator/CustomStringSplitterTest.java index e30c16966b..40b0f17005 100644 --- a/src/test/java/calculator/CustomStringSplitterTest.java +++ b/src/test/java/calculator/CustomStringSplitterTest.java @@ -56,10 +56,10 @@ class CustomStringSplitterTest { @CsvSource({ "'//-\n12:34'", "'//.\n12:34'", - "'//*-\n12:34'" + "'//*-\n12:34'", + "'//+\n1245'" }) - void 허용되지_않는_커스텀_구분자2(String input) { - System.out.println(input); + void 허용되지_않는_커스텀_구분자_canSupport_메소드_통과(String input) { Assertions.assertTrue(stringSplitter.canSupport(input)); } @@ -67,9 +67,10 @@ class CustomStringSplitterTest { @CsvSource({ "'//-\n12:34'", "'//.\n12:34'", - "'//*-\n12:34'" + "'//*-\n12:34'", + "'//+\n1245'" }) - void 허용되지_않는_커스텀_구분자(String input) { + void 허용되지_않는_커스텀_구분자_예외_발생(String input) { Assertions.assertThrows(IllegalArgumentException.class, () -> stringSplitter.splitString(input)); } } \ No newline at end of file From 2d8812571dc397f2a93661545036354aba591c0c Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Mon, 21 Oct 2024 20:09:05 +0900 Subject: [PATCH 16/25] =?UTF-8?q?feat=20:=20CalculatorView=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/CalculatorView.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/calculator/CalculatorView.java diff --git a/src/main/java/calculator/CalculatorView.java b/src/main/java/calculator/CalculatorView.java new file mode 100644 index 0000000000..cbde401d5c --- /dev/null +++ b/src/main/java/calculator/CalculatorView.java @@ -0,0 +1,15 @@ +package calculator; + +import camp.nextstep.edu.missionutils.Console; + +public class CalculatorView { + + public String readInput() { + System.out.println("덧셈할 문자열을 입력해 주세요."); + return Console.readLine(); + } + + public void printOutput(String str) { + System.out.println("결과 : " + str); + } +} From fa86e7a51eaf16b07fedfa9cac09cbbf3b50b439 Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Mon, 21 Oct 2024 20:12:31 +0900 Subject: [PATCH 17/25] =?UTF-8?q?style=20:=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=20=EC=A4=84=EB=B0=94=EA=BF=88=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/CustomStringSplitter.java | 1 - src/main/java/calculator/DefaultStringSplitter.java | 1 - src/test/java/calculator/CustomStringSplitterTest.java | 1 - src/test/java/calculator/DefaultStringSplitterTest.java | 1 - 4 files changed, 4 deletions(-) diff --git a/src/main/java/calculator/CustomStringSplitter.java b/src/main/java/calculator/CustomStringSplitter.java index 9e26f97bb6..0a787f231a 100644 --- a/src/main/java/calculator/CustomStringSplitter.java +++ b/src/main/java/calculator/CustomStringSplitter.java @@ -12,7 +12,6 @@ public class CustomStringSplitter implements StringSplitter{ private static final String CUSTOM_DELIMITER_HEADER = "\\/\\/"; private static final String CUSTOM_DELIMITER_FOOTER = "\\\n"; - @Override public boolean canSupport(String str) { String patternRegex = generatePatternRegex(); diff --git a/src/main/java/calculator/DefaultStringSplitter.java b/src/main/java/calculator/DefaultStringSplitter.java index b7c5e1f0f9..8958ae9c8e 100644 --- a/src/main/java/calculator/DefaultStringSplitter.java +++ b/src/main/java/calculator/DefaultStringSplitter.java @@ -9,7 +9,6 @@ public class DefaultStringSplitter implements StringSplitter{ - @Override public boolean canSupport(String str) { Pattern pattern = Pattern.compile("^[0-9]+([" + DEFAULT_DELIMITER + "][0-9]+)?"); diff --git a/src/test/java/calculator/CustomStringSplitterTest.java b/src/test/java/calculator/CustomStringSplitterTest.java index 40b0f17005..37bd3606a2 100644 --- a/src/test/java/calculator/CustomStringSplitterTest.java +++ b/src/test/java/calculator/CustomStringSplitterTest.java @@ -1,7 +1,6 @@ package calculator; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; diff --git a/src/test/java/calculator/DefaultStringSplitterTest.java b/src/test/java/calculator/DefaultStringSplitterTest.java index e37fb09b70..45b45eda45 100644 --- a/src/test/java/calculator/DefaultStringSplitterTest.java +++ b/src/test/java/calculator/DefaultStringSplitterTest.java @@ -2,7 +2,6 @@ import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; From 99716b52626a0773f0fa7a585bc8b75ac2b7f593 Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Mon, 21 Oct 2024 20:14:51 +0900 Subject: [PATCH 18/25] =?UTF-8?q?style=20:=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=20=EC=A4=84=EB=B0=94=EA=BF=88=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/CustomStringSplitter.java | 8 ++++---- src/main/java/calculator/DefaultStringSplitter.java | 4 ++-- src/main/java/calculator/StringSplitter.java | 1 + src/test/java/calculator/CustomStringSplitterTest.java | 1 + 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/calculator/CustomStringSplitter.java b/src/main/java/calculator/CustomStringSplitter.java index 0a787f231a..6f5a61973c 100644 --- a/src/main/java/calculator/CustomStringSplitter.java +++ b/src/main/java/calculator/CustomStringSplitter.java @@ -7,8 +7,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -public class CustomStringSplitter implements StringSplitter{ - +public class CustomStringSplitter implements StringSplitter { + private static final String CUSTOM_DELIMITER_HEADER = "\\/\\/"; private static final String CUSTOM_DELIMITER_FOOTER = "\\\n"; @@ -26,7 +26,7 @@ public boolean canSupport(String str) { } @Override - public List splitString (String str) { + public List splitString(String str) { String patternRegex = generatePatternRegex(); Pattern pattern = Pattern.compile(patternRegex); Matcher matcher = pattern.matcher(str); @@ -73,7 +73,7 @@ private List splitSubstring(String conjoinedDelimiter, String numbersAnd } return strings; } - + private void validateContinuousDelimiter(List split, String str) { boolean hasContinuousDelimiter = split.stream() .anyMatch(s -> s.isEmpty()); diff --git a/src/main/java/calculator/DefaultStringSplitter.java b/src/main/java/calculator/DefaultStringSplitter.java index 8958ae9c8e..d6ee3aa710 100644 --- a/src/main/java/calculator/DefaultStringSplitter.java +++ b/src/main/java/calculator/DefaultStringSplitter.java @@ -7,7 +7,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -public class DefaultStringSplitter implements StringSplitter{ +public class DefaultStringSplitter implements StringSplitter { @Override public boolean canSupport(String str) { @@ -17,7 +17,7 @@ public boolean canSupport(String str) { } @Override - public List splitString (String str) { + public List splitString(String str) { StringTokenizer stringTokenizer = new StringTokenizer(str, DEFAULT_DELIMITER); List strings = new ArrayList<>(); while (stringTokenizer.hasMoreTokens()) { diff --git a/src/main/java/calculator/StringSplitter.java b/src/main/java/calculator/StringSplitter.java index 00cad0174e..d353bbbc5e 100644 --- a/src/main/java/calculator/StringSplitter.java +++ b/src/main/java/calculator/StringSplitter.java @@ -8,6 +8,7 @@ public interface StringSplitter { static final String INVALID_DELIMITER = "+-."; boolean canSupport(String str); + List splitString(String str); } diff --git a/src/test/java/calculator/CustomStringSplitterTest.java b/src/test/java/calculator/CustomStringSplitterTest.java index 37bd3606a2..ea2420bf58 100644 --- a/src/test/java/calculator/CustomStringSplitterTest.java +++ b/src/test/java/calculator/CustomStringSplitterTest.java @@ -9,6 +9,7 @@ class CustomStringSplitterTest { StringSplitter stringSplitter = new CustomStringSplitter(); + @ParameterizedTest @CsvSource({ "'//*\n2*23*4', '2', '23', '4'", From b3298c002e894d13f9366a6eb42207862b5e2b67 Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Mon, 21 Oct 2024 20:23:06 +0900 Subject: [PATCH 19/25] =?UTF-8?q?feat=20:=20StringSplitter=EB=A5=BC=20?= =?UTF-8?q?=EC=A0=81=EC=A0=88=ED=9E=88=20=EC=84=A0=ED=83=9D=ED=95=98?= =?UTF-8?q?=EB=8A=94=20StringSplitterManager=EA=B0=9D=EC=B2=B4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calculator/StringSplitterManager.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/calculator/StringSplitterManager.java diff --git a/src/main/java/calculator/StringSplitterManager.java b/src/main/java/calculator/StringSplitterManager.java new file mode 100644 index 0000000000..57d6ec8498 --- /dev/null +++ b/src/main/java/calculator/StringSplitterManager.java @@ -0,0 +1,23 @@ +package calculator; + +import java.util.List; + +public class StringSplitterManager { + + private final List stringSplitters; + private final String string; + + public StringSplitterManager(List stringSplitters, String string) { + this.stringSplitters = stringSplitters; + this.string = string; + } + + public List getSplitStrings() { + StringSplitter stringSplitter = stringSplitters.stream() + .filter(splitter -> splitter.canSupport(string)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(string)); + + return stringSplitter.splitString(string); + } +} From 4ba1c7a6eac270aac12295d2029e3f896bdf12c1 Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Mon, 21 Oct 2024 20:27:12 +0900 Subject: [PATCH 20/25] =?UTF-8?q?refactor=20:=20StringSplitterManager?= =?UTF-8?q?=EC=9D=98=20=EB=A9=A4=EB=B2=84=EB=B3=80=EC=88=98=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20=ED=9B=84=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EB=A7=A4?= =?UTF-8?q?=EA=B0=9C=EC=9D=B8=EC=9E=90=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/Calculator.java | 2 ++ src/main/java/calculator/StringSplitterManager.java | 12 +++++------- 2 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 src/main/java/calculator/Calculator.java diff --git a/src/main/java/calculator/Calculator.java b/src/main/java/calculator/Calculator.java new file mode 100644 index 0000000000..af84043ce7 --- /dev/null +++ b/src/main/java/calculator/Calculator.java @@ -0,0 +1,2 @@ +package calculator;public class Calculator { +} diff --git a/src/main/java/calculator/StringSplitterManager.java b/src/main/java/calculator/StringSplitterManager.java index 57d6ec8498..711b372283 100644 --- a/src/main/java/calculator/StringSplitterManager.java +++ b/src/main/java/calculator/StringSplitterManager.java @@ -5,19 +5,17 @@ public class StringSplitterManager { private final List stringSplitters; - private final String string; - public StringSplitterManager(List stringSplitters, String string) { + public StringSplitterManager(List stringSplitters) { this.stringSplitters = stringSplitters; - this.string = string; } - public List getSplitStrings() { + public List getSplitStrings(String str) { StringSplitter stringSplitter = stringSplitters.stream() - .filter(splitter -> splitter.canSupport(string)) + .filter(splitter -> splitter.canSupport(str)) .findFirst() - .orElseThrow(() -> new IllegalArgumentException(string)); + .orElseThrow(() -> new IllegalArgumentException(str)); - return stringSplitter.splitString(string); + return stringSplitter.splitString(str); } } From 948013c9553f05886157bb455c1cf3f6dc846d85 Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Mon, 21 Oct 2024 20:32:23 +0900 Subject: [PATCH 21/25] =?UTF-8?q?feat=20:=20=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC=20=EC=97=AD=ED=95=A0=EC=9D=98=20Calculator=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/Application.java | 3 ++- src/main/java/calculator/Calculator.java | 24 ++++++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/java/calculator/Application.java b/src/main/java/calculator/Application.java index 5530f7161c..5b3517e5a0 100644 --- a/src/main/java/calculator/Application.java +++ b/src/main/java/calculator/Application.java @@ -2,6 +2,7 @@ public class Application { public static void main(String[] args) { - + Calculator calculator = new Calculator(); + calculator.run(); } } diff --git a/src/main/java/calculator/Calculator.java b/src/main/java/calculator/Calculator.java index af84043ce7..7dc9dd06b4 100644 --- a/src/main/java/calculator/Calculator.java +++ b/src/main/java/calculator/Calculator.java @@ -1,2 +1,24 @@ -package calculator;public class Calculator { +package calculator; + +import java.util.List; + +public class Calculator { + + private final CalculatorView view = new CalculatorView(); + private final StringSplitterManager splitterManager = new StringSplitterManager( + List.of( + new DefaultStringSplitter(), + new CustomStringSplitter() + ) + ); + + public void run() { + String input = view.readInput(); + + List splitStrings = splitterManager.getSplitStrings(input); + SumCalculator sumCalculator = new SumCalculator(splitStrings); + String result = sumCalculator.calculateSum(); + + view.printOutput(result); + } } From 8b4010ad2a58cb708d17e62538307df54e6f4d54 Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Mon, 21 Oct 2024 20:42:14 +0900 Subject: [PATCH 22/25] =?UTF-8?q?refactor=20:=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/Calculator.java | 5 +++++ .../java/calculator/{ => domain}/StringSplitterManager.java | 4 +++- src/main/java/calculator/{ => domain}/SumCalculator.java | 2 +- .../{ => domain/stringsplitter}/CustomStringSplitter.java | 2 +- .../{ => domain/stringsplitter}/DefaultStringSplitter.java | 3 +-- .../{ => domain/stringsplitter}/StringSplitter.java | 2 +- src/test/java/calculator/CustomStringSplitterTest.java | 2 ++ src/test/java/calculator/DefaultStringSplitterTest.java | 2 ++ 8 files changed, 16 insertions(+), 6 deletions(-) rename src/main/java/calculator/{ => domain}/StringSplitterManager.java (87%) rename src/main/java/calculator/{ => domain}/SumCalculator.java (96%) rename src/main/java/calculator/{ => domain/stringsplitter}/CustomStringSplitter.java (98%) rename src/main/java/calculator/{ => domain/stringsplitter}/DefaultStringSplitter.java (94%) rename src/main/java/calculator/{ => domain/stringsplitter}/StringSplitter.java (85%) diff --git a/src/main/java/calculator/Calculator.java b/src/main/java/calculator/Calculator.java index 7dc9dd06b4..19e4139337 100644 --- a/src/main/java/calculator/Calculator.java +++ b/src/main/java/calculator/Calculator.java @@ -1,5 +1,10 @@ package calculator; +import calculator.domain.SumCalculator; +import calculator.domain.stringsplitter.CustomStringSplitter; +import calculator.domain.stringsplitter.DefaultStringSplitter; +import calculator.domain.StringSplitterManager; + import java.util.List; public class Calculator { diff --git a/src/main/java/calculator/StringSplitterManager.java b/src/main/java/calculator/domain/StringSplitterManager.java similarity index 87% rename from src/main/java/calculator/StringSplitterManager.java rename to src/main/java/calculator/domain/StringSplitterManager.java index 711b372283..838047ac87 100644 --- a/src/main/java/calculator/StringSplitterManager.java +++ b/src/main/java/calculator/domain/StringSplitterManager.java @@ -1,4 +1,6 @@ -package calculator; +package calculator.domain; + +import calculator.domain.stringsplitter.StringSplitter; import java.util.List; diff --git a/src/main/java/calculator/SumCalculator.java b/src/main/java/calculator/domain/SumCalculator.java similarity index 96% rename from src/main/java/calculator/SumCalculator.java rename to src/main/java/calculator/domain/SumCalculator.java index 816ec5611b..c88d7a9d07 100644 --- a/src/main/java/calculator/SumCalculator.java +++ b/src/main/java/calculator/domain/SumCalculator.java @@ -1,4 +1,4 @@ -package calculator; +package calculator.domain; import java.math.BigDecimal; import java.util.List; diff --git a/src/main/java/calculator/CustomStringSplitter.java b/src/main/java/calculator/domain/stringsplitter/CustomStringSplitter.java similarity index 98% rename from src/main/java/calculator/CustomStringSplitter.java rename to src/main/java/calculator/domain/stringsplitter/CustomStringSplitter.java index 6f5a61973c..59d872f57f 100644 --- a/src/main/java/calculator/CustomStringSplitter.java +++ b/src/main/java/calculator/domain/stringsplitter/CustomStringSplitter.java @@ -1,4 +1,4 @@ -package calculator; +package calculator.domain.stringsplitter; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/calculator/DefaultStringSplitter.java b/src/main/java/calculator/domain/stringsplitter/DefaultStringSplitter.java similarity index 94% rename from src/main/java/calculator/DefaultStringSplitter.java rename to src/main/java/calculator/domain/stringsplitter/DefaultStringSplitter.java index d6ee3aa710..5fd89812d3 100644 --- a/src/main/java/calculator/DefaultStringSplitter.java +++ b/src/main/java/calculator/domain/stringsplitter/DefaultStringSplitter.java @@ -1,7 +1,6 @@ -package calculator; +package calculator.domain.stringsplitter; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.StringTokenizer; import java.util.regex.Matcher; diff --git a/src/main/java/calculator/StringSplitter.java b/src/main/java/calculator/domain/stringsplitter/StringSplitter.java similarity index 85% rename from src/main/java/calculator/StringSplitter.java rename to src/main/java/calculator/domain/stringsplitter/StringSplitter.java index d353bbbc5e..7bd87f8bea 100644 --- a/src/main/java/calculator/StringSplitter.java +++ b/src/main/java/calculator/domain/stringsplitter/StringSplitter.java @@ -1,4 +1,4 @@ -package calculator; +package calculator.domain.stringsplitter; import java.util.List; diff --git a/src/test/java/calculator/CustomStringSplitterTest.java b/src/test/java/calculator/CustomStringSplitterTest.java index ea2420bf58..34ff3f3e4e 100644 --- a/src/test/java/calculator/CustomStringSplitterTest.java +++ b/src/test/java/calculator/CustomStringSplitterTest.java @@ -1,5 +1,7 @@ package calculator; +import calculator.domain.stringsplitter.CustomStringSplitter; +import calculator.domain.stringsplitter.StringSplitter; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; diff --git a/src/test/java/calculator/DefaultStringSplitterTest.java b/src/test/java/calculator/DefaultStringSplitterTest.java index 45b45eda45..3b105e12d4 100644 --- a/src/test/java/calculator/DefaultStringSplitterTest.java +++ b/src/test/java/calculator/DefaultStringSplitterTest.java @@ -1,6 +1,8 @@ package calculator; +import calculator.domain.stringsplitter.DefaultStringSplitter; +import calculator.domain.stringsplitter.StringSplitter; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; From 90d4e5700b18294a0c331f15a709e8d61786283a Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Mon, 21 Oct 2024 21:59:51 +0900 Subject: [PATCH 23/25] =?UTF-8?q?debug=20:=20CustomStringSplitter=EC=9D=98?= =?UTF-8?q?=20=EC=A0=95=EA=B7=9C=EC=8B=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/Calculator.java | 3 +++ .../stringsplitter/CustomStringSplitter.java | 3 ++- .../stringsplitter/DefaultStringSplitter.java | 4 ++-- .../java/calculator/CustomStringSplitterTest.java | 15 +++++++++++++-- .../calculator/DefaultStringSplitterTest.java | 12 +++++++++++- 5 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/main/java/calculator/Calculator.java b/src/main/java/calculator/Calculator.java index 19e4139337..1dbe896c70 100644 --- a/src/main/java/calculator/Calculator.java +++ b/src/main/java/calculator/Calculator.java @@ -4,6 +4,7 @@ import calculator.domain.stringsplitter.CustomStringSplitter; import calculator.domain.stringsplitter.DefaultStringSplitter; import calculator.domain.StringSplitterManager; +import camp.nextstep.edu.missionutils.Console; import java.util.List; @@ -25,5 +26,7 @@ public void run() { String result = sumCalculator.calculateSum(); view.printOutput(result); + + Console.close(); } } diff --git a/src/main/java/calculator/domain/stringsplitter/CustomStringSplitter.java b/src/main/java/calculator/domain/stringsplitter/CustomStringSplitter.java index 59d872f57f..266bcd05a0 100644 --- a/src/main/java/calculator/domain/stringsplitter/CustomStringSplitter.java +++ b/src/main/java/calculator/domain/stringsplitter/CustomStringSplitter.java @@ -10,7 +10,7 @@ public class CustomStringSplitter implements StringSplitter { private static final String CUSTOM_DELIMITER_HEADER = "\\/\\/"; - private static final String CUSTOM_DELIMITER_FOOTER = "\\\n"; + private static final String CUSTOM_DELIMITER_FOOTER = "[(\n)(\\\\n)]"; @Override public boolean canSupport(String str) { @@ -37,6 +37,7 @@ public List splitString(String str) { String conjoinedDelimiter = DEFAULT_DELIMITER + customDelimiter; String numbersAndDelimiter = matcher.group(2); + numbersAndDelimiter = numbersAndDelimiter.replace("\\", ":"); List result = splitSubstring(conjoinedDelimiter, numbersAndDelimiter); validateContinuousDelimiter(result, str); diff --git a/src/main/java/calculator/domain/stringsplitter/DefaultStringSplitter.java b/src/main/java/calculator/domain/stringsplitter/DefaultStringSplitter.java index 5fd89812d3..2fb6d1cfd8 100644 --- a/src/main/java/calculator/domain/stringsplitter/DefaultStringSplitter.java +++ b/src/main/java/calculator/domain/stringsplitter/DefaultStringSplitter.java @@ -10,9 +10,9 @@ public class DefaultStringSplitter implements StringSplitter { @Override public boolean canSupport(String str) { - Pattern pattern = Pattern.compile("^[0-9]+([" + DEFAULT_DELIMITER + "][0-9]+)?"); + Pattern pattern = Pattern.compile("^[0-9]+([" + DEFAULT_DELIMITER + "][0-9]+)*$"); Matcher matcher = pattern.matcher(str); - return matcher.matches(); + return matcher.find(); } @Override diff --git a/src/test/java/calculator/CustomStringSplitterTest.java b/src/test/java/calculator/CustomStringSplitterTest.java index 34ff3f3e4e..f10649b2e5 100644 --- a/src/test/java/calculator/CustomStringSplitterTest.java +++ b/src/test/java/calculator/CustomStringSplitterTest.java @@ -14,8 +14,19 @@ class CustomStringSplitterTest { @ParameterizedTest @CsvSource({ - "'//*\n2*23*4', '2', '23', '4'", - "'//i\n2i23i4', '2', '23', '4'" + "'//;\\\n1'", + "'//;\\n1'", + "'//;\n1'", + "'///;\n1'" + }) + void 커스텀_문자열_지원확인(String input) { + Assertions.assertTrue(stringSplitter.canSupport(input)); + } + + @ParameterizedTest + @CsvSource({ + "'//*\\n2\23*4', '2', '23', '4'", + "'///i\n2/23i4', '2', '23', '4'" }) void 커스텀_문자열_나누기(String input, String expected1, String expected2, String expected3) { List strings = stringSplitter.splitString(input); diff --git a/src/test/java/calculator/DefaultStringSplitterTest.java b/src/test/java/calculator/DefaultStringSplitterTest.java index 3b105e12d4..7483fc5ee0 100644 --- a/src/test/java/calculator/DefaultStringSplitterTest.java +++ b/src/test/java/calculator/DefaultStringSplitterTest.java @@ -15,7 +15,17 @@ public class DefaultStringSplitterTest { @ParameterizedTest @CsvSource({ - "'6:3:2', '6', '3', '2'", + "'1,2'", + "'1:2:3'", + "'45,67:89'" + }) + void 기본_문자열_지원확인(String input) { + Assertions.assertTrue(stringSplitter.canSupport(input)); + } + + @ParameterizedTest + @CsvSource({ + "6:3:2, '6', '3', '2'", "'12,34,56', '12', '34', '56'", "'100:200,300', '100', '200', '300'", }) From 325445a06953f56e471ea13ac3886140eaddc91d Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Mon, 21 Oct 2024 22:46:14 +0900 Subject: [PATCH 24/25] =?UTF-8?q?test=20:=20SumCalculator=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/calculator/domain/SumCalculator.java | 2 +- .../stringsplitter/CustomStringSplitter.java | 11 +++- .../domain/stringsplitter/StringSplitter.java | 2 +- .../calculator/CustomStringSplitterTest.java | 15 ++++- .../calculator/DefaultStringSplitterTest.java | 2 +- .../calculator/domain/SumCalculatorTest.java | 59 +++++++++++++++++++ 6 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 src/test/java/calculator/domain/SumCalculatorTest.java diff --git a/src/main/java/calculator/domain/SumCalculator.java b/src/main/java/calculator/domain/SumCalculator.java index c88d7a9d07..42484c73ab 100644 --- a/src/main/java/calculator/domain/SumCalculator.java +++ b/src/main/java/calculator/domain/SumCalculator.java @@ -23,7 +23,7 @@ private BigDecimal convertToBigDecimal(String str) { if (str.equals("0")) { throw new IllegalArgumentException(strings.toString()); } - if (!str.matches("^[+]?[0-9]+")) { + if (!str.matches("^[+]?[0-9]+([.][0-9]+)?")) { throw new IllegalArgumentException(strings.toString()); } return new BigDecimal(str); diff --git a/src/main/java/calculator/domain/stringsplitter/CustomStringSplitter.java b/src/main/java/calculator/domain/stringsplitter/CustomStringSplitter.java index 266bcd05a0..efb3718212 100644 --- a/src/main/java/calculator/domain/stringsplitter/CustomStringSplitter.java +++ b/src/main/java/calculator/domain/stringsplitter/CustomStringSplitter.java @@ -37,19 +37,26 @@ public List splitString(String str) { String conjoinedDelimiter = DEFAULT_DELIMITER + customDelimiter; String numbersAndDelimiter = matcher.group(2); - numbersAndDelimiter = numbersAndDelimiter.replace("\\", ":"); + numbersAndDelimiter = replaceBackSlash(customDelimiter, numbersAndDelimiter); List result = splitSubstring(conjoinedDelimiter, numbersAndDelimiter); validateContinuousDelimiter(result, str); return result; } + private String replaceBackSlash(String customDelimiter, String numbersAndDelimiter) { + if (customDelimiter.contains("\\")) { + numbersAndDelimiter = numbersAndDelimiter.replace("\\", String.valueOf(DEFAULT_DELIMITER.charAt(0))); + } + return numbersAndDelimiter; + } + private String generatePatternRegex() { StringBuilder delimiterBuilder = new StringBuilder(); delimiterBuilder.append("^") .append(CUSTOM_DELIMITER_HEADER) - .append("(.+)") + .append("([^0-9]+)") .append(CUSTOM_DELIMITER_FOOTER) .append("(.+)"); diff --git a/src/main/java/calculator/domain/stringsplitter/StringSplitter.java b/src/main/java/calculator/domain/stringsplitter/StringSplitter.java index 7bd87f8bea..e765c87605 100644 --- a/src/main/java/calculator/domain/stringsplitter/StringSplitter.java +++ b/src/main/java/calculator/domain/stringsplitter/StringSplitter.java @@ -4,7 +4,7 @@ public interface StringSplitter { - static final String DEFAULT_DELIMITER = ",:"; + static final String DEFAULT_DELIMITER = ":,"; static final String INVALID_DELIMITER = "+-."; boolean canSupport(String str); diff --git a/src/test/java/calculator/CustomStringSplitterTest.java b/src/test/java/calculator/CustomStringSplitterTest.java index f10649b2e5..d3bfefed71 100644 --- a/src/test/java/calculator/CustomStringSplitterTest.java +++ b/src/test/java/calculator/CustomStringSplitterTest.java @@ -17,15 +17,24 @@ class CustomStringSplitterTest { "'//;\\\n1'", "'//;\\n1'", "'//;\n1'", - "'///;\n1'" + "'///;*?!@#$\n1'" }) - void 커스텀_문자열_지원확인(String input) { + void 커스텀_문자열_지원_TRUE(String input) { Assertions.assertTrue(stringSplitter.canSupport(input)); } @ParameterizedTest @CsvSource({ - "'//*\\n2\23*4', '2', '23', '4'", + "'//0\n3:4'", + "'3:4//i\n'" + }) + void 커스텀_문자열_지원_FALSE(String input) { + Assertions.assertFalse(stringSplitter.canSupport(input)); + } + + @ParameterizedTest + @CsvSource({ + "'//i\\n2\\23i4', '2', '23', '4'", "'///i\n2/23i4', '2', '23', '4'" }) void 커스텀_문자열_나누기(String input, String expected1, String expected2, String expected3) { diff --git a/src/test/java/calculator/DefaultStringSplitterTest.java b/src/test/java/calculator/DefaultStringSplitterTest.java index 7483fc5ee0..5076fdb63f 100644 --- a/src/test/java/calculator/DefaultStringSplitterTest.java +++ b/src/test/java/calculator/DefaultStringSplitterTest.java @@ -19,7 +19,7 @@ public class DefaultStringSplitterTest { "'1:2:3'", "'45,67:89'" }) - void 기본_문자열_지원확인(String input) { + void 기본_문자열_지원_TRUE(String input) { Assertions.assertTrue(stringSplitter.canSupport(input)); } diff --git a/src/test/java/calculator/domain/SumCalculatorTest.java b/src/test/java/calculator/domain/SumCalculatorTest.java new file mode 100644 index 0000000000..28a0544411 --- /dev/null +++ b/src/test/java/calculator/domain/SumCalculatorTest.java @@ -0,0 +1,59 @@ +package calculator.domain; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class SumCalculatorTest { + + List list = new ArrayList<>(); + SumCalculator sumCalculator = new SumCalculator(list); + + @BeforeEach + void init() { + list.clear(); + } + + @Test + void 계산_테스트() { + list.add("1"); + list.add("3.0123456789"); + + String result = sumCalculator.calculateSum(); + + Assertions.assertTrue(result.equals("4.0123456789")); + } + + @Test + void 계산_테스트_2() { + list.add("0123"); + list.add("0456"); + + String result = sumCalculator.calculateSum(); + + Assertions.assertTrue(result.equals("579")); + } + + @Test + void 계산_테스트_음수() { + list.add("-1"); + list.add("1234567890"); + + Assertions.assertThrows(IllegalArgumentException.class, () -> sumCalculator.calculateSum()); + + } + + @Test + void 계산_테스트_0() { + list.add("1"); + list.add("0"); + + Assertions.assertThrows(IllegalArgumentException.class, () -> sumCalculator.calculateSum()); + + } +} \ No newline at end of file From c9f652231a42d99609aa34dd0c35b6c438248dec Mon Sep 17 00:00:00 2001 From: inti0 <142914095+inti0@users.noreply.github.com> Date: Mon, 21 Oct 2024 23:14:59 +0900 Subject: [PATCH 25/25] =?UTF-8?q?refactor=20:=20=EC=B5=9C=EC=A2=85=20?= =?UTF-8?q?=EC=A0=9C=EC=B6=9C=20=EC=A0=84=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 35 ++++++++++--------- .../java/calculator/domain/SumCalculator.java | 5 ++- .../CustomStringSplitterTest.java | 2 +- .../DefaultStringSplitterTest.java | 2 +- 4 files changed, 24 insertions(+), 20 deletions(-) rename src/test/java/calculator/{ => domain}/CustomStringSplitterTest.java (99%) rename src/test/java/calculator/{ => domain}/DefaultStringSplitterTest.java (98%) diff --git a/README.md b/README.md index bcd6242402..386df9fc42 100644 --- a/README.md +++ b/README.md @@ -3,32 +3,33 @@ ## 도메인 입력받은 문자열을 구분자를 이용해 나눈다. - - [] 구분자는 기본적으로 쉼표(,)와 콜론(:)이 포함되어야 한다. - - [] 문자열 앞부분의 //와 \n사이에 위치하는 문자를 커스텀 구분자로 추가해야한다. - - [] 커스텀 구분자는 숫자의 특성상 부호를 표기하는 +, -와 소숫점을 표현하는 .은 잘못된 것으로 처리하여 예외를 던진다. - - [] 구분자라는 특성상 커스텀 구분자의 속하는 문자열의 길이가 2이상일 경우 각각 하나의 문자를 커스텀 구분자로 사용한다. + - 구분자는 기본적으로 쉼표(,)와 콜론(:)이 포함되어야 한다. + - 문자열 앞부분의 //와 \n사이에 위치하는 문자를 커스텀 구분자로 추가해야한다. + - 커스텀 구분자는 숫자의 특성상 부호를 표기하는 +, -와 소숫점을 표현하는 .은 잘못된 것으로 처리하여 예외를 던진다. + - 구분자라는 특성상 커스텀 구분자의 속하는 문자열의 길이가 2이상일 경우 각각 하나의 문자를 커스텀 구분자로 사용한다. - (예시) "//;^$\n1;2^3" 의 경우 ;^$라는 길이 3짜리 구분자를 사용하는 것이 아닌 ; ^ $ 이 셋을 각각 하나의 구분자로 사용한다. - - [] 기본 구분자 쉼표(,)와 콜론(:) 그리고 추가된 커스텀 문자를 제외한 문자열이 나타난 경우 잘못된 것으로 처리하여 예외를 던진다. - - [] 커스텀 구분자를 등록한 이후 숫자와 구분자가 있어야할 부분에서 숫자와 구분자가 번갈아 등장하지 않고 연속으로 등장한 경우 예외를 던진다. + - 기본 구분자 쉼표(,)와 콜론(:) 그리고 추가된 커스텀 문자를 제외한 문자열이 나타난 경우 잘못된 것으로 처리하여 예외를 던진다. + - 커스텀 구분자를 등록한 이후 숫자와 구분자가 있어야할 부분에서 숫자와 구분자가 번갈아 등장하지 않고 연속으로 등장한 경우 예외를 던진다. + - 이는 공백문자열로 나타날 것이므로, 나눠진 문자열의 목록을 숫자로 변환하는 부분에서 예외를 던진다.
- 숫자의 제한조건은 양수라는 것 외에는 없다. 따라서 확장성을 위하여 문자를 숫자로 변환하는 객체를 인터페이스로 추상화한다. - - [] 나눠진 문자열을 숫자로 변환한다. - - [] 변환한 숫자들을 더하여 문자로 반환한다. + 숫자의 제한조건은 양수라는 것 외에는 없다. 따라서 확장성을 위하여 문자를 숫자로 변환하는 객체를 따로 관리한다. + - 나눠진 문자열을 숫자로 변환한다. + - 변환한 숫자들을 더하여 문자로 반환한다. ## 출력 - - [] 프로그램 실행시 안내메시지를 출력한다. - - [] 결과를 출력한다. + - 프로그램 실행시 안내메시지를 출력한다. + - 결과를 출력한다. ## 테스트 - - [] 기본 구분자를 통해 문자열이 잘 나누어지는지 확인한다. - - [] 커스텀 구분자가 추가된 경우 문자열이 잘 나누어지는지 확인한다. - - [] 여러개의 커스텀 구분자가 추가된 경우도 확인한다. - - [] +, -, .이 커스텀 구분자로 포함될 경우 예외를 던진다. - - [] 구분자가 연속으로 등장한 경우 예외를 던진다. - + - 기본 구분자를 통해 문자열이 잘 나누어지는지 확인한다. + - 커스텀 구분자가 추가된 경우 문자열이 잘 나누어지는지 확인한다. + - 여러개의 커스텀 구분자가 추가된 경우도 확인한다. + - +, -, .이 커스텀 구분자로 포함될 경우 예외를 던진다. + - 구분자가 연속으로 등장한 경우 예외를 던진다. +




diff --git a/src/main/java/calculator/domain/SumCalculator.java b/src/main/java/calculator/domain/SumCalculator.java index 42484c73ab..a81f8bc34e 100644 --- a/src/main/java/calculator/domain/SumCalculator.java +++ b/src/main/java/calculator/domain/SumCalculator.java @@ -23,9 +23,12 @@ private BigDecimal convertToBigDecimal(String str) { if (str.equals("0")) { throw new IllegalArgumentException(strings.toString()); } - if (!str.matches("^[+]?[0-9]+([.][0-9]+)?")) { + + String positiveNumberPattern = "^[+]?[0-9]+([.][0-9]+)?"; + if (!str.matches(positiveNumberPattern)) { throw new IllegalArgumentException(strings.toString()); } + return new BigDecimal(str); } } diff --git a/src/test/java/calculator/CustomStringSplitterTest.java b/src/test/java/calculator/domain/CustomStringSplitterTest.java similarity index 99% rename from src/test/java/calculator/CustomStringSplitterTest.java rename to src/test/java/calculator/domain/CustomStringSplitterTest.java index d3bfefed71..904f50d68d 100644 --- a/src/test/java/calculator/CustomStringSplitterTest.java +++ b/src/test/java/calculator/domain/CustomStringSplitterTest.java @@ -1,4 +1,4 @@ -package calculator; +package calculator.domain; import calculator.domain.stringsplitter.CustomStringSplitter; import calculator.domain.stringsplitter.StringSplitter; diff --git a/src/test/java/calculator/DefaultStringSplitterTest.java b/src/test/java/calculator/domain/DefaultStringSplitterTest.java similarity index 98% rename from src/test/java/calculator/DefaultStringSplitterTest.java rename to src/test/java/calculator/domain/DefaultStringSplitterTest.java index 5076fdb63f..0647f64ecb 100644 --- a/src/test/java/calculator/DefaultStringSplitterTest.java +++ b/src/test/java/calculator/domain/DefaultStringSplitterTest.java @@ -1,4 +1,4 @@ -package calculator; +package calculator.domain; import calculator.domain.stringsplitter.DefaultStringSplitter;