From 934f58f0879904f8a947cd953adf1c159c4c9e16 Mon Sep 17 00:00:00 2001 From: asa9874 Date: Wed, 30 Jul 2025 10:22:29 +0900 Subject: [PATCH 01/16] =?UTF-8?q?feat:=20Calculator=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EA=B3=84=EC=82=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Calculator.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/java/Calculator.java diff --git a/src/main/java/Calculator.java b/src/main/java/Calculator.java new file mode 100644 index 00000000..830ef136 --- /dev/null +++ b/src/main/java/Calculator.java @@ -0,0 +1,21 @@ +public class Calculator { + public int add(int a, int b) { + return a + b; + } + + public int subtract(int a, int b) { + return a - b; + } + + public int multiply(int a, int b) { + return a * b; + } + + public int divide(int a, int b) { + if (b == 0) { + throw new IllegalArgumentException("0 나누기 오류"); + } + + return a / b; + } +} From 091b3bf12f832191b90bd0621b25a4ebdedfc9a7 Mon Sep 17 00:00:00 2001 From: asa9874 Date: Wed, 30 Jul 2025 10:53:44 +0900 Subject: [PATCH 02/16] =?UTF-8?q?feat:=20CalculatorJunit5Test=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/CalculatorJunit5Test.java | 70 +++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/test/java/CalculatorJunit5Test.java diff --git a/src/test/java/CalculatorJunit5Test.java b/src/test/java/CalculatorJunit5Test.java new file mode 100644 index 00000000..63e390c7 --- /dev/null +++ b/src/test/java/CalculatorJunit5Test.java @@ -0,0 +1,70 @@ +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +public class CalculatorJunit5Test { + + private Calculator calculator = new Calculator(); + + @Nested + @DisplayName("덧셈 테스트") + public class AddTest { + + @Test + public void 정수_더하기() { + assertEquals(5, calculator.add(2, 3)); + assertEquals(0, calculator.add(-1, 1)); + assertEquals(-5, calculator.add(-2, -3)); + } + } + + @Nested + @DisplayName("뺄셈 테스트") + public class SubtractTest { + + @Test + public void 정수_빼기() { + assertEquals(1, calculator.subtract(3, 2)); + assertEquals(-2, calculator.subtract(-1, 1)); + assertEquals(1, calculator.subtract(-2, -3)); + } + } + + @Nested + @DisplayName("곱셈 테스트") + public class MultiplyTest { + + @Test + public void 정수_곱하기() { + assertEquals(6, calculator.multiply(2, 3)); + assertEquals(-1, calculator.multiply(-1, 1)); + assertEquals(6, calculator.multiply(-2, -3)); + } + } + + @Nested + @DisplayName("나눗셈 테스트") + public class DivideTest { + + @Test + public void 정수_나누기() { + assertEquals(2, calculator.divide(6, 3)); + assertEquals(-1, calculator.divide(-3, 3)); + assertEquals(1, calculator.divide(-3, -3)); + } + + @Test + public void 예외_0_나누기() { + assertThrows(IllegalArgumentException.class, () -> calculator.divide(1, 0)); + assertDoesNotThrow(() -> calculator.divide(0, 1)); + } + + @Test + public void 나누기_결과가_정수가_아닐때() { + assertEquals(2, calculator.divide(5, 2)); + assertEquals(0, calculator.divide(1, 2)); + } + } +} From 92e816f8643c96635f3e598355d2b45093745720 Mon Sep 17 00:00:00 2001 From: asa9874 Date: Wed, 30 Jul 2025 13:03:42 +0900 Subject: [PATCH 03/16] =?UTF-8?q?feat:=20StringCalculator=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EA=B3=84=EC=82=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/StringCalculator.java | 48 +++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/main/java/StringCalculator.java diff --git a/src/main/java/StringCalculator.java b/src/main/java/StringCalculator.java new file mode 100644 index 00000000..cb4c835a --- /dev/null +++ b/src/main/java/StringCalculator.java @@ -0,0 +1,48 @@ +import java.util.Arrays; + +public class StringCalculator { + private final String delimiter = ",|:"; + + public int add(String input) { + + String delimiter = this.delimiter; + + if (isEmptyOrNull(input)) { + return 0; + } + + if (hasCustomDelimiter(input)) { + int endCustomDelimiterIndex = input.indexOf('\n'); + delimiter += "|" + input.substring(2, endCustomDelimiterIndex); + input = input.substring(endCustomDelimiterIndex + 1); + } + + return getSum(input.split(delimiter)); + } + + private int getSum(String[] numbers) { + return Arrays.stream(numbers).mapToInt(num -> { + if (!isNumber(num)) { + throw new RuntimeException("숫자가 아닌 값이 포함되어 있습니다"); + } + int number = Integer.parseInt(num); + if (number < 0) { + throw new RuntimeException("음수는 허용되지 않습니다"); + } + return number; + }).sum(); + } + + private boolean isEmptyOrNull(String input) { + return input == null || input.isEmpty(); + } + + private boolean isNumber(String number) { + return number.matches("-?\\d+"); + } + + private boolean hasCustomDelimiter(String input) { + return input.startsWith("//"); + } + +} From 800bd3ed6b97120a996ca14b9613627893d145c5 Mon Sep 17 00:00:00 2001 From: asa9874 Date: Wed, 30 Jul 2025 13:05:29 +0900 Subject: [PATCH 04/16] =?UTF-8?q?feat:=20StringCalculatorJunit5Test=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/StringCalculatorJunit5Test.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/test/java/StringCalculatorJunit5Test.java diff --git a/src/test/java/StringCalculatorJunit5Test.java b/src/test/java/StringCalculatorJunit5Test.java new file mode 100644 index 00000000..9acbbab3 --- /dev/null +++ b/src/test/java/StringCalculatorJunit5Test.java @@ -0,0 +1,54 @@ +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +public class StringCalculatorJunit5Test { + private StringCalculator stringCalculator = new StringCalculator(); + + @Nested + class AddTest { + @Test + void 빈_문자열() { + assertEquals(0, stringCalculator.add("")); + } + + @Test + void 하나의_숫자() { + assertEquals(1, stringCalculator.add("1")); + assertEquals(5, stringCalculator.add("5")); + } + + @Test + void 두_숫자_더하기() { + assertEquals(3, stringCalculator.add("1,2")); + assertEquals(7, stringCalculator.add("3,4")); + } + + @Test + void 여러_숫자_더하기() { + assertEquals(6, stringCalculator.add("1,2,3")); + assertEquals(15, stringCalculator.add("4,5,6")); + } + + @Test + void 커스텀_구분자() { + assertEquals(3, stringCalculator.add("//;\n1;2")); + assertEquals(12, stringCalculator.add("//;\n4;5,1:2")); + } + + @Test + void 음수_예외() { + Exception exception = assertThrows(RuntimeException.class, () -> { + stringCalculator.add("-1"); + }); + } + + @Test + void 숫자가_아닌_예외() { + Exception exception = assertThrows(RuntimeException.class, () -> { + stringCalculator.add("1,a"); + }); + } + } +} From 3d8b8971bcf78c19d6643e77bdeab6fd634b3bc3 Mon Sep 17 00:00:00 2001 From: asa9874 Date: Wed, 30 Jul 2025 13:07:08 +0900 Subject: [PATCH 05/16] =?UTF-8?q?build:=20assertj=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index 87254a3a..239f9e78 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,9 @@ repositories { dependencies { testImplementation platform('org.junit:junit-bom:5.9.1') + testImplementation platform('org.assertj:assertj-bom:3.25.1') testImplementation('org.junit.jupiter:junit-jupiter') + testImplementation('org.assertj:assertj-core') } test { From 5e55bf1c5d16b34dcab0de084494263963b61fa9 Mon Sep 17 00:00:00 2001 From: asa9874 Date: Wed, 30 Jul 2025 20:46:49 +0900 Subject: [PATCH 06/16] =?UTF-8?q?feat:=20CalculatorAssertJTest=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/CalculatorAssertJTest.java | 118 ++++++++++++++++++ src/test/java/CalculatorJunit5Test.java | 2 +- src/test/java/StringCalculatorJunit5Test.java | 4 +- 3 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 src/test/java/CalculatorAssertJTest.java diff --git a/src/test/java/CalculatorAssertJTest.java b/src/test/java/CalculatorAssertJTest.java new file mode 100644 index 00000000..c865e1b8 --- /dev/null +++ b/src/test/java/CalculatorAssertJTest.java @@ -0,0 +1,118 @@ +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +public class CalculatorAssertJTest { + + private final Calculator calculator = new Calculator(); + + @Nested + @DisplayName("덧셈 테스트") + public class AddTest { + + @Test + public void 정수_더하기() { + // Given + final int a = 2; + final int b = 3; + + // When + final int actual = calculator.add(a, b); + + // Then + final int expected = 5; + assertThat(actual).isEqualTo(expected); + } + } + + @Nested + @DisplayName("뺄셈 테스트") + public class SubtractTest { + + @Test + public void 정수_빼기() { + // Given + final int a = 3; + final int b = 2; + + // When + final int actual = calculator.subtract(a, b); + + // Then + final int expected = 1; + assertThat(actual).isEqualTo(expected); + } + } + + @Nested + @DisplayName("곱셈 테스트") + public class MultiplyTest { + + @Test + public void 정수_곱하기() { + // Given + final int a = 2; + final int b = 3; + + // When + final int actual = calculator.multiply(a, b); + + // Then + final int expected = 6; + assertThat(actual).isEqualTo(expected); + } + } + + @Nested + @DisplayName("나눗셈 테스트") + public class DivideTest { + + @Test + public void 정수_나누기() { + // Given + final int a = 6; + final int b = 3; + + // When + final int actual = calculator.divide(a, b); + + // Then + final int expected = 2; + assertThat(actual).isEqualTo(expected); + } + + @Test + public void 예외_0_나누기() { + // Given + final int a = 1; + final int b = 0; + + // When & Then + assertThatThrownBy(() -> calculator.divide(a, b)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("0 나누기 오류"); + + assertThatCode(() -> calculator.divide(b, a)) + .doesNotThrowAnyException(); + } + + @Test + public void 나누기_결과가_정수가_아닐때() { + // Given + final int a = 5; + final int b = 2; + + // When + final int actual = calculator.divide(a, b); + + // Then + final int expected = 2; // 결과값은 정수로 나옴 + assertThat(actual).isEqualTo(expected); + } + } + +} diff --git a/src/test/java/CalculatorJunit5Test.java b/src/test/java/CalculatorJunit5Test.java index 63e390c7..b3d4a6ad 100644 --- a/src/test/java/CalculatorJunit5Test.java +++ b/src/test/java/CalculatorJunit5Test.java @@ -6,7 +6,7 @@ public class CalculatorJunit5Test { - private Calculator calculator = new Calculator(); + private final Calculator calculator = new Calculator(); @Nested @DisplayName("덧셈 테스트") diff --git a/src/test/java/StringCalculatorJunit5Test.java b/src/test/java/StringCalculatorJunit5Test.java index 9acbbab3..4069d674 100644 --- a/src/test/java/StringCalculatorJunit5Test.java +++ b/src/test/java/StringCalculatorJunit5Test.java @@ -1,12 +1,14 @@ import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; public class StringCalculatorJunit5Test { - private StringCalculator stringCalculator = new StringCalculator(); + private final StringCalculator stringCalculator = new StringCalculator(); @Nested + @DisplayName("덧셈 테스트") class AddTest { @Test void 빈_문자열() { From b064456cc323fb1cf5865b08bb0cdd3db1b06960 Mon Sep 17 00:00:00 2001 From: asa9874 Date: Wed, 30 Jul 2025 20:53:06 +0900 Subject: [PATCH 07/16] =?UTF-8?q?feat:=20StringCalculatorAssertJTest=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/StringCalculatorAssertJTest.java | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 src/test/java/StringCalculatorAssertJTest.java diff --git a/src/test/java/StringCalculatorAssertJTest.java b/src/test/java/StringCalculatorAssertJTest.java new file mode 100644 index 00000000..f1012a8c --- /dev/null +++ b/src/test/java/StringCalculatorAssertJTest.java @@ -0,0 +1,99 @@ +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +public class StringCalculatorAssertJTest { + private final StringCalculator stringCalculator = new StringCalculator(); + + @Nested + @DisplayName("덧셈 테스트") + class AddTest { + @Test + void 빈_문자열() { + // Given + String input = ""; + + // When + int result = stringCalculator.add(input); + + // Then + assertThat(result).isEqualTo(0); + } + + @Test + void 하나의_숫자() { + // Given + String input = "1"; + + // When + int result = stringCalculator.add(input); + + // Then + assertThat(result).isEqualTo(1); + } + + @Test + void 두_숫자_더하기() { + // Given + String input = "1,2"; + + // When + int result = stringCalculator.add(input); + + // Then + assertThat(result).isEqualTo(3); + } + + @Test + void 여러_숫자_더하기() { + // Given + String input = "1,2,3"; + + // When + int result = stringCalculator.add(input); + + // Then + assertThat(result).isEqualTo(6); + } + + @Test + void 커스텀_구분자() { + // Given + String input = "//;\n4;5,1:2"; + + // When + int result = stringCalculator.add(input); + + // Then + assertThat(result).isEqualTo(12); + } + + @Test + void 음수_예외() { + // Given + String input = "-1"; + + // When & Then + assertThatThrownBy(() -> stringCalculator.add(input)) + .isInstanceOf(RuntimeException.class) + .hasMessageContaining("음수는 허용되지 않습니다"); + + } + + @Test + void 숫자가_아닌_예외() { + // Given + String input = "1,a"; + + // When & Then + assertThatThrownBy(() -> stringCalculator.add(input)) + .isInstanceOf(RuntimeException.class) + .hasMessageContaining("숫자가 아닌 값이 포함되어 있습니다"); + } + } +} From fa00843e83c57be9b0da89ffd906b6874a5b4637 Mon Sep 17 00:00:00 2001 From: asa9874 Date: Wed, 30 Jul 2025 21:03:49 +0900 Subject: [PATCH 08/16] =?UTF-8?q?refact:=20=EB=AF=B8=EC=82=AC=EC=9A=A9=20?= =?UTF-8?q?=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/CalculatorAssertJTest.java | 2 -- src/test/java/StringCalculatorAssertJTest.java | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/test/java/CalculatorAssertJTest.java b/src/test/java/CalculatorAssertJTest.java index c865e1b8..c98aa623 100644 --- a/src/test/java/CalculatorAssertJTest.java +++ b/src/test/java/CalculatorAssertJTest.java @@ -1,6 +1,4 @@ import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; diff --git a/src/test/java/StringCalculatorAssertJTest.java b/src/test/java/StringCalculatorAssertJTest.java index f1012a8c..49427ffe 100644 --- a/src/test/java/StringCalculatorAssertJTest.java +++ b/src/test/java/StringCalculatorAssertJTest.java @@ -1,6 +1,4 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; import static org.assertj.core.api.Assertions.*; import org.junit.jupiter.api.DisplayName; From 79c5831cb6372057a62436cb41a5c9a53aba9084 Mon Sep 17 00:00:00 2001 From: asa9874 Date: Thu, 31 Jul 2025 17:27:36 +0900 Subject: [PATCH 09/16] =?UTF-8?q?refact:=20StringUtils=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20isEmptyOr?= =?UTF-8?q?Null=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=8C=80=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + src/main/java/StringCalculator.java | 8 +++----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 239f9e78..82bb7c27 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,7 @@ repositories { } dependencies { + implementation("org.apache.commons:commons-lang3:3.18.0") testImplementation platform('org.junit:junit-bom:5.9.1') testImplementation platform('org.assertj:assertj-bom:3.25.1') testImplementation('org.junit.jupiter:junit-jupiter') diff --git a/src/main/java/StringCalculator.java b/src/main/java/StringCalculator.java index cb4c835a..1994f723 100644 --- a/src/main/java/StringCalculator.java +++ b/src/main/java/StringCalculator.java @@ -1,5 +1,7 @@ import java.util.Arrays; +import org.apache.commons.lang3.StringUtils; + public class StringCalculator { private final String delimiter = ",|:"; @@ -7,7 +9,7 @@ public int add(String input) { String delimiter = this.delimiter; - if (isEmptyOrNull(input)) { + if (StringUtils.isEmpty(input)) { return 0; } @@ -33,10 +35,6 @@ private int getSum(String[] numbers) { }).sum(); } - private boolean isEmptyOrNull(String input) { - return input == null || input.isEmpty(); - } - private boolean isNumber(String number) { return number.matches("-?\\d+"); } From 4b1116b71455c3fd2de65e1ffcc47cb1f734b170 Mon Sep 17 00:00:00 2001 From: asa9874 Date: Thu, 31 Jul 2025 17:30:18 +0900 Subject: [PATCH 10/16] =?UTF-8?q?refact:=20delimiter=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=83=81=EC=88=98=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/StringCalculator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/StringCalculator.java b/src/main/java/StringCalculator.java index 1994f723..2b7d35ef 100644 --- a/src/main/java/StringCalculator.java +++ b/src/main/java/StringCalculator.java @@ -3,7 +3,7 @@ import org.apache.commons.lang3.StringUtils; public class StringCalculator { - private final String delimiter = ",|:"; + private static String delimiter = ",|:"; public int add(String input) { From 2e0638f7a2edb16776c7b55d3e0df7843c487409 Mon Sep 17 00:00:00 2001 From: asa9874 Date: Thu, 31 Jul 2025 17:41:22 +0900 Subject: [PATCH 11/16] =?UTF-8?q?refact:=20=EC=A4=84=EB=B0=94=EA=BF=88=20?= =?UTF-8?q?=EC=BB=A8=EB=B2=A4=EC=85=98=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Calculator.java | 1 + src/main/java/StringCalculator.java | 2 +- src/test/java/StringCalculatorAssertJTest.java | 2 ++ src/test/java/StringCalculatorJunit5Test.java | 2 ++ 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/Calculator.java b/src/main/java/Calculator.java index 830ef136..91f85495 100644 --- a/src/main/java/Calculator.java +++ b/src/main/java/Calculator.java @@ -1,4 +1,5 @@ public class Calculator { + public int add(int a, int b) { return a + b; } diff --git a/src/main/java/StringCalculator.java b/src/main/java/StringCalculator.java index 2b7d35ef..93908740 100644 --- a/src/main/java/StringCalculator.java +++ b/src/main/java/StringCalculator.java @@ -3,10 +3,10 @@ import org.apache.commons.lang3.StringUtils; public class StringCalculator { + private static String delimiter = ",|:"; public int add(String input) { - String delimiter = this.delimiter; if (StringUtils.isEmpty(input)) { diff --git a/src/test/java/StringCalculatorAssertJTest.java b/src/test/java/StringCalculatorAssertJTest.java index 49427ffe..fb12372a 100644 --- a/src/test/java/StringCalculatorAssertJTest.java +++ b/src/test/java/StringCalculatorAssertJTest.java @@ -6,11 +6,13 @@ import org.junit.jupiter.api.Test; public class StringCalculatorAssertJTest { + private final StringCalculator stringCalculator = new StringCalculator(); @Nested @DisplayName("덧셈 테스트") class AddTest { + @Test void 빈_문자열() { // Given diff --git a/src/test/java/StringCalculatorJunit5Test.java b/src/test/java/StringCalculatorJunit5Test.java index 4069d674..f7c8a019 100644 --- a/src/test/java/StringCalculatorJunit5Test.java +++ b/src/test/java/StringCalculatorJunit5Test.java @@ -5,11 +5,13 @@ import org.junit.jupiter.api.Test; public class StringCalculatorJunit5Test { + private final StringCalculator stringCalculator = new StringCalculator(); @Nested @DisplayName("덧셈 테스트") class AddTest { + @Test void 빈_문자열() { assertEquals(0, stringCalculator.add("")); From c4083f046c2f30c415b8341d8a9a68d68c9fce57 Mon Sep 17 00:00:00 2001 From: asa9874 Date: Thu, 31 Jul 2025 18:32:18 +0900 Subject: [PATCH 12/16] =?UTF-8?q?refact:=20validate=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/StringCalculator.java | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/main/java/StringCalculator.java b/src/main/java/StringCalculator.java index 93908740..bab114df 100644 --- a/src/main/java/StringCalculator.java +++ b/src/main/java/StringCalculator.java @@ -24,23 +24,31 @@ public int add(String input) { private int getSum(String[] numbers) { return Arrays.stream(numbers).mapToInt(num -> { - if (!isNumber(num)) { - throw new RuntimeException("숫자가 아닌 값이 포함되어 있습니다"); - } + validateIsNumber(num); int number = Integer.parseInt(num); - if (number < 0) { - throw new RuntimeException("음수는 허용되지 않습니다"); - } + validateIsPositive(number); return number; }).sum(); } - private boolean isNumber(String number) { - return number.matches("-?\\d+"); + private void validateIsNumber(String number) { + if (!isNumber(number)) { + throw new RuntimeException("숫자가 아닌 값이 포함되어 있습니다"); + } + } + + private void validateIsPositive(Integer number) { + if (number < 0) { + throw new RuntimeException("음수는 허용되지 않습니다"); + } } private boolean hasCustomDelimiter(String input) { return input.startsWith("//"); } + private boolean isNumber(String number) { + return number.matches("-?\\d+"); + } + } From 11c767d2399b8ce1332131d6e205ab96d66df0d6 Mon Sep 17 00:00:00 2001 From: asa9874 Date: Thu, 31 Jul 2025 18:47:54 +0900 Subject: [PATCH 13/16] =?UTF-8?q?refact:=20StringCalculator=20extractCusto?= =?UTF-8?q?mDelimiter=EB=A1=9C=EC=A7=81=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/StringCalculator.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/StringCalculator.java b/src/main/java/StringCalculator.java index bab114df..8a972e28 100644 --- a/src/main/java/StringCalculator.java +++ b/src/main/java/StringCalculator.java @@ -4,19 +4,19 @@ public class StringCalculator { - private static String delimiter = ",|:"; + private static String DEFAULT_DELIMITER = ",|:"; + private String customDelimiter = ""; public int add(String input) { - String delimiter = this.delimiter; + String delimiter = DEFAULT_DELIMITER; if (StringUtils.isEmpty(input)) { return 0; } if (hasCustomDelimiter(input)) { - int endCustomDelimiterIndex = input.indexOf('\n'); - delimiter += "|" + input.substring(2, endCustomDelimiterIndex); - input = input.substring(endCustomDelimiterIndex + 1); + input = extractCustomDelimiter(input); + delimiter += "|" + this.customDelimiter; } return getSum(input.split(delimiter)); @@ -31,6 +31,12 @@ private int getSum(String[] numbers) { }).sum(); } + private String extractCustomDelimiter(String input) { + int endCustomDelimiterIndex = input.indexOf('\n'); + this.customDelimiter = input.substring(2, endCustomDelimiterIndex); + return input.substring(endCustomDelimiterIndex + 1); + } + private void validateIsNumber(String number) { if (!isNumber(number)) { throw new RuntimeException("숫자가 아닌 값이 포함되어 있습니다"); From f1add0a90cdf07154fbe047cb12b9912db608f74 Mon Sep 17 00:00:00 2001 From: asa9874 Date: Thu, 31 Jul 2025 18:50:20 +0900 Subject: [PATCH 14/16] =?UTF-8?q?refact:=20CalculatorAssertJTest=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=20fianl=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/CalculatorAssertJTest.java | 44 ++++++++++++------------ 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/test/java/CalculatorAssertJTest.java b/src/test/java/CalculatorAssertJTest.java index c98aa623..5820c2dc 100644 --- a/src/test/java/CalculatorAssertJTest.java +++ b/src/test/java/CalculatorAssertJTest.java @@ -15,14 +15,14 @@ public class AddTest { @Test public void 정수_더하기() { // Given - final int a = 2; - final int b = 3; + int a = 2; + int b = 3; // When - final int actual = calculator.add(a, b); + int actual = calculator.add(a, b); // Then - final int expected = 5; + int expected = 5; assertThat(actual).isEqualTo(expected); } } @@ -34,14 +34,14 @@ public class SubtractTest { @Test public void 정수_빼기() { // Given - final int a = 3; - final int b = 2; + int a = 3; + int b = 2; // When - final int actual = calculator.subtract(a, b); + int actual = calculator.subtract(a, b); // Then - final int expected = 1; + int expected = 1; assertThat(actual).isEqualTo(expected); } } @@ -53,14 +53,14 @@ public class MultiplyTest { @Test public void 정수_곱하기() { // Given - final int a = 2; - final int b = 3; + int a = 2; + int b = 3; // When - final int actual = calculator.multiply(a, b); + int actual = calculator.multiply(a, b); // Then - final int expected = 6; + int expected = 6; assertThat(actual).isEqualTo(expected); } } @@ -72,22 +72,22 @@ public class DivideTest { @Test public void 정수_나누기() { // Given - final int a = 6; - final int b = 3; + int a = 6; + int b = 3; // When - final int actual = calculator.divide(a, b); + int actual = calculator.divide(a, b); // Then - final int expected = 2; + int expected = 2; assertThat(actual).isEqualTo(expected); } @Test public void 예외_0_나누기() { // Given - final int a = 1; - final int b = 0; + int a = 1; + int b = 0; // When & Then assertThatThrownBy(() -> calculator.divide(a, b)) @@ -101,14 +101,14 @@ public class DivideTest { @Test public void 나누기_결과가_정수가_아닐때() { // Given - final int a = 5; - final int b = 2; + int a = 5; + int b = 2; // When - final int actual = calculator.divide(a, b); + int actual = calculator.divide(a, b); // Then - final int expected = 2; // 결과값은 정수로 나옴 + int expected = 2; // 결과값은 정수로 나옴 assertThat(actual).isEqualTo(expected); } } From afad03cb4997ba11ce249c0881f8cc0a5bb45df3 Mon Sep 17 00:00:00 2001 From: asa9874 Date: Thu, 31 Jul 2025 19:05:35 +0900 Subject: [PATCH 15/16] =?UTF-8?q?refact:=20=EB=A7=A4=EC=A7=81=EB=84=98?= =?UTF-8?q?=EB=B2=84=20=EC=83=81=EC=88=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/StringCalculator.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/StringCalculator.java b/src/main/java/StringCalculator.java index 8a972e28..3339b94b 100644 --- a/src/main/java/StringCalculator.java +++ b/src/main/java/StringCalculator.java @@ -4,7 +4,10 @@ public class StringCalculator { - private static String DEFAULT_DELIMITER = ",|:"; + private static final String DEFAULT_DELIMITER = ",|:"; + private static final String START_CUSTOM_DELIMITER = "//"; + private static final String END_CUSTOM_DELIMITER = "\n"; + private String customDelimiter = ""; public int add(String input) { @@ -32,8 +35,8 @@ private int getSum(String[] numbers) { } private String extractCustomDelimiter(String input) { - int endCustomDelimiterIndex = input.indexOf('\n'); - this.customDelimiter = input.substring(2, endCustomDelimiterIndex); + int endCustomDelimiterIndex = input.indexOf(END_CUSTOM_DELIMITER); + this.customDelimiter = input.substring(START_CUSTOM_DELIMITER.length(), endCustomDelimiterIndex); return input.substring(endCustomDelimiterIndex + 1); } @@ -50,7 +53,7 @@ private void validateIsPositive(Integer number) { } private boolean hasCustomDelimiter(String input) { - return input.startsWith("//"); + return input.startsWith(START_CUSTOM_DELIMITER); } private boolean isNumber(String number) { From 4e7e9ff488318ee9ed32236c13e73259dc8c3549 Mon Sep 17 00:00:00 2001 From: asa9874 Date: Sat, 2 Aug 2025 00:36:17 +0900 Subject: [PATCH 16/16] =?UTF-8?q?refact:=20Overflow=20=EB=B0=A9=EC=A7=80?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=B4=20Math=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Calculator.java | 8 ++++---- src/main/java/StringCalculator.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/Calculator.java b/src/main/java/Calculator.java index 91f85495..280838c9 100644 --- a/src/main/java/Calculator.java +++ b/src/main/java/Calculator.java @@ -1,15 +1,15 @@ public class Calculator { public int add(int a, int b) { - return a + b; + return Math.addExact(a, b); } public int subtract(int a, int b) { - return a - b; + return Math.subtractExact(a, b); } public int multiply(int a, int b) { - return a * b; + return Math.multiplyExact(a, b); } public int divide(int a, int b) { @@ -17,6 +17,6 @@ public int divide(int a, int b) { throw new IllegalArgumentException("0 나누기 오류"); } - return a / b; + return Math.floorDiv(a, b); } } diff --git a/src/main/java/StringCalculator.java b/src/main/java/StringCalculator.java index 3339b94b..f3c12457 100644 --- a/src/main/java/StringCalculator.java +++ b/src/main/java/StringCalculator.java @@ -31,7 +31,7 @@ private int getSum(String[] numbers) { int number = Integer.parseInt(num); validateIsPositive(number); return number; - }).sum(); + }).reduce(0, Math::addExact); } private String extractCustomDelimiter(String input) {