page-cover

title

ν˜„μž¬ λ‚΄κ°€ μ‚¬μš©ν•˜λŠ” README μ΄ˆμ•ˆμ€ λ‹€μŒκ³Ό κ°™λ‹€. λ‚˜λ¨Έμ§€λŠ” λ„ˆλ¬΄ λ‹Ήμ—°ν•œ 말이고, μ‹œλ‚˜λ¦¬μ˜€λΌλŠ” 것은 절차적 ν”„λ‘œκ·Έλž˜λ°κ³Ό 거의 같은 말이닀. 이번 포슀트 λ‚΄μš©μ€ 이에 μ§‘μ€‘ν•΄μ„œ λ‚΄ 생각을 μž‘μ„±ν•΄λ³΄λ € ν•œλ‹€.

# java-precourse

## 1. μ‹œλ‚˜λ¦¬μ˜€λ‘œ 문제λ₯Ό ν‘œν˜„ν•œλ‹€.

- ν•˜λ‚˜μ˜ λ¬Έμ œλŠ” ν•˜λ‚˜μ˜ μ‹œλ‚˜λ¦¬μ˜€λ‘œ ν‘œν˜„λœλ‹€.
- ν˜„μž¬λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©°, IDE의 생성/λ¦¬νŒ©ν† λ§ κΈ°λŠ₯을 ν™œμš©ν•˜μ—¬ λΌˆλŒ€λ₯Ό λ§Œλ“ λ‹€.

## 2. μž…μΆœλ ₯ ν˜•μ‹μ„ μ •μ˜ν•œλ‹€.

- μž…λ ₯ λ¬Έμžμ—΄μ—μ„œ μ–΄λ–€ ν˜•μ‹μ˜ 정보λ₯Ό μΆ”μΆœν•΄μ•Ό ν•˜λŠ”κ°€?
- ν™”λ©΄ 좜λ ₯에 ν•„μš”ν•œ ν˜•μ‹μ˜ μ •λ³΄λŠ” 무엇인가?

## 3. 문제λ₯Ό κ°€μž₯ λ‹¨μˆœν•˜κ²Œ ν•΄κ²°ν•  수 μžˆλŠ” 방법을 μƒκ°ν•œλ‹€.

- **κ°€μž₯ ν–‰λ³΅ν•œ 상황**λΆ€ν„° μƒμƒν•œλ‹€.
- μ£Όμ„μœΌλ‘œ κ³ μˆ˜μ€€ λ¬Έλ§₯을 μ½”λ“œμ— μ λŠ”λ‹€.
- 확신이 μ—†λŠ” λΆ€λΆ„λΆ€ν„° ν…ŒμŠ€νŠΈν•œλ‹€.

## 4. μš”κ΅¬μ‚¬ν•­ λ¬Έμ„œλ₯Ό 읽어보고 μ κ²€ν•œλ‹€.

- μš”κ΅¬μ‚¬ν•­μ„ 놓쳀을 κ°€λŠ₯성을 염두에 λ‘”λ‹€.
- ν…ŒμŠ€νŠΈλ‘œ 적절히 ν‘œν˜„λ˜μ—ˆλŠ”μ§€ 기둝해두고 μ°Έκ³ ν•˜μž.

κ΅¬ν˜„ν•΄λ³΄λ©΄μ„œ λŠλ‚€ 점은 μ œν•œ μ‹œκ°„μ„ μ€€μˆ˜ν•˜λ©΄μ„œ μ•„λ¦„λ‹€μš΄ TDDλ₯Ό μˆ˜ν–‰ν•˜κΈ°μ—λŠ” λ‚΄ 개발 μ‹€λ ₯이 아직 λΆ€μ‘±ν•˜λ‹€λŠ” 것이닀. κ·Έλž˜μ„œ λ‚΄ ν•œκ³„λ₯Ό μΈμ •ν•˜κ³ , μ€‘μš”ν•œ 것에 μ§‘μ€‘ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ „ν™˜ν–ˆλ‹€. κ·Έλ ‡λ‹€κ³  κ°€μž₯ μ–΄λ €μšΈ 것 같은 κΈ°λŠ₯λΆ€ν„° κ΅¬ν˜„ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ‹œμž‘ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€. λ‚˜λŠ” 문제λ₯Ό ==μ‹œλ‚˜λ¦¬μ˜€λ‘œ μ •μ˜ν•˜λŠ” 것==λΆ€ν„° μ‹œμž‘ν•œλ‹€.

