Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
945a0bc
docs(README) : 기능, 입력방식, 예외 처리 목록 작성
TH-97 Oct 16, 2025
07a4e6d
feat(output): 안내문구 출력 기능 구현
TH-97 Oct 16, 2025
e57541e
docs(README) : 기능 체크박스 체크
TH-97 Oct 16, 2025
0f3e343
fix(import): 파일 및 폴더명 수정
TH-97 Oct 16, 2025
fc823a0
docs(README) : 만났던 오류 추가
TH-97 Oct 16, 2025
0b83dd9
docs(README) : 기능의 일부 부분 수정
TH-97 Oct 18, 2025
ed90bf4
feat(input): 입력받기 기능 구현
TH-97 Oct 18, 2025
ebe704c
docs(README) : 기능 체크박스 체크
TH-97 Oct 18, 2025
ecdf11b
docs(README) : 기능의 일부 부분 수정 및 추가
TH-97 Oct 18, 2025
e45f07c
feat(output): 입력값이 비었을 경우 기능 구현
TH-97 Oct 18, 2025
74c234f
docs(README) : 기능 체크박스 체크
TH-97 Oct 18, 2025
b2f3a01
docs(README) : 기능 수정 및 제거
TH-97 Oct 19, 2025
b2204a5
docs(README) : 기능 수정 및 제거
TH-97 Oct 19, 2025
377c1f8
fix(features) : 입력값이 비었을시 결과값 출력 수정
TH-97 Oct 19, 2025
2355557
feat(deliniter) : deliniter 모델 생성
TH-97 Oct 20, 2025
2d31622
feat(number) : number 모델 생성
TH-97 Oct 20, 2025
564166f
feat(error) : error시 동작 생성
TH-97 Oct 20, 2025
b7e5fb1
feat(sumNumer) : 입력값을 합치는 기능
TH-97 Oct 20, 2025
a476615
feat(splitInput) : 입력값 구분자 기준으로 나누기
TH-97 Oct 20, 2025
a85a13a
fix (checkDelimiter) : 파일명 변경
TH-97 Oct 20, 2025
5d6d41d
fix(parseCustomDelimiter) : 파일명 변경 및 기능 변경
TH-97 Oct 20, 2025
35ac877
feat(calculator) : 추가된 기능에 의해 호출 기능 추가
TH-97 Oct 20, 2025
cc23dd3
fix(App) : 호출시 await 추가
TH-97 Oct 20, 2025
23f1b9d
feat (number) : 음수 불가능 기능 추가
TH-97 Oct 20, 2025
3c8edd7
fix(parseCustomDelimiter) : jest test의 기준에 맞춰 수정
TH-97 Oct 20, 2025
3ecc5d6
ocs(README) : 기능 체크박스 체크
TH-97 Oct 20, 2025
4234e41
docs(README) : 아쉬운점 추가
TH-97 Oct 20, 2025
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
62 changes: 61 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,61 @@
# javascript-calculator-precourse
# javascript-calculator-precourse

## 기능

- [x] "덧셈할 문자열을 입력해 주세요." 출력

- [x] 입력받기

- [x] 입력값이 0인지 확인

입력값이 비었을 경우 결과값 0으로 처리

- [x] 커스텀 구분자 사용시

1. 커스텀 시작 구분자("//"), 커스텀 종료 구분자("\n")가 잘못 표기시에 예외상황 발생
2. 입력 문자열이 "//"로 시작하고 "\n"끝났을 경우 커스텀 구분자 추출
3. 커스텀 구분자를 구분자 배열에 추가
4. 커스텀 구분자가 존재하지 않을시 기본구분자 사용

- [x] 기본 구분자 사용 시

1. 구분자(쉼표, 콜론, 커스텀 구분자)가 잘못 표기시에 예외상황 발생
2. 기본 구분자 마저 존재하지 않을시 예외 발생
3. 구분자(쉼표, 콜론, 커스텀 구분자)를 기준으로 분리

