diff --git a/README.md b/README.md index bd90ef0247..8d88745739 100644 --- a/README.md +++ b/README.md @@ -1 +1,53 @@ -# java-calculator-precourse \ No newline at end of file +# java-calculator-precourse + +## πŸš€ κ΅¬ν˜„ν•  κΈ°λŠ₯ λͺ©λ‘ + +### 1. λ¬Έμžμ—΄ 계산기 핡심 κΈ°λŠ₯ (StringCalculator) + +#### 1.1. λ¬Έμžμ—΄ μœ νš¨μ„± 및 초기 처리 +* [ ] μž…λ ₯ λ¬Έμžμ—΄μ΄ `null`μ΄κ±°λ‚˜ **빈 λ¬Έμžμ—΄("")**인지 ν™•μΈν•˜κ³  μ²˜λ¦¬ν•œλ‹€. + * `null` λ˜λŠ” `""` μž…λ ₯ μ‹œ **`0`**을 λ°˜ν™˜ν•œλ‹€. + +#### 1.2. κ΅¬λΆ„μž κ²°μ • +* [ ] μž…λ ₯ λ¬Έμžμ—΄μ—μ„œ **μ»€μŠ€ν…€ κ΅¬λΆ„μž**λ₯Ό μΆ”μΆœν•œλ‹€. + * μ»€μŠ€ν…€ κ΅¬λΆ„μžλŠ” λ¬Έμžμ—΄ μ•žλΆ€λΆ„μ˜ `//`와 `\n` 사이에 μœ„μΉ˜ν•œ λ¬Έμžμ—¬μ•Ό ν•œλ‹€. (예: `//;\n1;2;3`μ—μ„œ `;` μΆ”μΆœ) +* [ ] κΈ°λ³Έ κ΅¬λΆ„μžμ™€ μ»€μŠ€ν…€ κ΅¬λΆ„μžλ₯Ό λͺ¨λ‘ ν¬ν•¨ν•˜λŠ” μ •κ·œ ν‘œν˜„μ‹μ„ κ΅¬μ„±ν•œλ‹€. + * **κΈ°λ³Έ κ΅¬λΆ„μž**λŠ” μ‰Όν‘œ(`,`) λ˜λŠ” 콜둠(`:`)이닀. + +#### 1.3. λ¬Έμžμ—΄ 뢄리 및 검증 +* [ ] κ²°μ •λœ κ΅¬λΆ„μžλ₯Ό κΈ°μ€€μœΌλ‘œ λ¬Έμžμ—΄μ„ λΆ„λ¦¬ν•œλ‹€. +* [ ] λΆ„λ¦¬λœ 각 μˆ«μžκ°€ **μ–‘μˆ˜**인지 κ²€μ¦ν•œλ‹€. + * **음수** 포함 μ‹œ **`IllegalArgumentException`**을 λ°œμƒμ‹œν‚¨λ‹€. +* [ ] λΆ„λ¦¬λœ 각 μš”μ†Œκ°€ **μœ νš¨ν•œ 숫자 ν˜•νƒœ**인지 κ²€μ¦ν•œλ‹€. + * μˆ«μžκ°€ μ•„λ‹Œ 문자(예: `a`) 포함 μ‹œ **`IllegalArgumentException`**을 λ°œμƒμ‹œν‚¨λ‹€. + +#### 1.4. μ΅œμ’… ν•©μ‚° +* [ ] 뢄리 및 검증이 μ™„λ£Œλœ **각 숫자λ₯Ό ν•©μ‚°**ν•œλ‹€. + * ν•©μ‚° κ²°κ³ΌλŠ” μ •μˆ˜ ν˜•νƒœ(int)둜 λ°˜ν™˜ν•œλ‹€. + +--- + +### 2. μž…μΆœλ ₯ 및 μ˜ˆμ™Έ 처리 κΈ°λŠ₯ (Application & Console) + +#### 2.1. μž…λ ₯ 처리 +* [ ] μ‚¬μš©μžμ—κ²Œ μž…λ ₯을 μ•ˆλ‚΄ν•˜λŠ” 문ꡬλ₯Ό 좜λ ₯ν•œλ‹€. + * 좜λ ₯ 문ꡬ: `"λ§μ…ˆν•  λ¬Έμžμ—΄μ„ μž…λ ₯ν•΄ μ£Όμ„Έμš”."` +* [ ] `Console.readLine()`을 μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μžλ‘œλΆ€ν„° λ¬Έμžμ—΄μ„ μž…λ ₯λ°›λŠ”λ‹€. + * 라이브러리: `camp.nextstep.edu.missionutils.Console` μ‚¬μš© ν•„μˆ˜. + +#### 2.2. 좜λ ₯ 처리 +* [ ] κ³„μ‚°λœ λ§μ…ˆ κ²°κ³Όλ₯Ό 좜λ ₯ν•œλ‹€. + * 좜λ ₯ ν˜•μ‹: `"κ²°κ³Ό : [κ³„μ‚°λœ ν•©μ‚° κ°’]"` (예: `κ²°κ³Ό : 6`) + +#### 2.3. μ˜ˆμ™Έ 처리 +* [ ] 계산 λ‘œμ§μ—μ„œ `IllegalArgumentException`이 λ°œμƒν•  경우 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ’…λ£Œν•œλ‹€. + * μ˜ˆμ™Έ λ°œμƒ μ‹œ **`System.exit()` ν˜ΈμΆœμ€ κΈˆμ§€**ν•œλ‹€. + +--- + +### 3. Git 컀밋 및 ν™˜κ²½ μ„€μ • (Pre-course Requirement) + +* [ ] ν”„λ‘œμ νŠΈκ°€ **Java 21** ν™˜κ²½μ—μ„œ μ‹€ν–‰ κ°€λŠ₯ν•˜λ„λ‘ ν™•μΈν•œλ‹€. +* [ ] 제좜 μ „ λͺ¨λ“  ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜μ—¬ 성곡 μ—¬λΆ€λ₯Ό ν™•μΈν•œλ‹€. + * `.\gradlew.bat clean test` λ˜λŠ” `./gradlew clean test` μ‹€ν–‰ ν›„ **`BUILD SUCCESSFUL`** 확인. +* [ ] κ΅¬ν˜„ν•  κΈ°λŠ₯ λͺ©λ‘ λ‹¨μœ„λ‘œ 컀밋을 μ§„ν–‰ν•˜λ©°, 컀밋 λ©”μ‹œμ§€λŠ” **AngularJS Git Commit Message Conventions**을 μ€€μˆ˜ν•œλ‹€. \ No newline at end of file diff --git a/src/main/java/calculator/Application.java b/src/main/java/calculator/Application.java index 573580fb40..0fa063cc2c 100644 --- a/src/main/java/calculator/Application.java +++ b/src/main/java/calculator/Application.java @@ -2,6 +2,7 @@ public class Application { public static void main(String[] args) { - // TODO: ν”„λ‘œκ·Έλž¨ κ΅¬ν˜„ + Calculator calc = new Calculator("1,2;3"); + System.out.println(calc.sum()); } } diff --git a/src/main/java/calculator/Calculator.java b/src/main/java/calculator/Calculator.java new file mode 100644 index 0000000000..8a0cc94c00 --- /dev/null +++ b/src/main/java/calculator/Calculator.java @@ -0,0 +1,17 @@ +package calculator; + +public class Calculator { + private static final String defaultSeparator = "[,;]"; + + public Calculator(String input) { + String[] splitInput = input.split(defaultSeparator); + this.operands = new Operands(splitInput); + + } + + public int sum() { + return operands.getOperands().stream() + .mapToInt(Operand::getOperand) + .sum(); + } +} \ No newline at end of file diff --git a/src/main/java/calculator/Operand.java b/src/main/java/calculator/Operand.java new file mode 100644 index 0000000000..412ac185bf --- /dev/null +++ b/src/main/java/calculator/Operand.java @@ -0,0 +1,19 @@ +package calculator; + + +public class Operands { + private final static String NOT_STRING_MESSAGE = "μˆ«μžκ°€ μ•„λ‹Œ λ¬Έμžμ—΄μ΄ μž…λ ₯λ˜μ—ˆμŠ΅λ‹ˆλ‹€."; + private final static String NOT_POSITIVE_MESSAGE = "μž…λ ₯된 μˆ«μžκ°€ μ–‘μˆ˜κ°€ μ•„λ‹™λ‹ˆλ‹€."; + + + public Operands(String[] splitInput) { + for (String elem : splitInput) { + Operand operand = new Operand(elem); + this.operands.add(operand); + } + } + + public List getOperands() { + return operands; + } +} \ No newline at end of file