μ‹œλ‚˜λ¦¬μ˜€λ‘œ 문제λ₯Ό ν‘œν˜„ν•˜λŠ” 것은 섀계 없이도 κ΅¬ν˜„μ„ κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€. 일반 언어보닀 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄κ°€ 더 νŽΈν•œ λ‚΄κ²ŒλŠ” 이 방법이 더 μ’‹κ²Œ λŠκ»΄μ‘Œλ‹€. λͺ¨λ“  뢄석 κ²°κ³Όλ₯Ό λ¬Έμ„œμ— μž₯ν™©ν•˜κ²Œ λŠ˜μ–΄λ†“μ§€ μ•Šμ„ 수 μžˆλ‹€λŠ” 점이 μ’‹μ•˜λ‹€. λ¬Έμ„œν™”λ₯Ό μ΅œμ†Œν™”ν•˜κ³  주석과 μ½”λ“œλ₯Ό ν™œμš©ν•˜λŠ” 것이 νŽΈν•˜κ²Œ λŠκ»΄μ‘Œλ‹€.

λ‹€μŒμ€ 처음으둜 vendingmachine 문제λ₯Ό ν•΄κ²°ν–ˆμ„ λ•Œ λ‚΄κ°€ μž‘μ„±ν–ˆλ˜ μ‹œλ‚˜λ¦¬μ˜€μ˜ λ‚΄μš©μ΄λ‹€. 원본은 총 μ„Έ 개의 파일둜 λ‚˜λˆ„μ–΄μ Έ μžˆμ§€λ§Œ, 보기 μ’‹κ²Œ ν•˜λ‚˜λ‘œ ν•©μ³€λ‹€. GitHub 링크

exceptionHandler.tryUntilValid(() -> {
	int money = inputView.readInitialVendorMoney();
	vendor.vendorDepositBalance(money);
});

var balance = vendor.getVendorCurrentBalance();
outputView.printCurrentVendorMoney(balance);

exceptionHandler.tryUntilValid(() -> {
	var items = inputView.readInitialVendorItems();
	vendor.addStocks(items);
});

exceptionHandler.tryUntilValid(() -> {
	int money = inputView.readInitialUserMoney();
	vendor.userDepositBalance(money);
});

while (true) {
	int balance = vendor.getUserCurrentBalance();
	outputView.printCurrentUserMoney(balance);
	if (!vendor.canUserPurchase()) {
		break;
	}
	purchaseItem();
}

var balance = vendor.userWithdrawBalance();
outputView.printRemainingUserMoney(balance);

μ΅œμ΄ˆμ— 이 μ½”λ“œλ₯Ό μž‘μ„±ν•œ 이후, λ‚œ 이 μ½”λ“œλ₯Ό μˆ˜μ •ν•œ 적이 거의 μ—†λ‹€. (λ―Έλ¬˜ν•œ λ‰˜μ•™μŠ€ λ•Œλ¬Έμ— ν•¨μˆ˜ 이름 λ°”κΎΌ 정도?) 핡심은 Vendor vendorλΌλŠ” λ³€μˆ˜λ₯Ό μ „λ‹¬λ°›λŠ”λ‹€λŠ” κ°€μ •μ—μ„œ μ‹œμž‘ν•˜μ—¬, ==μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©° ν”„λ‘œκ·Έλž¨ 전체 섀계λ₯Ό μ™„μ„±ν•  수 μžˆμ—ˆλ‹€==λŠ” 것이닀. λ§Œμ•½ μ•žμ„œ μ œκ³΅ν•œ κΉƒν—ˆλΈŒ 링크λ₯Ό λˆŒλŸ¬λ³΄μ•˜λ‹€λ©΄, μ‹€μ œ μ½”λ“œλŠ” 주석 λ•Œλ¬Έμ— μ’€ 더 λ”λŸ½κ²Œ 느껴질 수 μžˆλ‹€. 주석은 개발 쀑 κ³ μˆ˜μ€€ λ¬Έλ§₯을 μ‰½κ²Œ μ°Έμ‘°ν•  수 μžˆλŠ” 쒋은 방법이라 μƒκ°ν•œλ‹€. λ§ˆμ§€λ§‰μ— κΉ”λ”ν•˜κ²Œ μ •λ¦¬ν•œλ‹€λ©΄ 개발 μ€‘μ—λŠ” 적극적으둜 μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€κ³  μƒκ°ν•œλ‹€.

