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

[문자열 덧셈 계산기] 심규선 미션 제출합니다. #3

Open
wants to merge 24 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
c2da9ed
docs: 구현 기능 목록 정리
gyuseon25 Oct 19, 2024
71d4d66
feat: 사용자가 입력한 문자열 읽는 기능 구현
gyuseon25 Oct 19, 2024
9b3087a
feat: 커스텀 구분자 추출 기능 구현
gyuseon25 Oct 19, 2024
0ed76bf
feat: 숫자 추출 기능
gyuseon25 Oct 19, 2024
a4a5e43
feat: 계산 기능 구현
gyuseon25 Oct 19, 2024
b8100a9
docs: 음수 체크 기능 추가
gyuseon25 Oct 19, 2024
84b427c
feat: 음수 체크 기능 추가
gyuseon25 Oct 19, 2024
e1c9b02
refactor: MVC 패턴 적용을 위한 InputView 추가
gyuseon25 Oct 19, 2024
16f127d
refactor: MVC 패턴 적용을 위한 OutputView 추가
gyuseon25 Oct 19, 2024
8ebeb44
refactor: MVC 패턴 적용을 위한 Calculator 추가
gyuseon25 Oct 19, 2024
3e32b1a
fix: Calculator 메소드 접근 지정자 변경
gyuseon25 Oct 19, 2024
ca103e3
refactor: MVC 패턴 적용을 위한 Extractor 추가
gyuseon25 Oct 19, 2024
3c0c4bb
refactor: 구분자로 입력 문자열 구분 후 문자 들어 있다면 예외 발생시키는 메소드 구현
gyuseon25 Oct 19, 2024
ee7f4e5
refactor: 음수인지 체크하는 메소드 구현
gyuseon25 Oct 19, 2024
829fb98
fix: 커스텀 구분자 추출 메소드 매개변수 수정
gyuseon25 Oct 19, 2024
c09784f
refactor: MVC 패턴 적용을 위한 CalculatorController 추가
gyuseon25 Oct 19, 2024
b1d1c7b
fix: Extractor 클래스 주석 추가
gyuseon25 Oct 19, 2024
f766733
refactor: 필요없는 import문 제거
gyuseon25 Oct 20, 2024
c158903
docs: 기능 구현 목록 수정
gyuseon25 Oct 20, 2024
166f009
feat: 구분자로 숫자 들어올 시 에러 발생시키는 기능 구현
gyuseon25 Oct 20, 2024
8f8b0e2
refactor: 서비스에서 지속적으로 사용되는 상수 enum 타입으로 변경
gyuseon25 Oct 20, 2024
1f7cdef
refactor: delimiters 필드 final으로 변경
gyuseon25 Oct 20, 2024
cdfa01b
refactor: extractNumbers 메소드 매개변수 변경
gyuseon25 Oct 20, 2024
a2a0898
fix: Javadoc 주석 추가
gyuseon25 Oct 20, 2024
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
16 changes: 15 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,15 @@
# java-calculator-precourse
# java-calculator-precourse

---
## 🛠️구현할 기능 목록

### 사용자가 입력한 문자열 읽는 기능
- [x] camp.nextstep.edu.missionutils에서 제공하는 Console API를 사용하여 구현
### 커스텀 구분자 추출 기능
- [x] 커스텀 구분자가 있을시, 구분자 List에 추가
- [x] 커스텀 구분자는 1개로 제한 (추후에 리팩토링 예정)
### 숫자 추출 기능
- [x] StringBuilder와 정규 표현식을 이용하여 숫자만 추출
- [x] 음수 포함 시 에러 발생
### 계산 기능
- [x] 추출한 숫자 바탕으로 덧셈 연산
11 changes: 11 additions & 0 deletions src/main/java/calculator/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,18 @@
package calculator;

import calculator.controller.CalculatorController;
import camp.nextstep.edu.missionutils.Console;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

import 목록 정리 한번 하시면 좋을 것 같아요!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

확인했습니다 😊


public class Application {

public static void main(String[] args) {
// TODO: 프로그램 구현
CalculatorController calculatorController = new CalculatorController();
calculatorController.run();
}

}
38 changes: 38 additions & 0 deletions src/main/java/calculator/controller/CalculatorController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package calculator.controller;

