From 77dd57c5269705401244fcdf5f2b6755163f87f7 Mon Sep 17 00:00:00 2001 From: rkwkalrms <140880709+rkwkalrms@users.noreply.github.com> Date: Sat, 19 Oct 2024 11:10:48 +0900 Subject: [PATCH 1/7] Docs:README.md --- README.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bd90ef0247..04112ddd57 100644 --- a/README.md +++ b/README.md @@ -1 +1,17 @@ -# java-calculator-precourse \ No newline at end of file +# java-calculator-precourse + +## 문자열 덧셈 계산기 + + +### 구현할 기능 + + 문자열을 받는 기능. +#### 1. 문자열의 필터링 + 문자열에 숫자를 제외한 구분자 또는 커스텀 구분자를 구분하는 필터링한다. ++ 입력 받은 문자열에 쉼표(,), 콜론(:) 등 기본 구분자를 필터링하는 함수. ++ 문자열에 "//", "\n"사이의 구분자를 구별해 커스텀 구분자로 필터링하는 함수. + +#### 2. 필터링된 문자열의 덧셈 ++ 필터링을 거친 후 문자열의 숫자들을 정수 데이터로 변환 후에 덧셈을 진행하는 기능. + +#### 3. 잘못된 입력에 대한 예외처리 +- 음수 입력이나 다른 메타문자 등의 입력의 경우를 예상해 예외처리를 하는 기능. From 3f35e90bf4ad7b6d23bcc15b9a58a0f2a41c1bec Mon Sep 17 00:00:00 2001 From: rkwkalrms <140880709+rkwkalrms@users.noreply.github.com> Date: Sun, 20 Oct 2024 11:49:31 +0900 Subject: [PATCH 2/7] feat: Add string filtering and addition features Implemented StringFilter class to filter input strings. Created Addition class to perform addition on filtered numbers. Modified main application to receive input, filter strings, and display the sum. --- README.md | 18 +++++++- src/main/java/calculator/Application.java | 16 +++++++- src/main/java/calculator/Calculator.java | 24 +++++++++++ src/main/java/calculator/StringFilter.java | 41 +++++++++++++++++++ src/test/java/calculator/ApplicationTest.java | 2 + 5 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 src/main/java/calculator/Calculator.java create mode 100644 src/main/java/calculator/StringFilter.java diff --git a/README.md b/README.md index bd90ef0247..e8e74e5a85 100644 --- a/README.md +++ b/README.md @@ -1 +1,17 @@ -# java-calculator-precourse \ No newline at end of file +# java-calculator-precourse + +## 문자열 덧셈 계산기 + + +### 구현할 기능 ++ 문자열을 받는 기능. +#### 1. 문자열의 필터링 +문자열에 숫자를 제외한 구분자 또는 커스텀 구분자를 구분하는 필터링한다. ++ 입력 받은 문자열에 쉼표(,), 콜론(:) 등 기본 구분자를 필터링하는 함수. ++ 문자열에 "//", "\n"사이의 구분자를 구별해 커스텀 구분자로 필터링하는 함수. + +#### 2. 필터링된 문자열의 덧셈 ++ 필터링을 거친 후 문자열의 숫자들을 정수 데이터로 변환 후에 덧셈을 진행하는 기능. + +#### 3. 잘못된 입력에 대한 예외처리 +- 음수 입력이나 다른 메타문자 등의 입력의 경우를 예상해 예외처리를 하는 기능. diff --git a/src/main/java/calculator/Application.java b/src/main/java/calculator/Application.java index 573580fb40..6c3fdf114a 100644 --- a/src/main/java/calculator/Application.java +++ b/src/main/java/calculator/Application.java @@ -1,7 +1,21 @@ package calculator; +import camp.nextstep.edu.missionutils.Console; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + //문자열 받기 + StringFilter strF = new StringFilter(Console.readLine()); //문자 필터링 + + Calculator cal = new Calculator(); + + String[] numbers = strF.getFilteredString(); + System.out.println("결과 : " + cal.sumResult(numbers)); + + + + + + } } diff --git a/src/main/java/calculator/Calculator.java b/src/main/java/calculator/Calculator.java new file mode 100644 index 0000000000..375b08f0d2 --- /dev/null +++ b/src/main/java/calculator/Calculator.java @@ -0,0 +1,24 @@ +package calculator; + +public class Calculator { + + public int sumResult(String[] filteredString) { + int sum = 0; + + try { + for(int i = 0; i<=filteredString.length-1; i++) { + if(Integer.parseInt(filteredString[i])< 0) { + throw new IllegalArgumentException("음수는 사용할 수 없습니다."); + } + sum += Integer.parseInt(filteredString[i]); + } + } catch(NumberFormatException e) { + throw new IllegalArgumentException("잘못된 숫자 형식입니다."); + } + return sum; + } + + + + +} diff --git a/src/main/java/calculator/StringFilter.java b/src/main/java/calculator/StringFilter.java new file mode 100644 index 0000000000..d835d8f8ad --- /dev/null +++ b/src/main/java/calculator/StringFilter.java @@ -0,0 +1,41 @@ +package calculator; + +import java.util.Arrays; + +public class StringFilter { + + private String str; + + public StringFilter(String str) { + this.str = str; + } + + public String[] getFilteredString() { + //만약 공백입력시 + if(str==null || str.isEmpty()) + return new String[]{"0"}; + + + str = str.replaceAll(" ", ""); + String delimiter = "[,|:]"; + String numberPart; + + // 만약 커스텀 구분자가 존재한다면. + if(str.startsWith("//")) { + //구분자의 추출 + String customDelimiter = str.substring(2, str.indexOf("\\")); + delimiter += "|" + customDelimiter; + // //, \n, 구분자를 제외한 나머지 숫자들 추출 + numberPart = str.substring(str.indexOf("n") + 1); + + //빈 문자열 필터링 및 결과 반환 +// return numberPart.split(delimiter); + } else { + numberPart = str; + } +// return str.split(delimiter); + return Arrays.stream(numberPart.split(delimiter)) + .filter(s -> !s.isEmpty()) // 빈 문자열 제거 + .toArray(String[]::new); + } +} diff --git a/src/test/java/calculator/ApplicationTest.java b/src/test/java/calculator/ApplicationTest.java index 93771fb011..00c9478ea3 100644 --- a/src/test/java/calculator/ApplicationTest.java +++ b/src/test/java/calculator/ApplicationTest.java @@ -8,6 +8,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; class ApplicationTest extends NsTest { + @Test void 커스텀_구분자_사용() { assertSimpleTest(() -> { @@ -24,6 +25,7 @@ class ApplicationTest extends NsTest { ); } + @Override public void runMain() { Application.main(new String[]{}); From ac2a84bded97c1ec3683e98b4ddad7d3b8ffa097 Mon Sep 17 00:00:00 2001 From: rkwkalrms <140880709+rkwkalrms@users.noreply.github.com> Date: Mon, 21 Oct 2024 16:51:08 +0900 Subject: [PATCH 3/7] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=ED=95=A0=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EB=AA=85=EC=84=B8=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 04112ddd57..547bbedfc5 100644 --- a/README.md +++ b/README.md @@ -7,11 +7,18 @@ + 문자열을 받는 기능. #### 1. 문자열의 필터링 문자열에 숫자를 제외한 구분자 또는 커스텀 구분자를 구분하는 필터링한다. -+ 입력 받은 문자열에 쉼표(,), 콜론(:) 등 기본 구분자를 필터링하는 함수. -+ 문자열에 "//", "\n"사이의 구분자를 구별해 커스텀 구분자로 필터링하는 함수. + ++ 입력 받은 문자열에 공백인지 체크. ++ 쉼표(,), 콜론(:) 등 기본 구분자를 필터링. ++ 문자열에 "//", "\n"사이의 구분자를 구별해 커스텀 구분자로 필터링. ++ 필터링된 문자열을 문자배열로 반환 #### 2. 필터링된 문자열의 덧셈 -+ 필터링을 거친 후 문자열의 숫자들을 정수 데이터로 변환 후에 덧셈을 진행하는 기능. ++ 필터링을 거친 문자배열을 정수 데이터로 전환하며 덧셈을 진행. ++ 덧셈 전 정수 데이터 체크. #### 3. 잘못된 입력에 대한 예외처리 -- 음수 입력이나 다른 메타문자 등의 입력의 경우를 예상해 예외처리를 하는 기능. +- 음수 입력이나 잘못된 형식의 문자에 대한 예외처리 + + + From 1f8a2ba085b77d524be274c16ca41f2a056c9eb2 Mon Sep 17 00:00:00 2001 From: rkwkalrms <140880709+rkwkalrms@users.noreply.github.com> Date: Mon, 21 Oct 2024 16:54:35 +0900 Subject: [PATCH 4/7] =?UTF-8?q?Feat:=20=EB=AC=B8=EC=9E=90=EC=97=B4=20?= =?UTF-8?q?=EB=B0=9B=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=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/Input.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/calculator/Input.java diff --git a/src/main/java/calculator/Input.java b/src/main/java/calculator/Input.java new file mode 100644 index 0000000000..d968517640 --- /dev/null +++ b/src/main/java/calculator/Input.java @@ -0,0 +1,10 @@ +package calculator; + +import camp.nextstep.edu.missionutils.Console; + +public class Input { + public static String inputString() { + System.out.println("덧셈할 문자열을 입력해 주세요."); + return Console.readLine(); + } +} From 13810c99574390ae4338263fd2c4eafd2e6bc16c Mon Sep 17 00:00:00 2001 From: rkwkalrms <140880709+rkwkalrms@users.noreply.github.com> Date: Mon, 21 Oct 2024 16:59:46 +0900 Subject: [PATCH 5/7] =?UTF-8?q?Refactor:=20Input=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=ED=98=B8=EC=B6=9C=20=EC=B6=94=EA=B0=80=20=EB=B0=8F?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EC=A0=84=EB=B0=98=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/Application.java | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/main/java/calculator/Application.java b/src/main/java/calculator/Application.java index 6c3fdf114a..a693649d66 100644 --- a/src/main/java/calculator/Application.java +++ b/src/main/java/calculator/Application.java @@ -1,21 +1,15 @@ package calculator; -import camp.nextstep.edu.missionutils.Console; - public class Application { public static void main(String[] args) { - //문자열 받기 - StringFilter strF = new StringFilter(Console.readLine()); //문자 필터링 + String input = Input.inputString(); + StringFilter strF = new StringFilter(); Calculator cal = new Calculator(); - String[] numbers = strF.getFilteredString(); - System.out.println("결과 : " + cal.sumResult(numbers)); - - - - + String[] numbers = strF.checkString(input); + System.out.println("결과 : " + cal.result(numbers)); } } From c544aa2abe12ca9ed32082f98291bf42a862c130 Mon Sep 17 00:00:00 2001 From: rkwkalrms <140880709+rkwkalrms@users.noreply.github.com> Date: Mon, 21 Oct 2024 17:01:00 +0900 Subject: [PATCH 6/7] =?UTF-8?q?Refactor:=20=EC=A0=84=EB=B0=98=EC=A0=81?= =?UTF-8?q?=EC=9D=B8=20=EC=BD=94=EB=93=9C=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 | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/main/java/calculator/Calculator.java b/src/main/java/calculator/Calculator.java index 375b08f0d2..d1c4e18b2f 100644 --- a/src/main/java/calculator/Calculator.java +++ b/src/main/java/calculator/Calculator.java @@ -2,23 +2,22 @@ public class Calculator { - public int sumResult(String[] filteredString) { + + public int result(String[] s) { int sum = 0; - try { - for(int i = 0; i<=filteredString.length-1; i++) { - if(Integer.parseInt(filteredString[i])< 0) { - throw new IllegalArgumentException("음수는 사용할 수 없습니다."); + for(String number : s) { + try{ + + + if(Integer.parseInt(number) < 0) { + throw new IllegalArgumentException("음수입니다."); } - sum += Integer.parseInt(filteredString[i]); + sum += Integer.parseInt(number); + }catch(NumberFormatException e) { + throw new IllegalArgumentException("잘못된 형식의 값입니다." + Integer.parseInt(number)); } - } catch(NumberFormatException e) { - throw new IllegalArgumentException("잘못된 숫자 형식입니다."); } return sum; } - - - - } From 74d6155106795afa5bc913d14b413c26ee2a2e9c Mon Sep 17 00:00:00 2001 From: rkwkalrms <140880709+rkwkalrms@users.noreply.github.com> Date: Mon, 21 Oct 2024 17:04:17 +0900 Subject: [PATCH 7/7] =?UTF-8?q?Refactor:=20=EC=A0=84=EB=B0=98=EC=A0=81?= =?UTF-8?q?=EC=9D=B8=20=EC=BD=94=EB=93=9C=20=EA=B0=9C=ED=8E=B8=EA=B3=BC=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=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/StringFilter.java | 54 +++++++++++----------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/src/main/java/calculator/StringFilter.java b/src/main/java/calculator/StringFilter.java index d835d8f8ad..a9617cd029 100644 --- a/src/main/java/calculator/StringFilter.java +++ b/src/main/java/calculator/StringFilter.java @@ -1,41 +1,39 @@ package calculator; + import java.util.Arrays; public class StringFilter { + final String baseDelimiter = "[,|:]"; + String customDelimiter = ""; - private String str; - - public StringFilter(String str) { - this.str = str; - } - - public String[] getFilteredString() { - //만약 공백입력시 - if(str==null || str.isEmpty()) - return new String[]{"0"}; - + public String[] checkString(String input) { + input = input.replaceAll(" ", ""); - str = str.replaceAll(" ", ""); - String delimiter = "[,|:]"; - String numberPart; + if(input.isEmpty()) { + throw new IllegalArgumentException("잘못된 형식입니다."); + } - // 만약 커스텀 구분자가 존재한다면. - if(str.startsWith("//")) { - //구분자의 추출 - String customDelimiter = str.substring(2, str.indexOf("\\")); - delimiter += "|" + customDelimiter; - // //, \n, 구분자를 제외한 나머지 숫자들 추출 - numberPart = str.substring(str.indexOf("n") + 1); + if(input.contains("//") && input.contains("\\n")) { + return customDelimiterCheck(input); + } + return filteringString(input); + } - //빈 문자열 필터링 및 결과 반환 -// return numberPart.split(delimiter); - } else { - numberPart = str; + private String[] customDelimiterCheck(String input) { + if(input.indexOf("//") > input.indexOf("\\n")) { + throw new IllegalArgumentException("커스텀 구분자를 찾을 수 없습니다."); } -// return str.split(delimiter); - return Arrays.stream(numberPart.split(delimiter)) - .filter(s -> !s.isEmpty()) // 빈 문자열 제거 + customDelimiter = input.substring(input.indexOf("//")+2, input.indexOf("\\n")); + return filteringString(input); + } + + private String[] filteringString(String input) { + String replaceInput = input.replace("//","").replace("\\n", ""); + return Arrays.stream(replaceInput.split(baseDelimiter)) + .flatMap(part -> Arrays.stream(part.split(customDelimiter))) + .filter(s -> !s.isEmpty()) .toArray(String[]::new); + } }