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;