- [x] 나뉜 문자열을 숫자 배열로 변환 (빈 문자열 제외)

숫자가 아닌 문자가 포함된 경우 예외 발생

- [x] 숫자 배열의 모든 값을 합산

- [x] "결과 : ${결과값}" 출력

- [x] 프로그램 종료

## 입력방식 조건

정상 입력 형식은 다음 예시와 같다:

- "1,2,3" → 쉼표(,) 구분
- "1,2:3" → 쉼표(,)와 콜론(:) 혼용
- "//;\n1;2;3" → 커스텀 구분자 세미콜론(;)
- "//;\n1;2:3" → 커스텀 구분자와 기본 구분자(:) 혼용

위의 형식을 제외한 모든 입력은 예외로 처리한다.

## 예외 처리시

"[ERROR]"로 시작하는 메시지와 함께 Error를 발생시킨 후 애플리케이션은 종료되어야 한다.

## 만났던 오류

- 폴더 및 파일 이름 대소문자 불일치로 인한 import 오류<br>
파일명을 PromptOutput에서 promptOutput 변경하였습니다 <br> 이유는 FSD 환경에서는 PascalCase도 가능하지만,
현재 프로젝트는 React/TypeScript 환경이 아니므로 camelCase로 통일

## 아쉬운점

상수사용, enum, 사용하지 못한 점
파일명에 대한 아쉬움
함수를 더 쪼갤 수 있었을 것 같다는 것에 대한 아쉬움
6 changes: 5 additions & 1 deletion src/App.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import { calculator } from "./page/index.js";

class App {
async run() {}
async run() {
await calculator();
}
}

export default App;
1 change: 1 addition & 0 deletions src/entities/delimiter/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { Delimiters } from "./model/delimiters.js";
15 changes: 15 additions & 0 deletions src/entities/delimiter/model/delimiters.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
export class Delimiters {
constructor() {
this.delimiterArray = [",", ":"];
}

addCustumDelimiter(elimiter) {
if (!this.delimiterArray.includes(elimiter)) {
this.delimiterArray.push(elimiter);
}
}

getDelimiterArray() {
return this.delimiterArray;
}
}
1 change: 1 addition & 0 deletions src/entities/number/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { NumberArray } from "./model/numberArray.js";
23 changes: 23 additions & 0 deletions src/entities/number/model/numberArray.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
export class NumberArray {
constructor() {
this.numberArray = [];
}

isNumber(number) {
return Number.isInteger(Number(number)) && Number(number) >= 0;
}

addNumber(number) {
this.numberArray.push(Number(number));
}

getArray() {
return this.numberArray;
}
getSum() {
return this.numberArray.reduce(
(acc, curr) => Number(acc) + Number(curr),
0
);
}
}
1 change: 1 addition & 0 deletions src/features/checkDelimiter/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { parseCustomDelimiter } from "./parseCustomDelimiter/parseCustomDelimiter.js";
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { Delimiters } from "../../../entities/delimiter/index.js";
import { customError } from "../../../shared/error/index.js";

export function parseCustomDelimiter(input) {
const startMarker = input.indexOf("//");
const endMarker = input.indexOf("\\n");

const delimiterManager = new Delimiters();
let inputString = input;

if (
(startMarker === -1 && endMarker !== -1) ||
(startMarker === 0 && endMarker === -1)
) {
customError();
}

if (startMarker === 0 && endMarker !== -1) {
const customDelimiter = input.slice(startMarker + 2, endMarker - 1);
delimiterManager.addCustumDelimiter(customDelimiter);
inputString = input.slice(endMarker + 2);
}

return {
DelimiterArray: delimiterManager.getDelimiterArray(),
Input: inputString,
};
}
1 change: 1 addition & 0 deletions src/features/input/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { readInput } from "./readInput/readInput.js";
6 changes: 6 additions & 0 deletions src/features/input/readInput/readInput.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { Console } from "@woowacourse/mission-utils";