import calculator.model.Calculator;
import calculator.model.Extractor;
import calculator.view.InputView;
import calculator.view.OutputView;

import java.util.ArrayList;
import java.util.List;

public class CalculatorController {

private final Calculator calculator;
private final Extractor extractor;
private final InputView inputView;
private final OutputView outputView;

public CalculatorController() {
this.calculator = new Calculator();
this.extractor = new Extractor();
this.inputView = new InputView();
this.outputView = new OutputView();
}

public void run() {
List<Long> numbers = new ArrayList<>();

String input = inputView.read();
inputView.close();

extractor.extractCustomDelimiter(input);
extractor.extractNumbers(input, numbers);

long result = calculator.calculateSum(numbers);

outputView.print(result);
}
}
14 changes: 14 additions & 0 deletions src/main/java/calculator/model/Calculator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package calculator.model;

import java.util.List;

public class Calculator {

public long calculateSum(List<Long> numbers) {
long sum = 0;
for(Long number : numbers) {
sum += number;
}
return sum;
}
}
72 changes: 72 additions & 0 deletions src/main/java/calculator/model/Extractor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package calculator.model;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Extractor {

private List<Character> delimiters = new ArrayList<>(Arrays.asList(',', ':'));

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

delimiters 객체가 외부의 개입으로 변경될 가능성이 있을 것 같아요.
final로 변경하거나 다른 방식으로 처리하는 것이 좋아보입니다!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좋은 의견 감사합니다 👏

private boolean isCustomDelimiter = false;

public void extractCustomDelimiter(String input) {
if(input.startsWith("//") && input.substring(3,5).equals("\\n")){

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

서비스에서 지속적으로 사용되는 상수들을 final이나 enum으로 관리하는 것이 요구사항이 바뀌더라도 쉽게 변경할 수 있어 좋을 것 같아요

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

enum을 적용하면 나중에 유지보수하기 편할거 같네요 !!

delimiters.add(input.charAt(2));
isCustomDelimiter = true;
}
}

public void extractNumbers(String input, List<Long> numbers) {
Copy link

@SongJaeHoonn SongJaeHoonn Oct 20, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

inputnumbers를 외부에서 받아 해당 객체에 값을 추가하는 것 같은데,
현재 방식은 데이터 무결성 및 일관성을 저해하고 있는 방법인 것 같아요.
외부에서 값을 받아 이 메서드 내부에서 리스트를 직접 생성해 반환하는 로직이 더 안전한 방법일 것 같습니다.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

참고하겠습니다 👍


input = removeCustomDelimiter(input);

String regex = makeRegex();

// 구분자를 기준으로 문자열을 숫자들로 분리
// 이때 구분자가 아닌 문자가 포함되어 있을 수 있는데, 숫자인지 확인하는 메소드에서 걸러짐
String[] tokens = input.split(regex);
for (String token : tokens) {
if (!token.isEmpty()) {
Long number = validateIsNumber(token);
validateNegativeNumber(number);
numbers.add(number);
}
}
}

//커스텀 구분자를 제거하는 메소드
private String removeCustomDelimiter(String input) {
if(isCustomDelimiter) {
input = input.substring(5);
}
return input;
}

//구분자를 생성하는 메소드
private String makeRegex() {
StringBuilder regex = new StringBuilder("[");
for (char delimiter : delimiters) {
regex.append("\\").append(delimiter);
}
regex.append("]");

return regex.toString();
}

//분리한 문자열이 숫자인지 확인하는 메소드
private Long validateIsNumber(String input) {
try{
return Long.parseLong(input);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("잘못된 입력입니다.");
}
}

//음수인지 확인하는 메소드
private void validateNegativeNumber(Long number) {
if(number < 0) {
throw new IllegalArgumentException("음수가 포함되어 있습니다.");
}
}

}
15 changes: 15 additions & 0 deletions src/main/java/calculator/view/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package calculator.view;

import camp.nextstep.edu.missionutils.Console;

public class InputView {

public String read() {
System.out.println("덧셈할 문자열을 입력해 주세요.");
return Console.readLine();
}

public void close() {
Console.close();
}
}
8 changes: 8 additions & 0 deletions src/main/java/calculator/view/OutputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package calculator.view;

public class OutputView {

public void print(long result) {
System.out.println("결과 : " + result);
}
}