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

[문자열 덧셈 계산기] 제출합니다. #1897

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 65 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,65 @@
# java-calculator-precourse
# 문자열 덧셈 계산기

## 📄 **프로그램 플로우**

1. 사용자에게 입력을 요청한다.
2. 사용자에게 문자열을 입력 받는다.
3. 사용자가 입력한 문자열을 덧셈 연산한다.
4. 연산 결과를 출력한다.

## ⁉️ 요구사항에 대한 **의문점**

- **입력 값의 범위에 대한 의문**

- ✅ 구분자와 양수로 구성된 문자열만 입력 받을 수 있다.

- ⇒ 양수가 의미하는 것이 ‘양의 정수’를 의미하는 것인지, 양의 부호를 가진 실수 범위까지 모두 포함하는 것인지.

- **입력의 개수에 대한 의문**

- ✅ 양수가 0개만 입력되었을 경우

- ⇒ 0을 출력한다.

- ✅ 양수가 1개만 입력되었을 경우

- ⇒ 예외 처리를 해야 할지, 입력된 1개의 수를 출력할지 고민을 해보았는데,

- 1개의 수를 입력했다는 것이 예외 처리를 하고 프로그램을 종료할 정도로 프로그램의 정체성을 해치지 않는다고 판단하여 입력된 수를 그대로 출력한다.

- ✅ 양수가 1개 이상 입력되었을 경우

- ⇒ 정상적으로 다음 로직을 실행한다.

- **커스텀 구분자에 대한 의문**

- ✅ 커스텀 구분자에 2개의 특수 문자를 복합적으로 사용할 수 있는가?

- ex) ?!, /?, /!, %!, #%, !!, >!, …

- ✅ 커스텀 구분자를 입력 받는 “//”와 “ \n” 사이에 기본 구분자가 입력되는 경우


## 📜 **기능 단위 목록**

- 문자열을 입력 받는 기능
- 사용자 입력 문자열을 검증하는 기능, 사용자가 양수와 구분자로 구성된 문자열이 아닌

잘못된 입력을 입력하는 경우 throw문을 이용해 예외를 발생 시키고 프로그램을 종료한다.

- ✅ 입력된 수가 양수가 아닌 0, 음수, 공백, 특수 문자가 입력되었을 경우

- ✅ 유효한 입력과 0, 음수, 공백, 특수 문자가 함께 입력되었을 경우

- ✅ 커스텀 구분자를 지정하지 않고, 기본 구분자 외의 구분자를 사용할 경우

- 기본 구분자를 이용해 덧셈 연산하는 기능
- 문자열을 구분자를 이용해 분리하는 기능
- 분리된 문자열을 숫자 타입으로 형 변환하는 기능
- 숫자 타입으로 변환된 수들을 덧셈 연산하는 기능

- 커스텀 구분자를 이용해 덧셈 연산하는 기능/커스텀 구분자를 구분자로 등록하는 기능

- ✅ 정상적인 입력 문자열 앞에 “//”와 “\n”이 입력되는 경우

- 연산 결과를 출력하는 기능
16 changes: 15 additions & 1 deletion src/main/java/calculator/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,21 @@
package calculator;

import calculator.controller.CalculatorController;
import calculator.model.Delimiter;
import calculator.model.Number;
import calculator.view.InputView;
import calculator.view.OutputView;

public class Application {
public static void main(String[] args) {
// TODO: 프로그램 구현
// 모델, 뷰, 컨트롤러 생성
Delimiter delimiter = new Delimiter();
Number number = new Number();
InputView inputView = new InputView();
OutputView outputView = new OutputView();
CalculatorController controller = new CalculatorController(delimiter, number, inputView, outputView);

// 애플리케이션 실행
controller.run();
}
}
44 changes: 44 additions & 0 deletions src/main/java/calculator/controller/CalculatorController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package calculator.controller;

import calculator.model.Delimiter;
import calculator.model.Number;
import calculator.view.InputView;
import calculator.view.OutputView;

public class CalculatorController {
private Delimiter delimiter;
private Number number;
private InputView inputView;
private OutputView outputView;

public CalculatorController(Delimiter delimiter, Number number, InputView inputView, OutputView outputView) {
this.delimiter = delimiter;
this.number = number;
this.inputView = inputView;
this.outputView = outputView;
}

// 계산 실행
public void run() {
try {
// 사용자 입력 받기
String input = inputView.getUserInput();

// 커스텀 구분자 처리
// input = delimiter.processCustomDelimiter(input);

// 구분자로 문자열을 분리
String[] tokens = delimiter.split(input);

// 숫자로 변환하고 합 계산
int result = number.calculateSum(tokens);

// 결과 출력
outputView.printResult(result);

} catch (IllegalArgumentException e) {
// 예외 발생 시 프로그램을 종료 (에러 메시지 출력하지 않음)
System.exit(1);
}
}
}
45 changes: 45 additions & 0 deletions src/main/java/calculator/model/Delimiter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package calculator.model;

import java.util.HashSet;
import java.util.Set;

public class Delimiter {
private Set<String> delimiters;

public Delimiter() {
delimiters = new HashSet<>();
// 기본 구분자 추가 (쉼표, 콜론)
delimiters.add(",");
delimiters.add(":");
}

// 커스텀 구분자를 추가하는 메서드
public void addCustomDelimiter(String customDelimiter) {
delimiters.add(customDelimiter);
}

// 커스텀 구분자가 있는지 확인하고 추가하는 메서드
public String processCustomDelimiter(String input) {
System.out.println(input);
if (input.startsWith("//")) {
String[] parts = input.split("\\n");
System.out.println("part0" + parts[0]);
System.out.println("part1" + parts[1]);

if (parts.length == 2) {
//addCustomDelimiter(String.valueOf(parts[0].charAt(2)));
String customDelimiter = parts[0].substring(2);
addCustomDelimiter(customDelimiter);
return parts[1];
}
}
return input;
}

// 현재 구분자를 기준으로 문자열을 나누는 메서드
public String[] split(String input) {
input = processCustomDelimiter(input);
String delimiterRegex = String.join("|", delimiters);
return input.split(delimiterRegex);
}
}
21 changes: 21 additions & 0 deletions src/main/java/calculator/model/Number.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package calculator.model;

public class Number {

// 문자열 배열을 숫자로 변환하고 합계를 계산하는 메서드
public int calculateSum(String[] numbers) {
int sum = 0;
for (String number : numbers) {
try {
int num = Integer.parseInt(number.trim());
if (num <= 0) {
throw new IllegalArgumentException();
}
sum += num;
} catch (NumberFormatException e) {
throw new IllegalArgumentException();
}
}
return sum;
}
}
10 changes: 10 additions & 0 deletions src/main/java/calculator/view/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package calculator.view;

import camp.nextstep.edu.missionutils.Console;

public class InputView {
public static String getUserInput(){
System.out.println("숫자를 입력하세요 : ");
return Console.readLine();
}
}
7 changes: 7 additions & 0 deletions src/main/java/calculator/view/OutputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package calculator.view;

public class OutputView {
public static void printResult(int result) {
System.out.printf("합계 : " + result);
}
}