Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[문자열 덧셈 계산기] 한수정 미션 제출합니다. #1907

Open
wants to merge 12 commits into
base: main
Choose a base branch
from
Open
42 changes: 41 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,41 @@
# java-calculator-precourse
## java-calculator-precourse

# 📝 문자열 계산기 기능 목록


## 🔹 사용자로부터 문자열 입력 받기
- 프로그램이 시작되면 사용자가 덧셈할 문자열을 입력할 수 있도록 다음과 같은 문구를 출력한다. `덧셈할 문자열을 입력해 주세요.`
- 사용자로부터 구분자와 양수로 구성된 문자열을 입력 받는다.
- 사용자가 빈 문자열을 입력하면 0 을 반환한다.
"" => 0
- 그 외에도 형태를 벗어나거나 유효하지 않은 값이 입력되면 예외 처리를 수행한다.


## 🔹 사용자 입력 문자열 분리하기 with 기본 구분자
- 기본 구분자 쉼표(,) 또는 콜론(:)을 기준으로 문자열을 분리하고 숫자 추출

"1,2:3" => 1 2 3


## 🔹 사용자 입력 문자열 분리하기 with 커스텀 구분자
- 문자열 앞부분 "//"와 "\n" 사이에 커스텀 구분자를 지정한다.

"//;\n1;2;3" => 1 2 3 (커스텀 구분자: ;)


## 🔹 분리 된 숫자 합산하기
- 구분자를 기준으로 분리된 숫자들을 합산한 후 결과를 출력한다.

(입력값) 1 2 3 => (결과) 6


## 🔹 입력 값 IllegalArgumentException 예외 처리하기
- 사용자가 잘못된 형식의 문자열을 입력할 경우, 유효하지 않은 값은 예외 처리한다.
- 입력값이 숫자와 구분자가 아닌 경우 모두 예외로 처리
- 단, 공백(빈 문자열)의 경우 예외처리 하지 않고 숫자 0으로 처리

"1,,2" => 3
- 해당 예외가 발생하면 프로그램을 종료한다.



57 changes: 56 additions & 1 deletion src/main/java/calculator/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,62 @@
package calculator;

import camp.nextstep.edu.missionutils.Console;
import java.util.Arrays;

public class Application {
public static void main(String[] args) {
// TODO: 프로그램 구현
System.out.println("덧셈할 문자열을 입력해 주세요.");
String inputStr = Console.readLine();

try {
displayResult(isNull(inputStr) ? 0 : sumNum(splitInput(inputStr)));
} catch (IllegalArgumentException e) {
System.out.println("에러: " + e.getMessage()); // 구체적인 에러 메시지 출력
} finally {
Console.close();
}
}

// 입력 문자열을 처리하고 합산 결과 반환
private static String[] splitInput(String inputStr) {
if (inputStr.startsWith("//")) {
// "\n"으로 개행 문자 처리
String delimiter = inputStr.substring(2, inputStr.indexOf("\\n"));
inputStr = inputStr.substring(inputStr.indexOf("\\n") + 2);
return splitString(inputStr, delimiter);
}
return splitString(inputStr, ",|:"); // 기본 구분자 처리
}

// 분리된 문자열 합산
private static int sumNum(String[] numbers) {
return Arrays.stream(numbers).mapToInt(num -> {
try {
int intNum = Integer.parseInt(num);
if (intNum < 0) {
throw new IllegalArgumentException();
}
return intNum;
} catch (NumberFormatException e) {
throw new IllegalArgumentException();
}
}).sum();
}

// 문자열을 구분자로 분리하고 빈 문자열을 무시
private static String[] splitString(String inputStr, String delimiter) {
return Arrays.stream(inputStr.split(delimiter))
.filter(s -> !isNull(s)) // 빈 문자열 무시
.toArray(String[]::new);
}

// 결과 출력
private static void displayResult(int result) {
System.out.println("결과: " + result);
}

// 문자열이 null 또는 빈 문자열인지 확인
private static boolean isNull(String s) {
return s == null || s.isEmpty();
}
}