From 07d1d2b5cbec3092399796bba07d8a2e7040a8c7 Mon Sep 17 00:00:00 2001 From: dldb-chamchi Date: Wed, 30 Jul 2025 16:04:01 +0900 Subject: [PATCH 01/14] =?UTF-8?q?feat:=20=EA=B0=84=EB=8B=A8=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=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/SimpleCalculator.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/SimpleCalculator.java diff --git a/src/main/java/SimpleCalculator.java b/src/main/java/SimpleCalculator.java new file mode 100644 index 00000000..d561fa63 --- /dev/null +++ b/src/main/java/SimpleCalculator.java @@ -0,0 +1,16 @@ +public class SimpleCalculator { + + public int add(int firstNum, int secondNum){ + return firstNum + secondNum; + } + public int multiply(int firstNum, int secondNum){ + return firstNum * secondNum; + } + public int divide(int firstNum, int secondNum){ + return firstNum / secondNum; + } + public int minus(int firstNum, int secondNum){ + return firstNum - secondNum; + } + +} From b1fb8fa79f7b618959c86acc7af5dc85b74a07aa Mon Sep 17 00:00:00 2001 From: dldb-chamchi Date: Wed, 30 Jul 2025 17:01:30 +0900 Subject: [PATCH 02/14] =?UTF-8?q?feat:=20=EB=AC=B8=EC=9E=90=EC=97=B4=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=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/StringCalculator.java | 77 +++++++++++++++++++++++++++++ 1 file changed, 77 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..e6ebd7e1 --- /dev/null +++ b/src/main/java/StringCalculator.java @@ -0,0 +1,77 @@ +import java.util.regex.Pattern; + +public class StringCalculator { + + //입력 문자열이 null인지 확인 + public String checkInput(String input){ + if(input == null) throw new RuntimeException("null은 허용되지 않습니다."); + return input; + } + + //커스텀 구분자가 있는지 확인 + public int checkDelimiter(String checkedInput) { + if(checkedInput.isEmpty()) return -2; //문자열이 빈 경우 + + + if (checkedInput.startsWith("//")) { //커스텀 구분자를 설정하는가? + int idx = checkedInput.indexOf("\n"); //제대로된 형식인가? + if (idx == -1) throw new RuntimeException("잘못된 커스텀 구분자 형식입니다."); + return idx; //구분자 위치 전달 + } + + return -1; //기본 구분자대로 문자열을 나눔 + } + + private String[] splitInput(String checkedInput, int idx){ + if(idx == -1){ + String delimiter = "[,:]"; + return checkedInput.split(delimiter); //기본 구분자대로 나누기 + } + else if(idx == -2){ + return new String[0]; //빈 문자열인 경우 + } + else{ + String delimiter = checkedInput.substring(2, idx); //구분자 나누기 + String regex = Pattern.quote(delimiter); //정규표현식에 사용되는 문자가 커스텀 구분자일 경우를 위해 설정 + return checkedInput.substring(idx + 1).split(regex); //커스텀 구분자대로 문자열을 나눔 + } + } + + //문자열 덧셈 실행 + public int sum(String[] strings){ + if(strings.length == 0) return 0; + + int sum = 0; + + for(var n : strings){ + if(n.isEmpty()) throw new RuntimeException("빈 문자열입니다."); + + int num = checkException(n); + + //예외 처리 + if(sum > Integer.MAX_VALUE - num || sum < Integer.MIN_VALUE + num) throw new RuntimeException("int 범위를 벗어났습니다."); + + sum += num; + } + return sum; + } + + private int checkException(String n){ + int num; + try{ + num = Integer.parseInt(n); + if(num < 0) throw new RuntimeException("음수는 입력이 불가합니다."); + } + catch(NumberFormatException msg){ + throw new RuntimeException("int 값을 벗어났거나 잘못된 숫자 형식입니다."); + } + return num; + } + + public int calculate(String input){ + String checkedInput = checkInput(input); + int idx = checkDelimiter(checkedInput); + String[] strings = splitInput(checkedInput, idx); + return sum(strings); + } +} From c84322e22151ea42dcf204801c28ba9008f6e261 Mon Sep 17 00:00:00 2001 From: dldb-chamchi Date: Wed, 30 Jul 2025 17:21:35 +0900 Subject: [PATCH 03/14] =?UTF-8?q?feat:=20=EC=98=88=EC=99=B8=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=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/SimpleCalculator.java | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/main/java/SimpleCalculator.java b/src/main/java/SimpleCalculator.java index d561fa63..464efbd4 100644 --- a/src/main/java/SimpleCalculator.java +++ b/src/main/java/SimpleCalculator.java @@ -1,16 +1,24 @@ public class SimpleCalculator { - public int add(int firstNum, int secondNum){ - return firstNum + secondNum; + public int add(int a, int b) { + return Math.addExact(a, b); } - public int multiply(int firstNum, int secondNum){ - return firstNum * secondNum; - } - public int divide(int firstNum, int secondNum){ - return firstNum / secondNum; + + public int minus(int a, int b) { + return Math.subtractExact(a, b); } - public int minus(int firstNum, int secondNum){ - return firstNum - secondNum; + + public int multiply(int a, int b) { + return Math.multiplyExact(a, b); } + public int divide(int a, int b) { + if (b == 0) { + throw new ArithmeticException("0으로 나눌 수 없습니다."); + } + if (a == Integer.MIN_VALUE && b == -1) { + throw new ArithmeticException("정수 범위를 벗어났습니다."); + } + return a / b; + } } From 8f42c55dbb5f722badc6fdacd7a1f8a2fb50682a Mon Sep 17 00:00:00 2001 From: dldb-chamchi Date: Wed, 30 Jul 2025 17:31:59 +0900 Subject: [PATCH 04/14] =?UTF-8?q?feat:=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..dc73cfb8 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,8 @@ repositories { dependencies { testImplementation platform('org.junit:junit-bom:5.9.1') testImplementation('org.junit.jupiter:junit-jupiter') + testImplementation platform('org.assertj:assertj-bom:3.25.1') + testImplementation('org.assertj:assertj-core') } test { From 932fac5be913fc2a86b94c1071f9c36e56081f7b Mon Sep 17 00:00:00 2001 From: dldb-chamchi Date: Wed, 30 Jul 2025 17:35:01 +0900 Subject: [PATCH 05/14] =?UTF-8?q?feat:=20=EC=B4=88=EA=B0=84=EB=8B=A8=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=EA=B8=B0=20=ED=85=8C=EC=8A=A4=ED=8A=B8=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 --- src/test/java/SimpleCalculatorTest.java | 51 +++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/test/java/SimpleCalculatorTest.java diff --git a/src/test/java/SimpleCalculatorTest.java b/src/test/java/SimpleCalculatorTest.java new file mode 100644 index 00000000..078ec01d --- /dev/null +++ b/src/test/java/SimpleCalculatorTest.java @@ -0,0 +1,51 @@ +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import static org.assertj.core.api.Assertions.assertThat; + +public class SimpleCalculatorTest { + @Nested + class SimpleTest { + + @Test + void addTest(){ + SimpleCalculator calc = new SimpleCalculator(); + assertEquals(3, calc.add(1, 2)); + assertEquals(5, calc.add(3, 2)); + } + + @Test + void minusTest(){ + SimpleCalculator calc = new SimpleCalculator(); + assertEquals(3, calc.minus(5, 2)); + assertEquals(-2, calc.minus(3, 5)); + } + + @Test + void multiply(){ + SimpleCalculator calc = new SimpleCalculator(); + assertEquals(10, calc.multiply(5, 2)); + assertEquals(15, calc.multiply(3, 5)); + } + + @Test + void divide(){ + SimpleCalculator calc = new SimpleCalculator(); + assertEquals(5, calc.divide(10, 2)); + assertEquals(30, calc.divide(180, 6)); + } + } + + @Nested + class CalculatorTest{ + @Test + void simpleCalcTest(){ + SimpleCalculator calc = new SimpleCalculator(); + assertThat(calc.add(1, 2)).isEqualTo(3); + assertThat(calc.minus(1,2)).isEqualTo(-1); + assertThat(calc.divide(4, 2)).isEqualTo(2); + assertThat(calc.multiply(3,2)).isEqualTo(6); + } + } +} From 99257334cc7ba7b980bd3510a2c44fc69bcc8a45 Mon Sep 17 00:00:00 2001 From: dldb-chamchi Date: Wed, 30 Jul 2025 17:46:08 +0900 Subject: [PATCH 06/14] =?UTF-8?q?feat:=20=EC=B4=88=EA=B0=84=EB=8B=A8=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=EA=B8=B0=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/SimpleCalculatorTest.java | 28 +++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/test/java/SimpleCalculatorTest.java b/src/test/java/SimpleCalculatorTest.java index 078ec01d..2ae685dc 100644 --- a/src/test/java/SimpleCalculatorTest.java +++ b/src/test/java/SimpleCalculatorTest.java @@ -1,5 +1,7 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.assertj.core.api.Assertions.assertThat; @@ -9,32 +11,50 @@ public class SimpleCalculatorTest { class SimpleTest { @Test - void addTest(){ + void addTest() { SimpleCalculator calc = new SimpleCalculator(); assertEquals(3, calc.add(1, 2)); assertEquals(5, calc.add(3, 2)); } @Test - void minusTest(){ + void minusTest() { SimpleCalculator calc = new SimpleCalculator(); assertEquals(3, calc.minus(5, 2)); assertEquals(-2, calc.minus(3, 5)); } @Test - void multiply(){ + void multiply() { SimpleCalculator calc = new SimpleCalculator(); assertEquals(10, calc.multiply(5, 2)); assertEquals(15, calc.multiply(3, 5)); } @Test - void divide(){ + void divide() { SimpleCalculator calc = new SimpleCalculator(); assertEquals(5, calc.divide(10, 2)); assertEquals(30, calc.divide(180, 6)); } + + @Test + void errorTestDivideZero() { + SimpleCalculator calc = new SimpleCalculator(); + assertThatThrownBy(() -> calc.divide(2, 0)).isInstanceOf(ArithmeticException.class); + } + + @Test + void errorTestOverFlowMinus() { + SimpleCalculator calc = new SimpleCalculator(); + assertThatThrownBy(() -> calc.minus(Integer.MAX_VALUE, -3)).isInstanceOf(ArithmeticException.class); + } + + @Test + void errorTestOverFlowMultiply() { + SimpleCalculator calc = new SimpleCalculator(); + assertThatThrownBy(() -> calc.multiply(Integer.MAX_VALUE, 3)).isInstanceOf(ArithmeticException.class); + } } @Nested From 0964cff3320ae0f4063671aa73d4ee0bb52f9981 Mon Sep 17 00:00:00 2001 From: dldb-chamchi Date: Wed, 30 Jul 2025 18:54:01 +0900 Subject: [PATCH 07/14] =?UTF-8?q?fix:=20=EC=BB=A8=EB=B2=A4=EC=85=98,=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/StringCalculator.java | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/main/java/StringCalculator.java b/src/main/java/StringCalculator.java index e6ebd7e1..10b10e9e 100644 --- a/src/main/java/StringCalculator.java +++ b/src/main/java/StringCalculator.java @@ -2,17 +2,14 @@ public class StringCalculator { - //입력 문자열이 null인지 확인 public String checkInput(String input){ if(input == null) throw new RuntimeException("null은 허용되지 않습니다."); return input; } - //커스텀 구분자가 있는지 확인 public int checkDelimiter(String checkedInput) { if(checkedInput.isEmpty()) return -2; //문자열이 빈 경우 - if (checkedInput.startsWith("//")) { //커스텀 구분자를 설정하는가? int idx = checkedInput.indexOf("\n"); //제대로된 형식인가? if (idx == -1) throw new RuntimeException("잘못된 커스텀 구분자 형식입니다."); @@ -25,19 +22,18 @@ public int checkDelimiter(String checkedInput) { private String[] splitInput(String checkedInput, int idx){ if(idx == -1){ String delimiter = "[,:]"; - return checkedInput.split(delimiter); //기본 구분자대로 나누기 + return checkedInput.split(delimiter); } else if(idx == -2){ return new String[0]; //빈 문자열인 경우 } else{ - String delimiter = checkedInput.substring(2, idx); //구분자 나누기 - String regex = Pattern.quote(delimiter); //정규표현식에 사용되는 문자가 커스텀 구분자일 경우를 위해 설정 - return checkedInput.substring(idx + 1).split(regex); //커스텀 구분자대로 문자열을 나눔 + String delimiter = checkedInput.substring(2, idx); + String regex = Pattern.quote(delimiter); + return checkedInput.substring(idx + 1).split(regex); } } - //문자열 덧셈 실행 public int sum(String[] strings){ if(strings.length == 0) return 0; @@ -48,7 +44,6 @@ public int sum(String[] strings){ int num = checkException(n); - //예외 처리 if(sum > Integer.MAX_VALUE - num || sum < Integer.MIN_VALUE + num) throw new RuntimeException("int 범위를 벗어났습니다."); sum += num; From 60207fc534ef5e5a82156590e98c1d6caf143844 Mon Sep 17 00:00:00 2001 From: dldb-chamchi Date: Wed, 30 Jul 2025 18:55:02 +0900 Subject: [PATCH 08/14] =?UTF-8?q?feat:=20=EB=AC=B8=EC=9E=90=EC=97=B4=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=EA=B8=B0=20=ED=85=8C=EC=8A=A4=ED=8A=B8=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 --- src/test/java/StringCalculatorTest.java | 44 +++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/test/java/StringCalculatorTest.java diff --git a/src/test/java/StringCalculatorTest.java b/src/test/java/StringCalculatorTest.java new file mode 100644 index 00000000..8ec9e70c --- /dev/null +++ b/src/test/java/StringCalculatorTest.java @@ -0,0 +1,44 @@ +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class StringCalculatorTest { + @Nested + class StringTest{ + @Test + void defaultDelimiterTest(){ + StringCalculator calc = new StringCalculator(); + assertEquals(3, calc.calculate("1,2")); + assertEquals(6, calc.calculate("1,2,3")); + assertEquals(3, calc.calculate("1:2")); + assertEquals(38, calc.calculate("1:2,3:4,5:6:7:10")); + } + + @Test + void customDelimiterTest(){ + StringCalculator calc = new StringCalculator(); + assertEquals(6, calc.calculate("//;\n1;2;3")); + assertEquals(5, calc.calculate("//;;\n1;;1;;2;;1")); + assertEquals(6, calc.calculate("//.\n1.2.3")); + assertEquals(3, calc.calculate("//|\n1|2")); + assertEquals(101, calc.calculate("//?\n10?11?12?13?14?20?21")); + } + + @Test + void exceptionTest(){ + StringCalculator calc = new StringCalculator(); + + assertThatThrownBy(() -> calc.calculate("-1,2")).isInstanceOf(RuntimeException.class); + assertThatThrownBy(() -> calc.calculate("2147483647,10")).isInstanceOf(RuntimeException.class); + } + + @Test + void blankTest(){ + StringCalculator calc = new StringCalculator(); + assertEquals(0, calc.calculate("")); + assertThatThrownBy(() -> calc.calculate(" ")).isInstanceOf(RuntimeException.class); + } + } +} From bc1e5b68f075b5b22fbb84e752fecd47c120d0f9 Mon Sep 17 00:00:00 2001 From: dldb-chamchi Date: Thu, 31 Jul 2025 15:18:18 +0900 Subject: [PATCH 09/14] =?UTF-8?q?fix:=20=EC=BB=A8=EB=B2=A4=EC=85=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/SimpleCalculatorTest.java | 11 +++-------- src/test/java/StringCalculatorTest.java | 10 +++++----- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/test/java/SimpleCalculatorTest.java b/src/test/java/SimpleCalculatorTest.java index 2ae685dc..705b6380 100644 --- a/src/test/java/SimpleCalculatorTest.java +++ b/src/test/java/SimpleCalculatorTest.java @@ -7,52 +7,48 @@ import static org.assertj.core.api.Assertions.assertThat; public class SimpleCalculatorTest { + + private final SimpleCalculator calc = new SimpleCalculator(); + @Nested class SimpleTest { @Test void addTest() { - SimpleCalculator calc = new SimpleCalculator(); assertEquals(3, calc.add(1, 2)); assertEquals(5, calc.add(3, 2)); } @Test void minusTest() { - SimpleCalculator calc = new SimpleCalculator(); assertEquals(3, calc.minus(5, 2)); assertEquals(-2, calc.minus(3, 5)); } @Test void multiply() { - SimpleCalculator calc = new SimpleCalculator(); assertEquals(10, calc.multiply(5, 2)); assertEquals(15, calc.multiply(3, 5)); } @Test void divide() { - SimpleCalculator calc = new SimpleCalculator(); assertEquals(5, calc.divide(10, 2)); assertEquals(30, calc.divide(180, 6)); } @Test void errorTestDivideZero() { - SimpleCalculator calc = new SimpleCalculator(); assertThatThrownBy(() -> calc.divide(2, 0)).isInstanceOf(ArithmeticException.class); } @Test void errorTestOverFlowMinus() { - SimpleCalculator calc = new SimpleCalculator(); assertThatThrownBy(() -> calc.minus(Integer.MAX_VALUE, -3)).isInstanceOf(ArithmeticException.class); } @Test void errorTestOverFlowMultiply() { - SimpleCalculator calc = new SimpleCalculator(); assertThatThrownBy(() -> calc.multiply(Integer.MAX_VALUE, 3)).isInstanceOf(ArithmeticException.class); } } @@ -61,7 +57,6 @@ void errorTestOverFlowMultiply() { class CalculatorTest{ @Test void simpleCalcTest(){ - SimpleCalculator calc = new SimpleCalculator(); assertThat(calc.add(1, 2)).isEqualTo(3); assertThat(calc.minus(1,2)).isEqualTo(-1); assertThat(calc.divide(4, 2)).isEqualTo(2); diff --git a/src/test/java/StringCalculatorTest.java b/src/test/java/StringCalculatorTest.java index 8ec9e70c..79a8b6d2 100644 --- a/src/test/java/StringCalculatorTest.java +++ b/src/test/java/StringCalculatorTest.java @@ -5,11 +5,14 @@ import static org.junit.jupiter.api.Assertions.assertEquals; public class StringCalculatorTest { + + private final StringCalculator calc = new StringCalculator(); + @Nested class StringTest{ + @Test void defaultDelimiterTest(){ - StringCalculator calc = new StringCalculator(); assertEquals(3, calc.calculate("1,2")); assertEquals(6, calc.calculate("1,2,3")); assertEquals(3, calc.calculate("1:2")); @@ -18,7 +21,6 @@ void defaultDelimiterTest(){ @Test void customDelimiterTest(){ - StringCalculator calc = new StringCalculator(); assertEquals(6, calc.calculate("//;\n1;2;3")); assertEquals(5, calc.calculate("//;;\n1;;1;;2;;1")); assertEquals(6, calc.calculate("//.\n1.2.3")); @@ -28,15 +30,13 @@ void customDelimiterTest(){ @Test void exceptionTest(){ - StringCalculator calc = new StringCalculator(); - assertThatThrownBy(() -> calc.calculate("-1,2")).isInstanceOf(RuntimeException.class); assertThatThrownBy(() -> calc.calculate("2147483647,10")).isInstanceOf(RuntimeException.class); + assertThatThrownBy(() -> calc.calculate("hello")).isInstanceOf(RuntimeException.class); } @Test void blankTest(){ - StringCalculator calc = new StringCalculator(); assertEquals(0, calc.calculate("")); assertThatThrownBy(() -> calc.calculate(" ")).isInstanceOf(RuntimeException.class); } From 3c536b76a1deca93322b8fa807050982bc366b5d Mon Sep 17 00:00:00 2001 From: dldb-chamchi Date: Fri, 1 Aug 2025 23:02:39 +0900 Subject: [PATCH 10/14] =?UTF-8?q?fix:=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EB=AA=85=20&=20=EB=B3=80=EC=88=98=20=EB=AA=85=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/StringCalculator.java | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/StringCalculator.java b/src/main/java/StringCalculator.java index 10b10e9e..0f57dc14 100644 --- a/src/main/java/StringCalculator.java +++ b/src/main/java/StringCalculator.java @@ -2,18 +2,18 @@ public class StringCalculator { - public String checkInput(String input){ + public String validateInput(String input){ if(input == null) throw new RuntimeException("null은 허용되지 않습니다."); return input; } - public int checkDelimiter(String checkedInput) { - if(checkedInput.isEmpty()) return -2; //문자열이 빈 경우 + public int getDelimiter(String input) { + if(input.isEmpty()) return -2; //문자열이 빈 경우 - if (checkedInput.startsWith("//")) { //커스텀 구분자를 설정하는가? - int idx = checkedInput.indexOf("\n"); //제대로된 형식인가? - if (idx == -1) throw new RuntimeException("잘못된 커스텀 구분자 형식입니다."); - return idx; //구분자 위치 전달 + if (input.startsWith("//")) { + int delimiterIdx = input.indexOf("\n"); + if (delimiterIdx == -1) throw new RuntimeException("잘못된 커스텀 구분자 형식입니다."); + return delimiterIdx; } return -1; //기본 구분자대로 문자열을 나눔 @@ -42,7 +42,7 @@ public int sum(String[] strings){ for(var n : strings){ if(n.isEmpty()) throw new RuntimeException("빈 문자열입니다."); - int num = checkException(n); + int num = validateNumbers(n); if(sum > Integer.MAX_VALUE - num || sum < Integer.MIN_VALUE + num) throw new RuntimeException("int 범위를 벗어났습니다."); @@ -51,7 +51,7 @@ public int sum(String[] strings){ return sum; } - private int checkException(String n){ + private int validateNumbers(String n){ int num; try{ num = Integer.parseInt(n); @@ -64,8 +64,8 @@ private int checkException(String n){ } public int calculate(String input){ - String checkedInput = checkInput(input); - int idx = checkDelimiter(checkedInput); + String checkedInput = validateInput(input); + int idx = getDelimiter(checkedInput); String[] strings = splitInput(checkedInput, idx); return sum(strings); } From c8872708e453e2ae6c3b5833b470ec193ab43ca1 Mon Sep 17 00:00:00 2001 From: dldb-chamchi Date: Fri, 1 Aug 2025 23:19:57 +0900 Subject: [PATCH 11/14] =?UTF-8?q?feat:=20=EB=8D=A7=EC=85=88,=20=EB=82=98?= =?UTF-8?q?=EB=88=97=EC=85=88=20=EC=98=A4=EB=B2=84=ED=94=8C=EB=A1=9C?= =?UTF-8?q?=EC=9A=B0=20=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 --- src/test/java/SimpleCalculatorTest.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/test/java/SimpleCalculatorTest.java b/src/test/java/SimpleCalculatorTest.java index 705b6380..cbbe2c24 100644 --- a/src/test/java/SimpleCalculatorTest.java +++ b/src/test/java/SimpleCalculatorTest.java @@ -43,13 +43,11 @@ void errorTestDivideZero() { } @Test - void errorTestOverFlowMinus() { + void errorTestOverFlow() { + assertThatThrownBy(() -> calc.add(Integer.MAX_VALUE, 1)).isInstanceOf(ArithmeticException.class); assertThatThrownBy(() -> calc.minus(Integer.MAX_VALUE, -3)).isInstanceOf(ArithmeticException.class); - } - - @Test - void errorTestOverFlowMultiply() { assertThatThrownBy(() -> calc.multiply(Integer.MAX_VALUE, 3)).isInstanceOf(ArithmeticException.class); + assertThatThrownBy(() -> calc.divide(Integer.MIN_VALUE, -1)).isInstanceOf(ArithmeticException.class); } } From d640c8c2cefb72d8264837c0c02f49c5c2286e61 Mon Sep 17 00:00:00 2001 From: dldb-chamchi Date: Fri, 1 Aug 2025 23:24:35 +0900 Subject: [PATCH 12/14] =?UTF-8?q?fix:=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC(Junit5,=20AssertJ)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/SimpleCalculatorTest.java | 26 ++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/test/java/SimpleCalculatorTest.java b/src/test/java/SimpleCalculatorTest.java index cbbe2c24..ca69d14c 100644 --- a/src/test/java/SimpleCalculatorTest.java +++ b/src/test/java/SimpleCalculatorTest.java @@ -3,7 +3,6 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertEquals; - import static org.assertj.core.api.Assertions.assertThat; public class SimpleCalculatorTest { @@ -11,7 +10,7 @@ public class SimpleCalculatorTest { private final SimpleCalculator calc = new SimpleCalculator(); @Nested - class SimpleTest { + class TestWithJunit5 { @Test void addTest() { @@ -36,6 +35,18 @@ void divide() { assertEquals(5, calc.divide(10, 2)); assertEquals(30, calc.divide(180, 6)); } + } + + @Nested + class TestWithAssertJ { + + @Test + void simpleCalcTest(){ + assertThat(calc.add(1, 2)).isEqualTo(3); + assertThat(calc.minus(1,2)).isEqualTo(-1); + assertThat(calc.divide(4, 2)).isEqualTo(2); + assertThat(calc.multiply(3,2)).isEqualTo(6); + } @Test void errorTestDivideZero() { @@ -50,15 +61,4 @@ void errorTestOverFlow() { assertThatThrownBy(() -> calc.divide(Integer.MIN_VALUE, -1)).isInstanceOf(ArithmeticException.class); } } - - @Nested - class CalculatorTest{ - @Test - void simpleCalcTest(){ - assertThat(calc.add(1, 2)).isEqualTo(3); - assertThat(calc.minus(1,2)).isEqualTo(-1); - assertThat(calc.divide(4, 2)).isEqualTo(2); - assertThat(calc.multiply(3,2)).isEqualTo(6); - } - } } From 06bbd9f65ff8f28d06593e52240af7a43fa85a9c Mon Sep 17 00:00:00 2001 From: dldb-chamchi Date: Sat, 2 Aug 2025 11:05:35 +0900 Subject: [PATCH 13/14] =?UTF-8?q?fix:=20=EB=B9=88=EC=B9=B8=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=EC=9D=80=20=EB=B0=94=EB=A1=9C=20return=200=20?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/StringCalculator.java | 52 ++++++++++++++++------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/src/main/java/StringCalculator.java b/src/main/java/StringCalculator.java index 0f57dc14..6074ee27 100644 --- a/src/main/java/StringCalculator.java +++ b/src/main/java/StringCalculator.java @@ -2,49 +2,50 @@ public class StringCalculator { - public String validateInput(String input){ - if(input == null) throw new RuntimeException("null은 허용되지 않습니다."); - return input; + private void validateInput(String input){ + if (input == null){ + throw new RuntimeException("null은 허용되지 않습니다."); + } } - public int getDelimiter(String input) { - if(input.isEmpty()) return -2; //문자열이 빈 경우 - + private int getDelimiterIndex(String input) { if (input.startsWith("//")) { int delimiterIdx = input.indexOf("\n"); - if (delimiterIdx == -1) throw new RuntimeException("잘못된 커스텀 구분자 형식입니다."); + if (delimiterIdx == -1){ + throw new RuntimeException("잘못된 커스텀 구분자 형식입니다."); + } return delimiterIdx; } - return -1; //기본 구분자대로 문자열을 나눔 } - private String[] splitInput(String checkedInput, int idx){ - if(idx == -1){ + private String[] splitInput(String checkedInput, int delimiterIdx){ + if (delimiterIdx == -1){ String delimiter = "[,:]"; return checkedInput.split(delimiter); } - else if(idx == -2){ - return new String[0]; //빈 문자열인 경우 - } else{ - String delimiter = checkedInput.substring(2, idx); + String delimiter = checkedInput.substring(2, delimiterIdx); String regex = Pattern.quote(delimiter); - return checkedInput.substring(idx + 1).split(regex); + return checkedInput.substring(delimiterIdx + 1).split(regex); } } - public int sum(String[] strings){ - if(strings.length == 0) return 0; + private int sum(String[] strings){ + if (strings.length == 0){ + return 0; + } int sum = 0; for(var n : strings){ - if(n.isEmpty()) throw new RuntimeException("빈 문자열입니다."); + if (n.isEmpty()){ + throw new RuntimeException("빈 문자열입니다."); + } int num = validateNumbers(n); - if(sum > Integer.MAX_VALUE - num || sum < Integer.MIN_VALUE + num) throw new RuntimeException("int 범위를 벗어났습니다."); + if (sum > Integer.MAX_VALUE - num || sum < Integer.MIN_VALUE + num) throw new RuntimeException("int 범위를 벗어났습니다."); sum += num; } @@ -55,7 +56,9 @@ private int validateNumbers(String n){ int num; try{ num = Integer.parseInt(n); - if(num < 0) throw new RuntimeException("음수는 입력이 불가합니다."); + if (num < 0){ + throw new RuntimeException("음수는 입력이 불가합니다."); + } } catch(NumberFormatException msg){ throw new RuntimeException("int 값을 벗어났거나 잘못된 숫자 형식입니다."); @@ -64,9 +67,12 @@ private int validateNumbers(String n){ } public int calculate(String input){ - String checkedInput = validateInput(input); - int idx = getDelimiter(checkedInput); - String[] strings = splitInput(checkedInput, idx); + validateInput(input); + if (input.isEmpty()){ + return 0; + } + int delimiterIndex = getDelimiterIndex(input); + String[] strings = splitInput(input, delimiterIndex); return sum(strings); } } From 0ab48d28ea6175a2d55a6fb7afc866b9f43d8abe Mon Sep 17 00:00:00 2001 From: dldb-chamchi Date: Sat, 2 Aug 2025 11:06:17 +0900 Subject: [PATCH 14/14] =?UTF-8?q?refactor:=20hasMessage=EB=A5=BC=20?= =?UTF-8?q?=ED=86=B5=ED=95=9C=20=EC=98=88=EC=99=B8=20=EB=AC=B8=EA=B5=AC=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/StringCalculatorTest.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/test/java/StringCalculatorTest.java b/src/test/java/StringCalculatorTest.java index 79a8b6d2..746262ae 100644 --- a/src/test/java/StringCalculatorTest.java +++ b/src/test/java/StringCalculatorTest.java @@ -30,9 +30,12 @@ void customDelimiterTest(){ @Test void exceptionTest(){ - assertThatThrownBy(() -> calc.calculate("-1,2")).isInstanceOf(RuntimeException.class); - assertThatThrownBy(() -> calc.calculate("2147483647,10")).isInstanceOf(RuntimeException.class); - assertThatThrownBy(() -> calc.calculate("hello")).isInstanceOf(RuntimeException.class); + assertThatThrownBy(() -> calc.calculate("-1,2")).isInstanceOf(RuntimeException.class). + hasMessageContaining("음수는 입력이 불가합니다."); + assertThatThrownBy(() -> calc.calculate("2147483647,10")).isInstanceOf(RuntimeException.class). + hasMessageContaining("int 범위를 벗어났습니다."); + assertThatThrownBy(() -> calc.calculate("hello")).isInstanceOf(RuntimeException.class). + hasMessageContaining("int 값을 벗어났거나 잘못된 숫자 형식입니다."); } @Test