μž¬λ―ΈμžˆλŠ” 사싀은 이런 방법둠을 적극적으둜 λ„μž…ν–ˆμŒμ—λ„, 아직 손에 읡지 μ•Šμ•„ μš”κ΅¬μ‚¬ν•­μ„ λ†“μΉ˜λŠ” λ“±μ˜ μ‹€μˆ˜κ°€ λ°œμƒν•œλ‹€λŠ” 점이닀. μ˜ˆμ „μ— 졜초 μš”κ΅¬μ‚¬ν•­ λΆ„μ„μœΌλ‘œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό λ§Œλ“œλŠ” μ„ ν–‰ μž‘μ—…μœΌλ‘œ 도움을 λ°›μ•˜λ˜ 기얡이 λ‚˜μ„œ, λ‹€μŒμ—λŠ” 그런 뢀뢄을 κ³ λ €ν•΄λ³Ό μ˜ˆμ •μ΄λ‹€.


+ μ•„λž˜μ˜ λ‚΄μš©μ€ 10일 전에 μž‘μ„±ν–ˆλ˜ λ‚΄μš©μ΄λ‹€. 12μ›” 3일의 λ‚΄ λͺ¨μŠ΅μ€ 13일 ν˜„μž¬μ˜ λͺ¨μŠ΅κ³Ό 많이 달라보인닀. λ¬Όλ‘  μ§€κΈˆλ„ μ•„λž˜ 적힌 λ‚΄μš©λ“€μ„ ν™œμš©ν•˜μ§€λ§Œ, 차이점이라 ν•˜λ©΄ λ‹Ήμ‹œμ—λŠ” κ΅¬ν˜„μ˜ μˆœμ„œλ‚˜ 행동에 μ œμ•½μ„ λ‘μ—ˆλ‹€λŠ” 것이고, ν˜„μž¬λŠ” μ‚¬κ³ μ˜ 틀을 μ’νžˆλŠ” λŠλ‚Œμ΄ μžˆλ‹€.

[!tldr] 자주 λ°˜λ³΅λ˜λŠ” λΉ„μŠ·ν•œ 것을 μœ ν˜•ν™”ν•˜λ©΄, 차이점에 집쀑할 수 있게 λœλ‹€.

κ³„νšμ€ μ‚¬κ³ μ˜ 틀이닀. μ΄λŸ¬ν•œ κΈ°λ°˜μ€ μ‚¬μ†Œν•œ κ³ λ―Ό 없이 핡심에 λΉ λ₯΄κ²Œ 집쀑할 수 μžˆλ„λ‘ λ§Œλ“€μ–΄μ€€λ‹€. λ‹€μŒμ€ μš”κ΅¬μ‚¬ν•­ μ •μ˜μ„œκ°€ μ£Όμ–΄μ§„λ‹€λŠ” κ°€μ • ν•˜μ—, 그것을 PM/개발자의 μ–Έμ–΄λ‘œ μž‘μ„±ν•˜λŠ” 과정을 ν‘œμ€€ν™”ν•œ λ‚΄μš©μ΄λ‹€.

## 1. μš”κ΅¬μ‚¬ν•­ 정리

> μž…λ ₯λΆ€ν„° 좜λ ₯κΉŒμ§€ `μžλ£Œν˜•μ˜ λ³€ν™˜`으둜 논리적 흐름을 ν‘œν˜„ν•œλ‹€.<br>
> ν•„μš”ν•˜λ‹€λ©΄ μž„μ˜μ˜ μžλ£Œν˜•μ„ μƒˆλ‘­κ²Œ μ •μ˜ν•  수 μžˆλ‹€.

## 2. 객체 섀계

> μž‘μ—…μ„ μ§„ν–‰ν•  λŒ€μƒμ„ μ„ νƒν•˜κ³ ,
> `μ±…μž„κ³Ό μ—­ν• `을 체크리슀트둜 λ‚˜μ—΄ν•œλ‹€.

## 3. μ˜ˆμ™Έ 상황

> μ–΄λ–€ 상황에 μ–΄λ–€ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€κ³ , μ–΄λ–»κ²Œ μ²˜λ¦¬ν•΄μ•Ό ν•˜λŠ”μ§€ μ„€λͺ…ν•œλ‹€.

