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

[문자열 덧셈 계산기] 김민상 미션 제출합니다. #5

Open
wants to merge 74 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
b3aaca7
Update README.md
MinSang22Kim Oct 16, 2024
d363eba
Update README.md
MinSang22Kim Oct 19, 2024
1569792
docs: 초기 기능 구현 목록 정리
MinSang22Kim Oct 19, 2024
1c9f208
feat: 입력 View 생성
MinSang22Kim Oct 20, 2024
0868b64
feat: 출력 View 생성
MinSang22Kim Oct 20, 2024
0248aa7
feat : 애플리케이션 시작점 구현
MinSang22Kim Oct 20, 2024
7b61ae5
feat: 숫자 목록 합산 기능 추가
MinSang22Kim Oct 20, 2024
4832571
feat: CustomException 클래스 추가 및 에러 코드 처리 방식 구현
MinSang22Kim Oct 20, 2024
fff28bd
refactor: CalculatorController 로직 수정
MinSang22Kim Oct 20, 2024
1df76c3
feat: calculate 메서드 계산 로직 구현
MinSang22Kim Oct 20, 2024
eb5b837
feat: Extractor 추출 도메인 클래스 생성
MinSang22Kim Oct 20, 2024
6332ccc
feat: 생성자에 기본 구분자 추가 로직
MinSang22Kim Oct 20, 2024
38b3b01
feat: 커스텀 구분자 추가 로직
MinSang22Kim Oct 20, 2024
6b0dd76
feat: 커스텀 구분자로 숫자가 추가되는 경우 예외처리
MinSang22Kim Oct 20, 2024
7c24aa0
feat: 사용자 입력에서 숫자 추출
MinSang22Kim Oct 20, 2024
273594d
feat: 입력값 공백 제거
MinSang22Kim Oct 20, 2024
6c10fa8
feat: 문자열 숫자 분리 로직 추가
MinSang22Kim Oct 20, 2024
8895fae
feat: 숫자 여부 검증 로직 추가
MinSang22Kim Oct 20, 2024
0140e8c
feat: 숫자 양수 검증 로직 추가
MinSang22Kim Oct 20, 2024
8ddaac1
feat: 커스텀 구분자 확인 로직 추가
MinSang22Kim Oct 20, 2024
fc9b27f
feat: 커스텀 구분자 추가 로직
MinSang22Kim Oct 20, 2024
6738219
refactor: 숫자 리스트 반환 로직 체이닝 형식으로 변경
MinSang22Kim Oct 20, 2024
75fa4b9
feat: 오류 코드 및 메시지 정의 추가
MinSang22Kim Oct 20, 2024
f6e52cc
feat: 유효성 검증 오류 코드 추가
MinSang22Kim Oct 20, 2024
c2bb06c
refactor: 생성자 생성 시 입력 예외 로직 분리
MinSang22Kim Oct 20, 2024
bee17fc
feat: 예외 테스트 추가
MinSang22Kim Oct 20, 2024
24ace98
feat: 커스텀 구분자 문자열 오류 예외 테스트 추가
MinSang22Kim Oct 20, 2024
3c2c157
feat: 음수 테스트 추가
MinSang22Kim Oct 20, 2024
a31031d
feat: 입력이 null일 경우 0을 반환하는 로직 추가
MinSang22Kim Oct 20, 2024
8e2b6f5
refactor: 빈 문자열 체크 로직 체이닝 형식으로 변경
MinSang22Kim Oct 20, 2024
70c2de0
feat: MessageProvider 추가
MinSang22Kim Oct 20, 2024
8f0f931
refactor: 예외 응답으로 정적 팩토리 메서드 사용
MinSang22Kim Oct 20, 2024
fe9ae63
feat: Input 메시지 enum 타입 추가
MinSang22Kim Oct 20, 2024
9911249
feat: Output 메시지 enum 타입 추가
MinSang22Kim Oct 20, 2024
8150543
feat: 연산자 인터페이스 추가
MinSang22Kim Oct 20, 2024
3bc86b1
feat: 합계 계산 기능 구현
MinSang22Kim Oct 20, 2024
076aa75
feat: 정규 표현식 패턴 관리 enum 추가
MinSang22Kim Oct 20, 2024
6c6e802
refactor: 입력값 검증만 따로 분리
MinSang22Kim Oct 20, 2024
823163e
refactor: 정규식 검증 패턴 네이밍 변경
MinSang22Kim Oct 20, 2024
57ff46a
refactor: 계산 관련 검증 로직 분리
MinSang22Kim Oct 20, 2024
c7619d5
feat: 입력 dto 생성
MinSang22Kim Oct 20, 2024
83f3f2c
feat: 출력 dto 생성
MinSang22Kim Oct 20, 2024
2cfb3fa
feat: 구분자 패턴 enum 추가
MinSang22Kim Oct 20, 2024
39cbc08
feat: 에러 메세지 추가
MinSang22Kim Oct 20, 2024
8860690
refactor: 입력 검증 로직 분리
MinSang22Kim Oct 20, 2024
b92b787
refactor: 입력 dto 레코드 타입으로 변경
MinSang22Kim Oct 20, 2024
f13be51
refactor: 출력 dto 레코드 타입으로 변경
MinSang22Kim Oct 20, 2024
3ca0332
refactor: 출력 View dto 방식으로 변경
MinSang22Kim Oct 20, 2024
e7a5d9c
refactor: 입력 View dto 방식으로 변경
MinSang22Kim Oct 20, 2024
27cad22
refactor: DTO 적용 및 입출력 방식 개선
MinSang22Kim Oct 20, 2024
457603f
refactor: 계산 유효성 검증 로직 분리
MinSang22Kim Oct 20, 2024
7864f61
refactor: 계산기 클래스 추상클래스로 변경
MinSang22Kim Oct 20, 2024
8b4cbc1
refactor: Calculator의 구현체 생성
MinSang22Kim Oct 20, 2024
2eb03ac
refactor: Operator 인터페이스 생성자 주입
MinSang22Kim Oct 20, 2024
333163f
fix: 정규 표현식 패턴 오류 수정
MinSang22Kim Oct 20, 2024
bd7aa1c
refactor: 합산 로직 위치 변경
MinSang22Kim Oct 20, 2024
44d32e3
refactor: 구분자와 숫자 추출 로직 세분화
MinSang22Kim Oct 20, 2024
6a2eff2
refactor: 파라미터로 PlusOperator 받도록 생성자 주입 방식 변경
MinSang22Kim Oct 20, 2024
7505fb0
refactor: 숫자가 포함되지 않은 경우 예외 발생으로 로직 수정
MinSang22Kim Oct 20, 2024
4ffe4e5
fix: 체이닝 방식 stream 추가
MinSang22Kim Oct 20, 2024
073e284
refactor: 구분자로 숫자 포함된 경우 예외 처리 로직 수정
MinSang22Kim Oct 20, 2024
22c8dd9
refactor: 주석 추가
MinSang22Kim Oct 20, 2024
0ea62f2
feat: 커스텀 구분자 사용 테스트 케이스 추가
MinSang22Kim Oct 20, 2024
254cb2d
feat: 기본 구분자 혼합 사용 테스트 케이스 추가
MinSang22Kim Oct 20, 2024
b19b1f3
feat: 커스텀 문자열 예외 테스트 케이스 추가
MinSang22Kim Oct 20, 2024
e24722e
feat: 잘못된 커스텀 구분자 예외 테스트 케이스 추가
MinSang22Kim Oct 20, 2024
8871302
feat: 다중 커스텀 구분자 예외 테스트 케이스 추가
MinSang22Kim Oct 20, 2024
cad4549
refactor: 디렉토리 구조 추가
MinSang22Kim Oct 20, 2024
9285042
refactor: 누락된 디렉토리 구조 추가
MinSang22Kim Oct 20, 2024
f8f3b3c
Update README.md
MinSang22Kim Oct 28, 2024
728d000
Update README.md
MinSang22Kim Oct 28, 2024
7abde84
refacotr: 리드미 소개 수정
MinSang22Kim Oct 28, 2024
269900d
refactor: 리드미 구분선 추가
MinSang22Kim Oct 28, 2024
27c57e3
refactor: 리드미 소개글 수정
MinSang22Kim Oct 31, 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
164 changes: 163 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,163 @@
# java-calculator-precourse
# java-calculator-precourse