export async function readInput() {
const input = await Console.readLineAsync("");
return input;
}
2 changes: 2 additions & 0 deletions src/features/output/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export { promptOutput } from "./promptOutput/promptOutput.js";
export { resultOutput } from "./resultOutput/resultOutput.js";
4 changes: 4 additions & 0 deletions src/features/output/promptOutput/PromptOutput.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { Console } from "@woowacourse/mission-utils";
export async function promptOutput() {
Console.print("덧셈할 문자열을 입력해 주세요.");
}
5 changes: 5 additions & 0 deletions src/features/output/resultOutput/resultOutput.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { Console } from "@woowacourse/mission-utils";

export function resultOutput(sum) {
Console.print(`결과 : ${sum}`);
}
1 change: 1 addition & 0 deletions src/features/splitInput/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { splitInput } from "./splitInput/splitInput.js";
11 changes: 11 additions & 0 deletions src/features/splitInput/splitInput/splitInput.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { delimiterError } from "../../../shared/error/index.js";

export function splitInput(input, delimiterArray) {
if (!delimiterArray.some((delimiter) => input.includes(delimiter))) {
delimiterError();
}
for (const delimiter of delimiterArray) {
input = input.replaceAll(delimiter, " ");
}
return input.split(" ");
}
1 change: 1 addition & 0 deletions src/features/sumNumber/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { sumNumber } from "./sumNumber/sumNumber.js";
11 changes: 11 additions & 0 deletions src/features/sumNumber/sumNumber/sumNumber.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { NumberArray } from "../../../entities/number/index.js";
import { numberError } from "../../../shared/error/index.js";

export function sumNumber(numberArray) {
const array = new NumberArray();
numberArray.forEach((number) => {
if (!array.isNumber(number)) numberError();
array.addNumber(number);
});
return array.getSum();
}
1 change: 1 addition & 0 deletions src/features/validate/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { vaildateInput } from "./validateInput/validateInput.js";
4 changes: 4 additions & 0 deletions src/features/validate/validateInput/lib/isEmpty.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export function isEmpty(input) {
if (input.trim() === "") return true;
return false;
}
6 changes: 6 additions & 0 deletions src/features/validate/validateInput/validateInput.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { isEmpty } from "./lib/isEmpty.js";

export function vaildateInput(input) {
if (isEmpty(input)) return false;
return true;
}
24 changes: 24 additions & 0 deletions src/page/calculator/Calculator.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { parseCustomDelimiter } from "../../features/checkDelimiter/index.js";
import { readInput } from "../../features/input/index.js";
import { promptOutput, resultOutput } from "../../features/output/index.js";
import { splitInput } from "../../features/splitInput/index.js";
import { sumNumber } from "../../features/sumNumber/index.js";
import { vaildateInput } from "../../features/validate/index.js";
export async function calculator() {
await promptOutput();
const input = await readInput();
if (!vaildateInput(input)) {
resultOutput(0);
return;
}
const parsedInput = parseCustomDelimiter(input);

const numbers = await splitInput(
parsedInput.Input,
parsedInput.DelimiterArray
);

const result = await sumNumber(numbers);
resultOutput(result);
return;
}
1 change: 1 addition & 0 deletions src/page/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { calculator } from "./calculator/calculator.js";
3 changes: 3 additions & 0 deletions src/shared/error/customError/customError.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function customError() {
throw new Error("[Error] : 커스텀 구분자 생성 실패");
}
3 changes: 3 additions & 0 deletions src/shared/error/delimiterError/delimiterError.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function delimiterError() {
throw new Error("[Error] : 구분자는 쉼표(,) , 콜론(:) , 커스텀 입니다");
}
3 changes: 3 additions & 0 deletions src/shared/error/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export { customError } from "./customError/customError.js";
export { delimiterError } from "./delimiterError/delimiterError.js";
export { numberError } from "./numberError/numberError.js";
3 changes: 3 additions & 0 deletions src/shared/error/numberError/numberError.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function numberError() {
throw new Error("[ERROR] : 정수만 입력 가능합니다");
}