컀밋 λ©”μ‹œμ§€ μž‘μ„± 과정도 개발 쀑 μ€κ·Όνžˆ μ˜€λ²„ν—€λ“œκ°€ 큰 뢀뢄이닀. κΈ°λŠ₯ μΆ”κ°€λ§Œ μƒκ°ν–ˆμ„ λ•Œμ—λŠ” λ‹€μŒκ³Ό 같은 ν‘œμ€€ν™”λ„ κ°€λŠ₯ν•  것 κ°™λ‹€. μ΄λŸ¬ν•œ 방식은 ==1. TDD 기반==으둜 ==2. μš”κ΅¬μ‚¬ν•­μ„ λͺ¨λ‘ ν…ŒμŠ€νŠΈλ‘œ μž‘μ„±==ν•˜λŠ” 것을 μ „μ œλ‘œ ν•˜κ³  μžˆλ‹€.

## κΈ°λ³Έ 원칙

### 컀밋 ν‘œμ€€

일반적으둜 `μΈν„°νŽ˜μ΄μŠ€ - ν…ŒμŠ€νŠΈ - κ΅¬ν˜„` μˆœμ„œλ‘œ μ§„ν–‰ν•œλ‹€.

> `feat(μΈν„°νŽ˜μ΄μŠ€): implement (κ΅¬ν˜„ν•œ λ©”μ„œλ“œ)`
>
> - (κ΄€λ ¨ ν…ŒμŠ€νŠΈ λ©”μ„œλ“œ λ‚˜μ—΄...)

[!example]-

## 1. μš”κ΅¬μ‚¬ν•­ 정리

- λ¬Έμžμ—΄(+뢄리 κ·œμΉ™) -> 숫자 λ°°μ—΄ -> 숫자(λ§μ…ˆ κ²°κ³Ό)
- `String + ParseRule -> Iterable<Number> -> Number`

## 2. 객체 섀계

- [x] κ΅¬λΆ„μž(μΈν„°νŽ˜μ΄μŠ€; `Delimiter`): μ£Όμ–΄μ§„ λ¬Έμžμ—΄μ„ μžμ‹ μ˜ ꡬ뢄 κ·œμΉ™μ— 따라 숫자둜 λ³€ν™˜ν•œλ‹€.
- κΈ°λ³Έ κ΅¬λΆ„μž(클래슀; `IntegerDefaultDelimiter`)
- [x] μ‰Όν‘œ(,)와 콜둠(:) λͺ¨λ‘ κ΅¬λΆ„μžλ‘œ κ°„μ£Όν•œλ‹€.
- μ»€μŠ€ν…€ κ΅¬λΆ„μž(클래슀; `IntegerCustomDelimiter`)
- [x] λ¬Έμžμ—΄ μ•žλΆ€λΆ„μ˜ `"//"`와 `"\n"` 사이에 μœ„μΉ˜ν•˜λŠ” 문자λ₯Ό κ΅¬λΆ„μžλ‘œ κ°„μ£Όν•œλ‹€.
- [x] 계산기(클래슀; `Calculator`): μ£Όμ–΄μ§„ λ¬Έμžμ—΄μ„ λΆ„λ¦¬ν•˜κ³ , λ”ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€.

## 3. μ˜ˆμ™Έ 상황

`IllegalArgumentException`을 λ°œμƒμ‹œν‚€κ³  μ’…λ£Œν•œλ‹€.

- [x] μ»€μŠ€ν…€ κ΅¬λΆ„μžκ°€ κΈ°λ³Έ κ΅¬λΆ„μžμ™€ 겹치면 μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.
- [x] μ»€μŠ€ν…€ κ΅¬λΆ„μžκ°€ 숫자면 μ˜λ„μΉ˜ μ•Šμ€ κ²°κ³Όκ°€ λ°œμƒν•  수 μžˆμœΌλ―€λ‘œ, μš”κ΅¬μ‚¬ν•­μ— λͺ…μ‹œλ˜μ§€λŠ” μ•Šμ•˜μ§€λ§Œ μ˜ˆμ™Έ μƒν™©μœΌλ‘œ κ°„μ£Όν•œλ‹€.
- [x] 숫자λ₯Ό 뢄리할 λ•Œ, ν˜•μ‹ 였λ₯˜κ°€ λ°œμƒν•  수 μžˆλ‹€.
- [x] λΆ„λ¦¬λœ μˆ«μžκ°€ μ–‘μˆ˜κ°€ μ•„λ‹ˆλΌλ©΄ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.
- [x] 숫자λ₯Ό 더할 λ•Œ, μ˜€λ²„ν”Œλ‘œμš°κ°€ λ°œμƒν•  수 μžˆλ‹€.