About 1st Pre-Course Project : Calculator

---

## 📁 디렉토리 구조
```
calculator
├── controller
│ └── CalculatorController.java
├── dto
│ ├── InputRequest.java
│ └── OutputResponse.java
├── error
│ └── CustomException.java
├── message
│ ├── ErrorMessage.java
│ ├── InputMessage.java
│ ├── MessageProvider.java
│ └── OutputMessage.java
├── model
│ ├── Calculator.java
│ ├── Operator.java
│ ├── PlusCalculator.java
│ └── PlusOperator.java
├── parser
│ ├── CalculatorParser.java
│ ├── DelimiterPattern.java
│ └── InputParser.java
├── service
│ └── CalculatorService.java
├── validation
│ ├── CalculateValidator.java
│ ├── InputValidator.java
│ └── ValidationPattern.java
└── view
│ ├── InputView.java
│ └── OutputView.java
└── Application
```

---

## 🎯 학습 목표

- Git, GitHub, IDE 등 실제 개발을 위한 환경에 익숙해진다.
- 교육 분야에 맞는 프로그래밍 언어를 사용하여 간단한 문제를 해결한다.

---

## 🛠️ 프리코스 진행 방식

### 🔍 진행 방식
- 미션은 **과제 진행 요구 사항**, **기능 요구 사항**, **프로그래밍 요구 사항** 세 가지로 구성되어 있다.
- 세 개의 요구 사항을 만족하기 위해 노력한다. 특히 기능을 구현하기 전에 기능 목록을 만들고, 기능 단위로 커밋 하는 방식으로 진행한다.
- **기능 요구 사항에 기재되지 않은 내용**은 스스로 판단하여 구현한다.
- 매주 진행할 미션은 **화요일 오후 3시**부터 확인할 수 있으며, **다음 주 월요일까지** 구현을 완료하여 제출해야 한다. 제출은 **일요일 오후 3시**부터 가능하다.
- 정해진 시간을 지키지 않을 경우 미션을 제출하지 않은 것으로 간주한다.
- 종료 일시 이후에는 추가 무제를 허용하지 않는다.

