Skip to content
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
12 changes: 11 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,11 @@
# javascript-calculator-precourse
# javascript-calculator-precourse
**구현할 기능 목록**
1. App.js에서 입출력 처리
2. Calculator.js 모듈에서 계산 작업

**최종 구현된 기능 목록**
1. App.js의 run() 함수에서 입출력을 처리합니다.
2. calculator 함수는 입력 문자열을 전달받아 합계를 반환하거나 예외를 처리합니다.
3. calculator 함수에서 입력된 개행 문자 앞에 역슬래시가 추가되는 경우 이를 개행 문자로 정정할 수 있습니다.
4. calculator 함수는 양의 정수 외의 입력을 예외 처리합니다.
5. index.js에서 run() 함수 실행 중 각종 비동기 작업 에러를 처리할 수 있습니다.
12 changes: 11 additions & 1 deletion src/App.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
import { Console } from "@woowacourse/mission-utils"
import { calculator } from "./Calculator.js";

class App {
async run() {}
async run() {
//Input
const inputString = await Console.readLineAsync("덧셈할 문자열을 입력해주세요.\n");

//Calculator & Print Test
const sum = calculator(inputString);
Console.print(`결과 : ${sum}`);
}
}

export default App;
33 changes: 33 additions & 0 deletions src/Calculator.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
export function calculator(inputString) {
if (!inputString || typeof inputString !== 'string') {
throw new Error("[ERROR] 문자열이 잘못 입력되었습니다.");
}
// 의도치 않은 공백과 개행 문자에 역슬래시(\)가 추가되는 문제를 확인하여 제거하는 로직 추가
const trimmedInput = inputString.trim().replace(/\\n/g, '\n');

const customSlicerRegex = /^\/\/(.)\n/; // '//'로 시작해야 하며, '// /n' 사이의 문자 1개 캡쳐
const normalSlicerRegex = /,|:/; // 기본 구분자 , 혹은 : 를 찾습니다

const match = trimmedInput.match(customSlicerRegex);

let numbers = [];
if (match) {
const customSlicer = match[1]; // ex) ';'
const numbersPart = trimmedInput.substring(match[0].length); // ex) '//;\n' 이후부터 취한다

numbers = numbersPart.split(customSlicer).map(Number);
} else {
numbers = trimmedInput.split(normalSlicerRegex).map(Number);
}
// 양의 정수만 입력받아야 하는 비즈니스 룰을 준수하기 잘못된 입력을 예외 처리합니다.
// 추출된 수가 음수이거나, 정수가 아니면 잘못된 입력으로 간주합니다.
const wrongNumbers = numbers.filter(number =>
number < 0 || !Number.isInteger(number)
);

if (wrongNumbers.length > 0) {
throw new Error(`[ERROR] 입력 값은 양의 정수만 허용됩니다. 잘못된 값: ${wrongNumbers.join(', ')}`);
}

return numbers.reduce((acc, number) => acc + number, 0)
}
5 changes: 4 additions & 1 deletion src/index.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import App from "./App.js";

const app = new App();
await app.run();
// run() 함수 실행 과정에서 일어날 수 있는 각종 비동기 에러를 처리합니다.
await app.run().catch((e) => {
console.log(e.message);
});