---

## 📮 미션 제출 방법

- 미션 구현을 완료한 후 **GitHub**을 통해 제출해야 한다.
- GitHub를 활용한 제출 방법은 [프리코스 과제 제출](https://github.com/woowacourse/woowacourse-docs/tree/main/precourse) 문서를 참고해 제출한다.
- GitHub에 미션을 제출한 후 [우아한테크코스 지원 플랫폼](https://apply.techcourse.co.kr/)에 PR 링크를 포함하여 최종 제출한다.
- 자세한 내용은 [제출 가이드](https://github.com/woowacourse/woowacourse-docs/tree/main/precourse#%EC%A0%9C%EC%B6%9C-%EA%B0%80%EC%9D%B4%EB%93%9C)를 참고한다.
- 과제를 수행하면서 느낀 점, 많은 시간을 투자한 부분 등 자유롭게 작성한다.

---

## ✅ 과제 제출 전 체크 리스트

- 기능을 올바르게 구현했더라도 요구 사항에 명시된 **출력 형식**을 따르지 않으면 **0점**을 받게 된다.
- 기능 구현을 완료한 후 여러 가이드에 따라 **모든 테스트가 성공적으로 실행되는지** 확인한다.
- **테스트가 실패하면 점수가 0점**이 되므로 제출하기 전에 반드시 확인한다.

---

## 🧪 테스트 실행 가이드

- **터미널**에서 `java -version`을 실행하여 Java 버전이 **21 이상**인지 확인한다.
Eclipse 또는 IntelliJ IDEA와 같은 IDE에서 Java 21로 실행되는지 확인한다.

- 터미널에서 **Mac 또는 Linux 사용자의 경우**:
```bash
./gradlew clean test
```

- **Windows 사용자의 경우**:
```bash
gradlew.bat clean test
```

위 명령을 실행한 후 모든 테스트가 아래와 같이 통과하는지 확인한다:
```
BUILD SUCCESSFUL in 0s
```

---

## 🚀 과제 진행 요구 사항

- 미션은 [문자열 덧셈 계산기](https://github.com/woowacourse-precourse/java-calculator-7) 저장소를 포크하고 클론하는 것으로 시작한다.
- 기능을 구현하기 전 **README.md**에 구현할 기능 목록을 정리해 추가한다.
- Git의 커밋 단위는 각 단계에서 **README.md**에 정리한 기능 목록 단위를 추가한다.
- [AngularJS Git Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153)를 참고해 커밋 메시지를 작성한다.
- 자세한 과제 진행 방법은 프리코스 진행 가이드를 참고한다.

---

## ✨ 기능 요구 사항

- 입력한 **문자열에서 숫자를 추출**하여 더하는 계산기를 구현한다.
- 쉼표(,) 또는 콜론(:)을 구분자로 가지는 문자열을 전달하는 경우, 각 숫자의 합을 반환한다.
- 예: `""` => 0, `"1,2,3"` => 6, `"1:2:3"` => 6
- 앞에 기본 구분자(쉼표, 콜론) 외에 **커스텀 구분자**를 지정할 수 있다.
커스텀 구분자는 문자열 앞부분의 `"//"`와 `"\n"` 사이에 위치하는 문자를 구분자로 사용한다.
- 예: `"//;\n1;2;3"`과 같이 입력할 경우 커스텀 구분자는 세미콜론(;)이며, 결과 값은 6이 반환되어야 한다.
- 사용자가 잘못된 값을 입력할 경우 **`IllegalArgumentException`**을 발생시킨 후 애플리케이션은 종료되어야 한다.

---

## 📥 입력과 출력 요구 사항

### 📌 입력
- 구분자와 양수로 구성된 문자열

### 📌 출력
- 덧셈 결과
```text
결과: 6
```

### 📌 실행 결과 예시
```text
덧셈할 문자열을 입력해 주세요.
1,2:3
결과: 6
```

---

## 📝 프로그래밍 요구 사항

- **JDK 21** 버전에서 실행 가능해야 한다.
- 프로그램 실행의 시작점은 `Application`의 **`main()`** 이다.
- **`build.gradle`** 파일은 변경할 수 없으며, **제공된 라이브러리 이외의 외부 라이브러리는 사용하지 않는다.**
- 프로그램 종료 시 `System.exit()`를 호출하지 않는다.
- 프로그래밍 요구 사항에서 달리 명시하지 않은 한 **파일명과 패키지명**을 바꾸거나 이동하지 않는다.
- 자바 코드 컨벤션을 지키면서 프로그래밍한다.
- 기본적으로 [Java Style Guide](https://google.github.io/styleguide/javaguide.html)를 원칙으로 한다.

---

## 📚 라이브러리

- `camp.nextstep.edu.missionutils`에서 제공하는 `Console` API를 사용하여 구현해야 한다.
- 사용자가 입력하는 값은 `camp.nextstep.edu.missionutils.Console`의 `readLine()` 메서드를 활용한다.

---
6 changes: 4 additions & 2 deletions src/main/java/calculator/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package calculator;

import calculator.controller.CalculatorController;

public class Application {
public static void main(String[] args) {
// TODO: 프로그램 구현
new CalculatorController().run();
}
}
}
22 changes: 22 additions & 0 deletions src/main/java/calculator/controller/CalculatorController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package calculator.controller;

import calculator.dto.InputRequest;
import calculator.dto.OutputResponse;
import calculator.service.CalculatorService;
import calculator.view.InputView;
import calculator.view.OutputView;

public class CalculatorController {

private final CalculatorService calculatorService;

public CalculatorController() {
this.calculatorService = new CalculatorService();
}

public void run() {
InputRequest input = InputView.getInputRequest(); // 입력
OutputResponse result = calculatorService.calculate(input); // 계산
OutputView.outputMessage(result); // 출력
}
}
8 changes: 8 additions & 0 deletions src/main/java/calculator/dto/InputRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package calculator.dto;

public record InputRequest(String delimiters, String targetInput) {

public static InputRequest of(String delimiters, String targetInput) {
return new InputRequest(delimiters, targetInput);
}
}
9 changes: 9 additions & 0 deletions src/main/java/calculator/dto/OutputResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package calculator.dto;

public record OutputResponse(int result) {

public static OutputResponse of(int result) {
return new OutputResponse(result);
}
}

13 changes: 13 additions & 0 deletions src/main/java/calculator/error/CustomException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package calculator.error;

import calculator.message.MessageProvider;

public class CustomException extends IllegalArgumentException {
private CustomException(MessageProvider messageProvider) {
super(messageProvider.getMessage());
}

public static CustomException from(MessageProvider messageProvider) {
return new CustomException(messageProvider);
}
}
23 changes: 23 additions & 0 deletions src/main/java/calculator/message/ErrorMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package calculator.message;

public enum ErrorMessage implements MessageProvider{

EMPTY_INPUT("입력값이 비어 있습니다."),
INVALID_INPUT("유효하지 않은 입력입니다."),
INVALID_WHITESPACE("공백은 허용되지 않습니다."),
INVALID_NUMBER_FORMAT("잘못된 숫자 형식입니다."),
INVALID_CHARACTER("구분자 외의 문자가 포함되어 있습니다."),
NOT_ALLOWED_NEGATIVE_NUMBER("음수는 허용되지 않습니다."),
INTEGER_OUT_OF_RANGE("표현 가능 범위를 초과하였습니다."),
MISSING_CUSTOM_DELIMITER_END("잘못된 커스텀 문자입니다.");

private final String message;

ErrorMessage(String message) {
this.message = message;
}

public String getMessage() {
return message;
}
}
19 changes: 19 additions & 0 deletions src/main/java/calculator/message/InputMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package calculator.message;


public enum InputMessage implements MessageProvider {

REQUEST_MESSAGE("덧셈할 문자열을 입력해 주세요.");

private final String message;

InputMessage(String message) {
this.message = message;
}

@Override
public String getMessage() {
return message;
}
}

5 changes: 5 additions & 0 deletions src/main/java/calculator/message/MessageProvider.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package calculator.message;

public interface MessageProvider {
String getMessage();
}
19 changes: 19 additions & 0 deletions src/main/java/calculator/message/OutputMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package calculator.message;


public enum OutputMessage implements MessageProvider {

RESPONSE_MESSAGE("결과 : ");

private final String message;

OutputMessage(String message) {
this.message = message;
}

@Override
public String getMessage() {
return message;
}
}

7 changes: 7 additions & 0 deletions src/main/java/calculator/model/Calculator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package calculator.model;

import java.util.List;

public abstract class Calculator {
public abstract int calculate(List<Integer> numbers);
}
7 changes: 7 additions & 0 deletions src/main/java/calculator/model/Operator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package calculator.model;

import java.util.List;

public interface Operator {
int operate(List<Integer> numbers);
}
18 changes: 18 additions & 0 deletions src/main/java/calculator/model/PlusCalculator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package calculator.model;

import java.util.List;

public class PlusCalculator extends Calculator {

private final Operator operator;

public PlusCalculator(Operator operator) {
this.operator = operator;
}

@Override
public int calculate(List<Integer> numbers) {
return operator.operate(numbers);
}
}

19 changes: 19 additions & 0 deletions src/main/java/calculator/model/PlusOperator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package calculator.model;


import calculator.error.CustomException;
import calculator.message.ErrorMessage;
import java.util.List;
import java.util.Optional;

public class PlusOperator implements Operator {

@Override
public int operate(List<Integer> numbers) {
return Optional.of(numbers.stream()
.mapToInt(Integer::intValue)
.sum())
.filter(sum -> sum >= 0) // 덧셈 결과 반환
.orElseThrow(() -> CustomException.from(ErrorMessage.INTEGER_OUT_OF_RANGE));
}
}
Loading