Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
819bff5
docs(README): 리뷰λ₯Ό 톡해 μˆ˜μ •ν•œ λ‚΄μš©μ„ 반영
JYL35 Mar 11, 2026
258ba6f
refactor: 파일 ꡬ쑰 μˆ˜μ •
JYL35 Mar 11, 2026
0e0783a
refactor(Hand): λΆˆλ³€ 객체둜 μˆ˜μ •
JYL35 Mar 12, 2026
aeb1bd5
refactor(Members): ν”Œλ ˆμ΄μ–΄ κ²Œμž„ κ²°κ³Ό κ²°μ • κΈ°λŠ₯ μˆ˜μ •(κ°„μ†Œν™”)
JYL35 Mar 12, 2026
e2ec1e6
test(Members): λˆ„λ½λœ ν…ŒμŠ€νŠΈ μž‘μ„±
JYL35 Mar 12, 2026
8ef0716
refactor(OutputView): ν”Œλ ˆμ΄μ–΄ κ²°κ³Ό 좜λ ₯ κΈ°λŠ₯ μˆ˜μ •
JYL35 Mar 12, 2026
5b571dd
refactor(Card): ν•„λ“œ λΆˆλ³€μœΌλ‘œ μˆ˜μ •
JYL35 Mar 12, 2026
6b2d824
refactor(Service): ν•„λ“œ μ΄ˆκΈ°ν™” μ „ μ‚¬μš© κ°€λŠ₯성이 μžˆμ–΄ λ°©μ§€ κΈ°λŠ₯ κ΅¬ν˜„
JYL35 Mar 12, 2026
8528c2d
refactor(Members): λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄λ‘œ 뢄리
JYL35 Mar 14, 2026
9f838fb
refactor(Deck): 덱 μ…”ν”Œ μ‹œ κ°•μ œ μΊμŠ€νŒ… 제거
JYL35 Mar 14, 2026
45e3509
feat(ValidatedInput): μž…λ ₯ κ°’ 검증 클래슀 κ΅¬ν˜„
JYL35 Mar 14, 2026
bc0a00a
feat(InputView): λ² νŒ… κΈˆμ•‘ μž…λ ₯ κΈ°λŠ₯ κ΅¬ν˜„
JYL35 Mar 14, 2026
3308686
docs(README): Cycle2 λ―Έμ…˜μ— 맞게 μˆ˜μ •
JYL35 Mar 14, 2026
37ec062
test(Card): 같은 μ£Όμ†Œμ˜ μΉ΄λ“œλ₯Ό λ°˜ν™˜ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” ν…ŒμŠ€νŠΈ μž‘μ„±
JYL35 Mar 14, 2026
63d3e91
feat(Card): 정적 νŒ©ν† λ¦¬ λ©”μ†Œλ“œ κ΅¬ν˜„
JYL35 Mar 14, 2026
bd43438
test(Money): VO 검증, μ˜ˆμ™Έ, 수읡금 계산 ν…ŒμŠ€νŠΈ μž‘μ„±
JYL35 Mar 14, 2026
e429be5
feat(Money): VO, μ˜ˆμ™Έ, 수읡금 계산 κΈ°λŠ₯ κ΅¬ν˜„
JYL35 Mar 14, 2026
9d85b36
test(State): Bust와 Blackjack μƒνƒœ ν…ŒμŠ€νŠΈ μž‘μ„±
JYL35 Mar 14, 2026
a9798d8
feat(State): κ²Œμž„ μ’…λ£Œ μƒνƒœ 관리λ₯Ό μœ„ν•œ State μΆ”κ°€
JYL35 Mar 14, 2026
c496ce9
test(State): Hit 이후 μƒνƒœ μ „ν™˜ ν…ŒμŠ€νŠΈ μž‘μ„±
JYL35 Mar 14, 2026
96fa9fe
test(State): Stay μƒνƒœμ˜ μ’…λ£Œ μ—¬λΆ€ 및 수읡λ₯ , μ˜ˆμ™Έ ν…ŒμŠ€νŠΈ μž‘μ„±
JYL35 Mar 14, 2026
880fc5d
feat(State): Stay μ’…λ£Œ μƒνƒœ κ΅¬ν˜„
JYL35 Mar 14, 2026
2af5859
test(State): Hit μƒνƒœ 및 Running 클래슀 κ΅¬ν˜„
JYL35 Mar 14, 2026
52be408
test(State): 클래슀 λͺ… 및 λ©”μ†Œλ“œ λͺ… μˆ˜μ •
JYL35 Mar 14, 2026
9be9861
test(Member): Player의 μƒνƒœλ³„ 수읡 λ°˜ν™˜ ν…ŒμŠ€νŠΈ μž‘μ„±
JYL35 Mar 14, 2026
bcc7fca
refactor(Money): Money 클래슀 μœ„μΉ˜ λ³€κ²½
JYL35 Mar 14, 2026
e7d490a
refactor(Member): Member 클래슀 μƒνƒœ νŒ¨ν„΄ 적용 및 Player λ² νŒ… κΈˆμ•‘ ν•„λ“œ μΆ”κ°€
JYL35 Mar 14, 2026
d4cc1ad
refactor(Members & GameTable): Members 및 GameTable의 점수 직접 비ꡐ λ‘œμ§μ„ μƒνƒœ 확…
JYL35 Mar 14, 2026
132e809
refactor(Service): λ³€κ²½λœ GameTable에 맞게 μˆ˜μ •
JYL35 Mar 14, 2026
ab20a64
feat(Controller): λ² νŒ… κΈˆμ•‘ μž…λ ₯ κΈ°λŠ₯ κ΅¬ν˜„
JYL35 Mar 14, 2026
dd7d869
test(State): λ”œλŸ¬κ°€ μΉ΄λ“œλ₯Ό 뽑은 이후 λ°˜ν™˜λ˜λŠ” μƒνƒœ ν…ŒμŠ€νŠΈ μž‘μ„±
JYL35 Mar 14, 2026
88ecc99
feat(State): λ”œλŸ¬κ°€ μΉ΄λ“œλ₯Ό 뽑은 이후 μƒνƒœ λ°˜ν™˜ κΈ°λŠ₯ κ΅¬ν˜„
JYL35 Mar 14, 2026
7c01058
test(State): ν”Œλ ˆμ΄μ–΄κ°€ μΉ΄λ“œλ₯Ό λ½‘μ•˜μ„ λ•Œ 합산이 21이면 λ‚˜μ˜€λŠ” μƒνƒœ ν…ŒμŠ€νŠΈ
JYL35 Mar 14, 2026
93b9937
feat(State): ν”Œλ ˆμ΄μ–΄κ°€ μΉ΄λ“œλ₯Ό λ½‘μ•˜μ„ λ•Œ 쑰건에 따라 μƒνƒœ λ°˜ν™˜ κΈ°λŠ₯ κ΅¬ν˜„
JYL35 Mar 14, 2026
47725e2
refactor(State): Blackjack, Stay, Bust의 수읡λ₯  λ°˜ν™˜ κΈ°λŠ₯ μˆ˜μ •
JYL35 Mar 14, 2026
96872c3
test(Members): λͺ¨λ“  멀버 수읡 μ •μ‚° ν…ŒμŠ€νŠΈ
JYL35 Mar 14, 2026
426cc5e
feat(Members): λͺ¨λ“  멀버 수읡 μ •μ‚° κΈ°λŠ₯ κ΅¬ν˜„
JYL35 Mar 14, 2026
22ab1ca
refactor(Member): Bust μƒνƒœλ₯Ό μ΄μš©ν•΄μ„œ Bust인지 ν™•μΈν•˜λŠ” κΈ°λŠ₯ κ΅¬ν˜„
JYL35 Mar 14, 2026
b8375da
refactor(Service): λͺ¨λ“  λ©€λ²„μ˜ κ²Œμž„ κ²°κ³Ό λ°˜ν™˜ κΈ°λŠ₯ μˆ˜μ •
JYL35 Mar 14, 2026
2b3f0e0
refactor(View): λͺ¨λ“  λ©€λ²„μ˜ κ²Œμž„ κ²°κ³Ό 좜λ ₯ κΈ°λŠ₯ μˆ˜μ •
JYL35 Mar 14, 2026
2d7bfcf
fix(State): λΈ”λž™μž­ μ‹œ λ² νŒ…κΈˆμ— 1.5λ°° 적용이 μ•ˆλ˜λŠ” 문제 ν•΄κ²°
JYL35 Mar 14, 2026
53d42bd
style: μ½”λ“œ μ»¨λ²€μ…˜ 맞좀
JYL35 Mar 14, 2026
457c5a6
refactor(Dealer): λ”œλŸ¬ 뽑기 쑰건 비ꡐ κΈ°λŠ₯ 제거
JYL35 Mar 14, 2026
9139edc
refactor(Dealer): μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 클래슀 μƒμˆ˜ 제거
JYL35 Mar 14, 2026
1351ebb
docs(README): 체크 리슀트 확인
JYL35 Mar 14, 2026
12afb7e
Merge pull request #5 from JYL35/cycle2
JYL35 Mar 14, 2026
ca8d35d
feat(View): inputView, outputViewλ₯Ό λ‹΄λŠ” BlackjackView κ΅¬ν˜„
JYL35 Mar 14, 2026
b39a1d9
fix: 21이 λ˜μ–΄λ„ μ’…λ£Œν•˜μ§€ μ•ŠλŠ” ν˜„μƒ μˆ˜μ •
JYL35 Mar 14, 2026
4bcf5fb
Merge pull request #6 from JYL35/cycle2
JYL35 Mar 14, 2026
2a4b988
refactor(Member): 상속 λ°©μ‹μ—μ„œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν™œμš©ν•œ μ‘°ν•© λ°©μ‹μœΌλ‘œ μˆ˜μ •
JYL35 Mar 16, 2026
7f2ca54
refactor(Members): ν”Œλ ˆμ΄μ–΄μ™€ λ”œλŸ¬ μŠ€μ½”μ–΄ λ°˜ν™˜ κΈ°λŠ₯ λ©”μ†Œλ“œ λͺ… μˆ˜μ •
JYL35 Mar 16, 2026
b702593
refactor(State): Bust와 Blackjack 확인 κΈ°λŠ₯ κ΅¬ν˜„
JYL35 Mar 16, 2026
2490ef6
refactor: 천 λ‹¨μœ„ ꡬ뢄 기호 μΆ”κ°€
JYL35 Mar 16, 2026
3c24d3f
refactor: 잘λͺ»λœ λ©”μ†Œλ“œ μž‘λͺ… μˆ˜μ •
JYL35 Mar 16, 2026
d88d116
refactor(Service): GameTable 생성 μ‹œμ  μˆ˜μ •
JYL35 Mar 16, 2026
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
174 changes: 73 additions & 101 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,88 +1,59 @@
# java-blackjack
λΈ”λž™μž­ λ―Έμ…˜ μ €μž₯μ†Œ

## κΈ°λŠ₯ μš”κ΅¬μ‚¬ν•­
## κ΅¬ν˜„ν•  κΈ°λŠ₯ λͺ©λ‘

---
λΈ”λž™μž­ κ²Œμž„μ„ λ³€ν˜•ν•œ ν”„λ‘œκ·Έλž¨μ„ κ΅¬ν˜„ν•œλ‹€. λΈ”λž™μž­ κ²Œμž„μ€ **λ”œλŸ¬**와 **ν”Œλ ˆμ΄μ–΄** 쀑 μΉ΄λ“œμ˜ 합이 **21** λ˜λŠ” **21에 κ°€μž₯ κ°€κΉŒμš΄ 숫자**λ₯Ό κ°€μ§€λŠ” μͺ½μ΄ μ΄κΈ°λŠ” κ²Œμž„μ΄λ‹€.

μΉ΄λ“œμ˜ 숫자 계산은 μΉ΄λ“œ 숫자λ₯Ό 기본으둜 ν•˜λ©°, μ˜ˆμ™Έλ‘œ AceλŠ” 1 λ˜λŠ” 11둜 계산할 수 있으며, King, Queen, Jack은 각각 10으둜 κ³„μ‚°ν•œλ‹€.
κ²Œμž„μ„ μ‹œμž‘ν•˜λ©΄ ν”Œλ ˆμ΄μ–΄λŠ” **두 μž₯의 μΉ΄λ“œ**λ₯Ό μ§€κΈ‰ λ°›μœΌλ©°, 두 μž₯의 μΉ΄λ“œ 숫자λ₯Ό 합쳐 21을 μ΄ˆκ³Όν•˜μ§€ μ•ŠμœΌλ©΄μ„œ 21에 κ°€κΉκ²Œ λ§Œλ“€λ©΄ 이긴닀.
21을 λ„˜μ§€ μ•Šμ„ 경우 μ›ν•œλ‹€λ©΄ μ–Όλ§ˆλ“ μ§€ μΉ΄λ“œλ₯Ό 계속 뽑을 수 μžˆλ‹€.
λ”œλŸ¬λŠ” μ²˜μŒμ— 받은 2μž₯의 합계가 **16μ΄ν•˜**이면 λ°˜λ“œμ‹œ 1μž₯의 μΉ΄λ“œλ₯Ό μΆ”κ°€λ‘œ λ°›μ•„μ•Ό ν•˜κ³ , **17점 이상**이면 μΆ”κ°€λ‘œ 받을 수 μ—†λ‹€.
κ²Œμž„μ„ μ™„λ£Œν•œ ν›„ 각 ν”Œλ ˆμ΄μ–΄λ³„λ‘œ 승패λ₯Ό 좜λ ₯ν•œλ‹€.

### Card
#### field
- CardNumber(Enum class)
- CardPattern(Enum class)
#### method
- 숫자 검증
- μΉ΄λ“œ νŒ¨ν„΄ 검증
---
### Hand(1κΈ‰ μ»¬λ ‰μ…˜)
#### field
- List Card
- μΉ΄λ“œ 주인
#### method
- Append Card (μΉ΄λ“œ μΆ”κ°€)
- 전체 κ°’(ν•„λ“œλ‘œ λ‘μ§€λŠ” μ•Šκ³ , κ³„μ‚°μœΌλ‘œ λ°˜ν™˜) 계산 calculate
- λ¬Έμ–‘κ³Ό μˆ«μžκ°€ μ€‘λ³΅λ˜λŠ”μ§€ 검사
- Ace 값을 κ²°μ •?
---
### Member
#### field
- Hand
- Role(player | dealer)

#### method
- receive
- roleIsDealer λ”œλŸ¬μΈμ§€ 확인 ν›„ μΉ΄λ“œ 뽑을지
- decideWinner(Member(역할이 dealer))
---
### GameTable
#### field
- Members(일급 μ»¬λ ‰μ…˜)
### 1. μΉ΄λ“œ 도메인 고도화
- [x] **μΉ΄λ“œ 캐싱(Flyweight Pattern)**: 52μž₯의 μΉ΄λ“œλ₯Ό 미리 μƒμ„±ν•˜κ³  μž¬μ‚¬μš©ν•œλ‹€.
- [x] **μ…”ν”Œ μ „λž΅ μ£Όμž…**: ν…ŒμŠ€νŠΈ κ°€λŠ₯ν•˜λ„λ‘ μ…”ν”Œ λ‘œμ§μ„ μΈν„°νŽ˜μ΄μŠ€λ‘œ λΆ„λ¦¬ν•œλ‹€.

#### method
- join : player μΆ”κ°€
- CardResult playRound()
- List<Card> draw(memberName, Card)
### 2. λ² νŒ… 도메인 μΆ”κ°€
- [x] **κΈˆμ•‘(Money) 객체**: λ² νŒ… κΈˆμ•‘ μ›μ‹œ 값을 포μž₯ν•˜κ³ , 수읡λ₯ μ— λ”°λ₯Έ 계산 λ‘œμ§μ„ κ°€μ§„λ‹€.
- [x] **ν”Œλ ˆμ΄μ–΄λ³„ λ² νŒ…**: κ²Œμž„ μ‹œμž‘ μ‹œ ν”Œλ ˆμ΄μ–΄λ³„λ‘œ λ² νŒ… κΈˆμ•‘μ„ μž…λ ₯λ°›λŠ”λ‹€.

### Service
- holdingPlayerCards()
```
λ”œλŸ¬μΉ΄λ“œ: 3닀이아λͺ¬λ“œ, 9ν΄λ‘œλ²„, 8닀이아λͺ¬λ“œ - κ²°κ³Ό: 20
pobiμΉ΄λ“œ: 2ν•˜νŠΈ, 8μŠ€νŽ˜μ΄λ“œ, Aν΄λ‘œλ²„ - κ²°κ³Ό: 21
jasonμΉ΄λ“œ: 7ν΄λ‘œλ²„, KμŠ€νŽ˜μ΄λ“œ - κ²°κ³Ό: 17
```
- finalResult()
```
## μ΅œμ’… 승패
λ”œλŸ¬: 1승 1패
pobi: 승
jason: 패
```
### 3. μƒνƒœ(State) νŒ¨ν„΄ 기반 둜직 λ¦¬νŒ©ν† λ§
- [x] **μƒνƒœ 좔상화**: `Started`, `Running`, `Finished` λ“± κ²Œμž„μ˜ μƒνƒœλ₯Ό 객체둜 μ •μ˜ν•œλ‹€.
- [x] **μƒνƒœ 전이 κ΅¬ν˜„**:
- `Hit` μƒνƒœμ—μ„œ `draw` 호좜 μ‹œ μ μˆ˜μ— 따라 `Hit` ν˜Ήμ€ `Bust`둜 μ „μ΄ν•œλ‹€.
- `Hit` μƒνƒœμ—μ„œ `stay` 호좜 μ‹œ `Stay` μƒνƒœλ‘œ μ „μ΄ν•œλ‹€.
- [x] **수읡λ₯ (Earnings Rate) μΊ‘μŠν™”**:
- `Blackjack`: 1.5λ°° 수읡λ₯  λ°˜ν™˜
- `Bust`: -1.0λ°° 수읡λ₯  λ°˜ν™˜
- `Stay`: λ”œλŸ¬μ™€ 비ꡐ 결과에 따라 수읡λ₯  λ°˜ν™˜

### Controller
- inputView둜 μž…λ ₯λ°›λŠ” 멀버 μΆ”κ°€ (join 호좜)
- GameTableμ—μ„œ 멀버 리슀트λ₯Ό λ°›μ•„μ™€μ„œ 멀버별 drawμ˜μ‚¬ νŒλ³„ 반볡
### 4. κ²Œμž„ μ§„ν–‰ 및 μ •μ‚°
- [x] **수읡 계산**: κ²Œμž„ μ’…λ£Œ ν›„ ν”Œλ ˆμ΄μ–΄μ˜ μƒνƒœμ— λ”°λ₯Έ μ΅œμ’… μˆ˜μ΅μ„ κ³„μ‚°ν•œλ‹€.
- [x] **λ”œλŸ¬ μ΅œμ’… 수읡**: λͺ¨λ“  ν”Œλ ˆμ΄μ–΄ 수읡의 합에 -1을 κ³±ν•œ 값을 λ„μΆœν•œλ‹€.

---
### Deck
#### method
- draw
- Card Generator 52 queue에 μ΄ˆκΈ°ν™”
### 5. UI 및 좜λ ₯
- [x] 각 ν”Œλ ˆμ΄μ–΄μ˜ λ² νŒ… κΈˆμ•‘ μž…λ ₯ κΈ°λŠ₯
- [x] μ΅œμ’… κ²°κ³Ό μ‹œ ν”Œλ ˆμ΄μ–΄λ³„/λ”œλŸ¬ 수읡 합계 좜λ ₯


## κΈ°λŠ₯ μš”κ΅¬μ‚¬ν•­
λΈ”λž™μž­ κ²Œμž„μ„ λ³€ν˜•ν•œ ν”„λ‘œκ·Έλž¨μ„ κ΅¬ν˜„ν•œλ‹€. λΈ”λž™μž­ κ²Œμž„μ€ λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄ 쀑 μΉ΄λ“œμ˜ 합이 21 λ˜λŠ” 21에 κ°€μž₯ κ°€κΉŒμš΄ 숫자λ₯Ό κ°€μ§€λŠ” μͺ½μ΄ μ΄κΈ°λŠ” κ²Œμž„μ΄λ‹€.

## μ‹€ν–‰ κ²°κ³Ό
- ν”Œλ ˆμ΄μ–΄λŠ” κ²Œμž„μ„ μ‹œμž‘ν•  λ•Œ λ°°νŒ… κΈˆμ•‘μ„ μ •ν•΄μ•Ό ν•œλ‹€.
- μΉ΄λ“œμ˜ 숫자 계산은 μΉ΄λ“œ 숫자λ₯Ό 기본으둜 ν•˜λ©°, μ˜ˆμ™Έλ‘œ AceλŠ” 1 λ˜λŠ” 11둜 계산할 수 있으며, King, Queen, Jack은 각각 10으둜 κ³„μ‚°ν•œλ‹€.
- κ²Œμž„μ„ μ‹œμž‘ν•˜λ©΄ ν”Œλ ˆμ΄μ–΄λŠ” 두 μž₯의 μΉ΄λ“œλ₯Ό μ§€κΈ‰ λ°›μœΌλ©°, 두 μž₯의 μΉ΄λ“œ 숫자λ₯Ό 합쳐 21을 μ΄ˆκ³Όν•˜μ§€ μ•ŠμœΌλ©΄μ„œ 21에 κ°€κΉκ²Œ λ§Œλ“€λ©΄ 이긴닀. 21을 λ„˜μ§€ μ•Šμ„ 경우 μ›ν•œλ‹€λ©΄ μ–Όλ§ˆλ“ μ§€ μΉ΄λ“œλ₯Ό 계속 뽑을 수 μžˆλ‹€. 단, μΉ΄λ“œλ₯Ό μΆ”κ°€λ‘œ 뽑아 21을 μ΄ˆκ³Όν•  경우 λ°°νŒ… κΈˆμ•‘μ„ λͺ¨λ‘ μžƒκ²Œ λœλ‹€.
- 처음 두 μž₯의 μΉ΄λ“œ 합이 21일 경우 λΈ”λž™μž­μ΄ 되면 λ² νŒ… κΈˆμ•‘μ˜ 1.5 λ°°λ₯Ό λ”œλŸ¬μ—κ²Œ λ°›λŠ”λ‹€. λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄κ°€ λͺ¨λ‘ λ™μ‹œμ— λΈ”λž™μž­μΈ 경우 ν”Œλ ˆμ΄μ–΄λŠ” λ² νŒ…ν•œ κΈˆμ•‘μ„ λŒλ €λ°›λŠ”λ‹€.
- λ”œλŸ¬λŠ” μ²˜μŒμ— 받은 2μž₯의 합계가 16μ΄ν•˜μ΄λ©΄ λ°˜λ“œμ‹œ 1μž₯의 μΉ΄λ“œλ₯Ό μΆ”κ°€λ‘œ λ°›μ•„μ•Ό ν•˜κ³ , 17점 이상이면 μΆ”κ°€λ‘œ 받을 수 μ—†λ‹€. λ”œλŸ¬κ°€ 21을 μ΄ˆκ³Όν•˜λ©΄ κ·Έ μ‹œμ κΉŒμ§€ 남아 있던 ν”Œλ ˆμ΄μ–΄λ“€μ€ κ°€μ§€κ³  μžˆλŠ” νŒ¨μ— 상관 없이 μŠΉλ¦¬ν•΄ λ² νŒ… κΈˆμ•‘μ„ λ°›λŠ”λ‹€.

### μ‹€ν–‰ κ²°κ³Ό

---
```
κ²Œμž„μ— μ°Έμ—¬ν•  μ‚¬λžŒμ˜ 이름을 μž…λ ₯ν•˜μ„Έμš”.(μ‰Όν‘œ κΈ°μ€€μœΌλ‘œ 뢄리)
pobi,jason

pobi의 λ°°νŒ… κΈˆμ•‘μ€?
10000

jason의 λ°°νŒ… κΈˆμ•‘μ€?
20000

λ”œλŸ¬μ™€ pobi, jasonμ—κ²Œ 2μž₯을 λ‚˜λˆ„μ—ˆμŠ΅λ‹ˆλ‹€.
λ”œλŸ¬μΉ΄λ“œ: 3닀이아λͺ¬λ“œ
λ”œλŸ¬: 3닀이아λͺ¬λ“œ
pobiμΉ΄λ“œ: 2ν•˜νŠΈ, 8μŠ€νŽ˜μ΄λ“œ
jasonμΉ΄λ“œ: 7ν΄λ‘œλ²„, KμŠ€νŽ˜μ΄λ“œ

Expand All @@ -91,66 +62,67 @@ y
pobiμΉ΄λ“œ: 2ν•˜νŠΈ, 8μŠ€νŽ˜μ΄λ“œ, Aν΄λ‘œλ²„
pobiλŠ” ν•œμž₯의 μΉ΄λ“œλ₯Ό 더 λ°›κ² μŠ΅λ‹ˆκΉŒ?(μ˜ˆλŠ” y, μ•„λ‹ˆμ˜€λŠ” n)
n
jasonλŠ” ν•œμž₯의 μΉ΄λ“œλ₯Ό 더 λ°›κ² μŠ΅λ‹ˆκΉŒ?(μ˜ˆλŠ” y, μ•„λ‹ˆμ˜€λŠ” n)
pobiμΉ΄λ“œ: 2ν•˜νŠΈ, 8μŠ€νŽ˜μ΄λ“œ, Aν΄λ‘œλ²„
jason은 ν•œμž₯의 μΉ΄λ“œλ₯Ό 더 λ°›κ² μŠ΅λ‹ˆκΉŒ?(μ˜ˆλŠ” y, μ•„λ‹ˆμ˜€λŠ” n)
n
jasonμΉ΄λ“œ: 7ν΄λ‘œλ²„, KμŠ€νŽ˜μ΄λ“œ

λ”œλŸ¬λŠ” 16μ΄ν•˜λΌ ν•œμž₯의 μΉ΄λ“œλ₯Ό 더 λ°›μ•˜μŠ΅λ‹ˆλ‹€.

λ”œλŸ¬μΉ΄λ“œ: 3닀이아λͺ¬λ“œ, 9ν΄λ‘œλ²„, 8닀이아λͺ¬λ“œ - κ²°κ³Ό: 20
λ”œλŸ¬ μΉ΄λ“œ: 3닀이아λͺ¬λ“œ, 9ν΄λ‘œλ²„, 8닀이아λͺ¬λ“œ - κ²°κ³Ό: 20
pobiμΉ΄λ“œ: 2ν•˜νŠΈ, 8μŠ€νŽ˜μ΄λ“œ, Aν΄λ‘œλ²„ - κ²°κ³Ό: 21
jasonμΉ΄λ“œ: 7ν΄λ‘œλ²„, KμŠ€νŽ˜μ΄λ“œ - κ²°κ³Ό: 17

## μ΅œμ’… 승패
λ”œλŸ¬: 1승 1패
pobi: 승
jason: 패
## μ΅œμ’… 수읡
λ”œλŸ¬: 10000
pobi: 10000
jason: -20000
```

## ν”„λ‘œκ·Έλž˜λ° μš”κ΅¬ 사항

---
- μžλ°” μ½”λ“œ μ»¨λ²€μ…˜μ„ μ§€ν‚€λ©΄μ„œ ν”„λ‘œκ·Έλž˜λ°ν•œλ‹€.
- 기본적으둜 Java Style Guide을 μ›μΉ™μœΌλ‘œ ν•œλ‹€.
- indent(인덴트, λ“€μ—¬μ“°κΈ°) depthλ₯Ό 2λ₯Ό λ„˜μ§€ μ•Šλ„λ‘ κ΅¬ν˜„ν•œλ‹€. 1κΉŒμ§€λ§Œ ν—ˆμš©ν•œλ‹€. 예λ₯Ό λ“€μ–΄ whileλ¬Έ μ•ˆμ— if문이 있으면 λ“€μ—¬μ“°κΈ°λŠ” 2이닀.
힌트: indent(인덴트, λ“€μ—¬μ“°κΈ°) depthλ₯Ό μ€„μ΄λŠ” 쒋은 방법은 ν•¨μˆ˜(λ˜λŠ” λ©”μ„œλ“œ)λ₯Ό λΆ„λ¦¬ν•˜λ©΄ λœλ‹€.
- 기본적으둜 Java Style Guide을 μ›μΉ™μœΌλ‘œ ν•œλ‹€.
- indent(인덴트, λ“€μ—¬μ“°κΈ°) depthλ₯Ό 2λ₯Ό λ„˜μ§€ μ•Šλ„λ‘ κ΅¬ν˜„ν•œλ‹€. 1κΉŒμ§€λ§Œ ν—ˆμš©ν•œλ‹€.
- 예λ₯Ό λ“€μ–΄ whileλ¬Έ μ•ˆμ— if문이 있으면 λ“€μ—¬μ“°κΈ°λŠ” 2이닀.
- 힌트: indent(인덴트, λ“€μ—¬μ“°κΈ°) depthλ₯Ό μ€„μ΄λŠ” 쒋은 방법은 ν•¨μˆ˜(λ˜λŠ” λ©”μ„œλ“œ)λ₯Ό λΆ„λ¦¬ν•˜λ©΄ λœλ‹€.
- 3ν•­ μ—°μ‚°μžλ₯Ό μ“°μ§€ μ•ŠλŠ”λ‹€.
- else μ˜ˆμ•½μ–΄λ₯Ό μ“°μ§€ μ•ŠλŠ”λ‹€. else μ˜ˆμ•½μ–΄λ₯Ό μ“°μ§€ 말라고 ν•˜λ‹ˆ switch/case둜 κ΅¬ν˜„ν•˜λŠ” κ²½μš°κ°€ μžˆλŠ”λ° switch/case도 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
힌트: ifλ¬Έμ—μ„œ 값을 λ°˜ν™˜ν•˜λŠ” λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ν•˜λ©΄ else μ˜ˆμ•½μ–΄λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.
- else μ˜ˆμ•½μ–΄λ₯Ό μ“°μ§€ μ•ŠλŠ”λ‹€.
- else μ˜ˆμ•½μ–΄λ₯Ό μ“°μ§€ 말라고 ν•˜λ‹ˆ switch/case둜 κ΅¬ν˜„ν•˜λŠ” κ²½μš°κ°€ μžˆλŠ”λ° switch/case도 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
- 힌트: ifλ¬Έμ—μ„œ 값을 λ°˜ν™˜ν•˜λŠ” λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ν•˜λ©΄ else μ˜ˆμ•½μ–΄λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.
- λͺ¨λ“  κΈ°λŠ₯을 TDD둜 κ΅¬ν˜„ν•΄ λ‹¨μœ„ ν…ŒμŠ€νŠΈκ°€ μ‘΄μž¬ν•΄μ•Ό ν•œλ‹€. 단, UI(System.out, System.in) λ‘œμ§μ€ μ œμ™Έ
- 핡심 λ‘œμ§μ„ κ΅¬ν˜„ν•˜λŠ” μ½”λ“œμ™€ UIλ₯Ό λ‹΄λ‹Ήν•˜λŠ” λ‘œμ§μ„ κ΅¬λΆ„ν•œλ‹€.
- UI λ‘œμ§μ„ InputView, ResultView와 같은 클래슀λ₯Ό μΆ”κ°€ν•΄ λΆ„λ¦¬ν•œλ‹€.
- 핡심 λ‘œμ§μ„ κ΅¬ν˜„ν•˜λŠ” μ½”λ“œμ™€ UIλ₯Ό λ‹΄λ‹Ήν•˜λŠ” λ‘œμ§μ„ κ΅¬λΆ„ν•œλ‹€.
- UI λ‘œμ§μ„ InputView, ResultView와 같은 클래슀λ₯Ό μΆ”κ°€ν•΄ λΆ„λ¦¬ν•œλ‹€.
- ν•¨μˆ˜(λ˜λŠ” λ©”μ„œλ“œ)의 길이가 10라인을 λ„˜μ–΄κ°€μ§€ μ•Šλ„λ‘ κ΅¬ν˜„ν•œλ‹€.
- ν•¨μˆ˜(λ˜λŠ” λ©”μ†Œλ“œ)κ°€ ν•œ κ°€μ§€ 일만 ν•˜λ„λ‘ μ΅œλŒ€ν•œ μž‘κ²Œ λ§Œλ“€μ–΄λΌ.
- ν•¨μˆ˜(λ˜λŠ” λ©”μ†Œλ“œ)κ°€ ν•œ κ°€μ§€ 일만 ν•˜λ„λ‘ μ΅œλŒ€ν•œ μž‘κ²Œ λ§Œλ“€μ–΄λΌ.
- λ°°μ—΄ λŒ€μ‹  μ»¬λ ‰μ…˜μ„ μ‚¬μš©ν•œλ‹€.
- λͺ¨λ“  μ›μ‹œ κ°’κ³Ό λ¬Έμžμ—΄μ„ 포μž₯ν•œλ‹€.
- 쀄여 μ“°μ§€ μ•ŠλŠ”λ‹€(μΆ•μ•½ κΈˆμ§€).
- 일급 μ»¬λ ‰μ…˜μ„ μ“΄λ‹€.

## μΆ”κ°€λœ μš”κ΅¬ 사항

---
- λͺ¨λ“  μ—”ν‹°ν‹°λ₯Ό μž‘κ²Œ μœ μ§€ν•œλ‹€.
- 3개 μ΄μƒμ˜ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό κ°€μ§„ 클래슀λ₯Ό μ“°μ§€ μ•ŠλŠ”λ‹€.
- λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄μ—μ„œ λ°œμƒν•˜λŠ” 쀑볡 μ½”λ“œλ₯Ό μ œκ±°ν•΄μ•Ό ν•œλ‹€.

## λ―Έμ…˜ 쀑 ν•  일

---
ν† λ‘  ν™œλ™μ—μ„œ μ •ν•œ κ·œμΉ™μ„ μ˜μ‹ν•˜λ©° μ½”λ“œ μž‘μ„±
κ·œμΉ™ λ•Œλ¬Έμ— μ½”λ“œλ₯Ό λ³€κ²½ν•œ κ³³ 기둝
λ§‰νžˆλŠ” μˆœκ°„ 기둝
## λ―Έμ…˜ 쀑 기둝

---
ν•„μˆ˜ 기둝:
[ ] κ·œμΉ™μ„ μ μš©ν•΄μ„œ λ³€κ²½ν•œ μ½”λ“œ 1κ³³ 이상
[ ] ν…ŒμŠ€νŠΈ μž‘μ„±μ΄ μ–΄λ €μ› λ˜ μ½”λ“œ 1κ³³ 이상
[ ] λ§‰νžŒ μˆœκ°„ 1회 이상
- [x] κΈ°λŠ₯ μΆ”κ°€λ‘œ 인해 μˆ˜μ •ν•œ μœ„μΉ˜ 개수
```markdown
- μ•½ 5κ³³ (State 클래슀ꡰ, Members, Player, GameTable, BlackjackService)
- μƒνƒœ νŒ¨ν„΄ λ„μž… ν›„, μƒˆλ‘œμš΄ κ·œμΉ™(수읡λ₯ ) μΆ”κ°€ μ‹œ κΈ°μ‘΄ 클래슀λ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³ 
μƒˆλ‘œμš΄ State κ΅¬ν˜„μ²΄λ§Œ λ§Œμ§€λ©΄ λ˜μ–΄ μˆ˜μ • λ²”μœ„κ°€ μ œν•œλ¨.
```
- [ ] 사이클1 λ•Œλ³΄λ‹€ μˆ˜μ • λ²”μœ„κ°€ μ€„μ—ˆλŠ”κ°€/λŠ˜μ—ˆλŠ”κ°€
```markdown

## λ―Έμ…˜ μ™„λ£Œ 쑰건
```
- [ ] κ·œμΉ™ 적용으둜 λ³€κ²½ν•œ μ½”λ“œ 1κ³³
```markdown

---
[ ] μš”κ΅¬μ‚¬ν•­ κ΅¬ν˜„
[ ] κ·œμΉ™μ— μ˜ν•œ μ½”λ“œ λ³€κ²½ 1회 이상
[ ] λ―Έμ…˜ 쀑 기둝 μž‘μ„±
```
- [ ] ν…ŒμŠ€νŠΈκ°€ 섀계λ₯Ό λ„μš΄ μˆœκ°„ 1회
```markdown

```
5 changes: 2 additions & 3 deletions src/main/java/Main.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import application.BlackjackService;
import presentation.BlackjackController;
import presentation.ui.BlackjackView;
import presentation.ui.InputView;
import presentation.ui.OutputView;

Expand All @@ -8,8 +8,7 @@ public static void main(String[] args) {
InputView inputView = new InputView();
OutputView outputView = new OutputView();

BlackjackService blackjackService = new BlackjackService();
BlackjackController blackjackController = new BlackjackController(blackjackService, inputView, outputView);
BlackjackController blackjackController = new BlackjackController(new BlackjackView(inputView, outputView));

blackjackController.executeGame();
}
Expand Down
43 changes: 30 additions & 13 deletions src/main/java/application/BlackjackService.java
Original file line number Diff line number Diff line change
@@ -1,42 +1,59 @@
package application;
Copy link

@jamie9504 jamie9504 Mar 15, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μš°μ„  이번 사이클도 제좜이 μ’€ λŠ¦μ–΄μ§„ 점 μ‚¬κ³Όμ˜ 말씀 λ“œλ¦½λ‹ˆλ‹€.

λ―Έμ…˜ μš”κ΅¬μ‚¬ν•­μ— 제좜 κΈ°ν•œμ΄ λͺ…μ‹œλ˜μ–΄μžˆμ§€ μ•Šμ•˜λ‹€λ©΄, μ‚¬κ³Όν•˜μ§€ μ•ŠμœΌμ…”λ„ λ©λ‹ˆλ‹€.
μ €λŠ” μ‹ κ²½μ“°μ§€ μ•ŠλŠ” νŽΈμ΄μ§€λ§Œ, λ‹€λ₯Έ 리뷰어λ₯Ό λ§Œλ‚¬μ„ λ•ŒλŠ” μƒν˜Έκ°„μ˜ 일정을 μœ„ν•΄ 였래 걸릴 것 κ°™μœΌλ©΄ DM을 λ‚¨κ²¨λ‘λŠ” 방법도 μžˆμ„ 것 κ°™μ•„μš”.

λ¦¬λ·°μ–΄λ‹˜

제이미둜 μΆ©λΆ„ν•©λ‹ˆλ‹€.


  1. μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ 3개 μ œν•œκ³Ό 상속 κ΅¬μ‘°μ—μ„œμ˜ 카운트 κΈ°μ€€

    이번 λ―Έμ…˜μ—μ„œ '3개 μ΄μƒμ˜ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό κ°€μ§„ 클래슀λ₯Ό μ“°μ§€ μ•ŠλŠ”λ‹€'λŠ” κ·œμΉ™μ„ μ§€ν‚€κΈ° μœ„ν•΄ λ…Έλ ₯ν–ˆμŠ΅λ‹ˆλ‹€. 그런데 상속 ꡬ쑰(예: Member > Player)λ₯Ό μ‚¬μš©ν•˜λ‹€ λ³΄λ‹ˆ, λΆ€λͺ¨ 클래슀의 ν•„λ“œμ™€ μžμ‹ 클래슀의 ν•„λ“œλ₯Ό 합쳀을 λ•Œ 이 기쀀을 μ–΄λ–»κ²Œ μ μš©ν•΄μ•Ό ν• μ§€ 고민이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

    λ¦¬λ·°μ–΄λ‹˜μ€ 상속 κ΄€κ³„μ—μ„œ λΆ€λͺ¨μ™€ μžμ‹μ˜ ν•„λ“œ 합계λ₯Ό ν•˜λ‚˜μ˜ 객체 크기둜 λ³΄μ‹œλŠ”μ§€, μ•„λ‹ˆλ©΄ 각 클래슀 λ‹¨μœ„λ‘œ λ³΄μ‹œλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

    λ˜ν•œ, ν•„λ“œ 개수λ₯Ό 쀄이기 μœ„ν•΄ 상속을 μ„ νƒν•˜λŠ” 것이 객체지ν–₯적으둜 μ˜³μ€ λ°©ν–₯인지에 λŒ€ν•œ μ˜κ²¬λ„ λ“£κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

    • μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λž€, 일반적으둜 객체 ν•˜λ‚˜κ°€ λŸ°νƒ€μž„μ— μ‹€μ œλ‘œ λ³΄μœ ν•˜λŠ” ν•„λ“œμ˜ μ΄ν•©μœΌλ‘œ λ΄…λ‹ˆλ‹€. ν΄λž˜μŠ€μ— μ–΄λ–»κ²Œ μ„ μ–Έλ˜μ–΄ μžˆλŠ”μ§€λŠ” 크게 μ€‘μš”ν•˜μ§€ μ•Šμ•„μš”. 상속을 ν–ˆλ”λΌλ„, λŸ°νƒ€μž„μ— ν•΄λ‹Ή 객체가 μ‹€μ œλ‘œ κ°€μ§€κ³  μžˆλŠ” λ³€μˆ˜λŠ” 3κ°œκ°€ 되겠죠?
    • ν•„λ“œ 수λ₯Ό 쀄이기 μœ„ν•΄ 상속을 μ„ νƒν•˜λŠ” 것은 μ’‹μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 상속은 "is-a"κ°€ λͺ…ν™•ν•  λ•Œ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ¬Όλ‘  μ§€κΈˆμ€ Playerκ°€ Member인 κ΄€κ³„λŠ” μžμ—°μŠ€λŸ½μ§€λ§Œ, ν•„λ“œμˆ˜ μ œν•œμ„ ν”Όν•˜λ €λŠ” λͺ©μ μœΌλ‘œ 상속을 μ‚¬μš©ν•œλ‹€λ©΄ 섀계 μžμ²΄κ°€ μ™œκ³‘λ  수 μžˆμ–΄μš”.
  2. λ””λ―Έν„° 법칙(Law of Demeter)κ³Ό μ„œλΉ„μŠ€ κ³„μΈ΅μ˜ μ±…μž„ λ²”μœ„

    ν˜„μž¬ ꡬ쑰가 Service > GameTable > Members > Member 순으둜 λ ˆμ΄μ–΄κ°€ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. ν•˜μœ„ 도메인이 데이터λ₯Ό λŒ€μ‹  전달해 μ£ΌλŠ” 방식을 νƒν•˜λ‹€ λ³΄λ‹ˆ μƒμœ„ 객체에 get ν˜•μ‹μ˜ μœ„μž„ λ©”μ„œλ“œκ°€ λ„ˆλ¬΄ λ§Žμ•„μ§€λŠ” ν˜„μƒμ΄ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

    Serviceμ—μ„œ 직접 Member 객체λ₯Ό 가져와 μ œμ–΄ν•˜λŠ” 것이 계측 κ°„ 결합도λ₯Ό λ†’μ΄λŠ” ν–‰μœ„μΌκΉŒμš”?

    μ•„λ‹ˆλ©΄ ν˜„μž¬μ²˜λŸΌ μƒμœ„ 도메인이 ν•˜μœ„ λ„λ©”μΈμ˜ κΈ°λŠ₯을 λŒ€μ‹  호좜(Wrapping)ν•΄ μ£Όλ©° μΊ‘μŠν™”λ₯Ό μœ μ§€ν•˜λŠ” 것이 더 λ‚˜μ€ μ„€κ³„μΌκΉŒμš”? 'Tell, Don't Ask' 원칙을 μ§€ν‚€λ©΄μ„œλ„ 연쇄 Getterλ₯Ό 막을 수 μžˆλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€. ν˜Ήμ€ μ–΄λ–€ 것이 더 결합도λ₯Ό λ†’μ΄λŠ” ν–‰μœ„μΈμ§€ κΆκΈˆν•©λ‹ˆλ‹€.

    • ν˜„μž¬ ꡬ쑰인 μƒμœ„ 도메인이 ν•˜μœ„ λ„λ©”μΈμ˜ κΈ°λŠ₯을 Wrappingν•˜λŠ” 방식이 더 λ‚«μŠ΅λ‹ˆλ‹€. 단, μœ„μž„ λ©”μ„œλ“œκ°€ κ³Όλ„ν•˜κ²Œ λŠ˜μ–΄λ‚œλ‹€λ©΄ 쀑간 계측 μžμ²΄κ°€ λΆˆν•„μš”ν•˜λ‹€λŠ” μ‹ ν˜ΈμΌ 수 μžˆμ–΄μš”.
    • Service β†’ GameTable β†’ Members 3단계보닀 Service β†’ Members 2λ‹¨κ³„λ‘œ μ€„μ΄λŠ” 것도 κ³ λ €ν•΄λ³΄μ„Έμš”. GameTable이 μ‹€μ§ˆμ μœΌλ‘œ Membersλ₯Ό μ–‡κ²Œ κ°μ‹ΈλŠ” μ—­ν• λ§Œ ν•œλ‹€λ©΄ 제거 λŒ€μƒμ΄ 될 수 μžˆμ–΄μš”.
  3. ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ μœ μ—°μ„±κ³Ό ν™•μž₯μ„± (OCP)

    κΈ°λŠ₯이 μΆ”κ°€λ˜λ”λΌλ„ κΈ°μ‘΄ ν…ŒμŠ€νŠΈκ°€ 잘 κΉ¨μ§€μ§€ μ•ŠλŠ” 변경에 μœ μ—°ν•œ ꡬ쑰λ₯Ό λ§Œλ“€κ³ μž λ…Έλ ₯ν–ˆμŠ΅λ‹ˆλ‹€. μƒνƒœ νŒ¨ν„΄μ„ λ„μž…ν•˜λ©΄μ„œ μƒˆλ‘œμš΄ μƒνƒœ(예: μƒˆλ‘œμš΄ κ·œμΉ™μ˜ μΆ”κ°€)κ°€ 생겨도 기쑴의 State ν…ŒμŠ€νŠΈλ‚˜ κ΅¬ν˜„ 둜직이 μˆ˜μ •λ˜μ§€ μ•Šκ³  ν™•μž₯될 수 μžˆλ„λ‘ μ„€κ³„ν•˜κ³ μž ν–ˆμŠ΅λ‹ˆλ‹€. 이 뢀뢄이 μ˜λ„λŒ€λ‘œ 잘 μ½νžˆλŠ”μ§€ μ˜κ²¬μ„ λ“£κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

    • μƒνƒœ νŒ¨ν„΄ λ„μž…μœΌλ‘œ μƒˆλ‘œμš΄ μƒνƒœ μΆ”κ°€ μ‹œ κΈ°μ‘΄ ν…ŒμŠ€νŠΈκ°€ κΉ¨μ§€μ§€ μ•ŠλŠ” κ΅¬μ‘°λŠ” 잘 μž‘ν˜€ μžˆμ–΄μš”. λ‹€λ§Œ instanceof μ‚¬μš©μ΄ λ‚¨μ•„μžˆλŠ” ν•œ μ™„μ „ν•œ OCP라고 보기 μ–΄λ ΅μŠ΅λ‹ˆλ‹€. instanceof 제거 후에야 μ§„μ •ν•œ ν™•μž₯에 μ—΄λ¦° ꡬ쑰가 λ©λ‹ˆλ‹€.
  4. λΆˆλ³€ 객체(Immutable Object)와 μ—”ν‹°ν‹°μ˜ ν•„λ“œ λ³€κ²½

    Handλ₯Ό λΆˆλ³€ 객체둜 λ¦¬νŒ©ν† λ§ν•˜λ©΄μ„œ 객체의 μ•ˆμ •μ„±μ€ λ†’μ•„μ‘ŒμœΌλ‚˜, 이λ₯Ό λ³΄μœ ν•œ μƒμœ„ 도메인인 Member의 hand ν•„λ“œμ— final을 μ‚¬μš©ν•  수 μ—†λŠ” λ¬Έμ œκ°€ μƒκ²ΌμŠ΅λ‹ˆλ‹€. λ§Œμ•½ MemberκΉŒμ§€ λΆˆλ³€μœΌλ‘œ λ§Œλ“€λ©΄ 이λ₯Ό κ΄€λ¦¬ν•˜λŠ” Members λ¦¬μŠ€νŠΈκΉŒμ§€ 맀번 μƒˆλ‘œ 생성해야 ν•˜λŠ” λΆˆλ³€μ˜ 연쇄 ν˜„μƒμ΄ λ°œμƒν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

    λΆˆλ³€μ™€ κ°€λ³€μ˜ κ²½κ³„μ—μ„œ, λͺ¨λ“  μƒμœ„ 도메인을 λΆˆλ³€μœΌλ‘œ κ°€μ Έκ°€λŠ” 것이 MVC ν˜Ήμ€ 일반적인 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ΅¬μ‘°μ—μ„œ ν˜„μ‹€μ μΈ λŒ€μ•ˆμΌκΉŒμš”?

    ν•„λ“œμ— final을 μ“°μ§€ λͺ»ν•˜λ”라도 λ‚΄λΆ€ μƒνƒœλ§Œ λΆˆλ³€μœΌλ‘œ μœ μ§€ν•˜λŠ” μ„ μ—μ„œ νƒ€ν˜‘ν•˜λŠ” 것이 μΌλ°˜μ μΈμ§€ λ¦¬λ·°μ–΄λ‹˜μ˜ 쑰언을 λ“£κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

    • λͺ¨λ“  계측을 λΆˆλ³€μœΌλ‘œ λ§Œλ“ λ‹€λ©΄, λͺ¨λ“  계측을 λΆˆλ³€μœΌλ‘œ λ§Œλ“ λ‹€λ©΄ 객체 μž¬μƒμ„± λΉ„μš©κ³Ό μ½”λ“œ λ³΅μž‘λ„κ°€ 컀지겠죠?
      뭐든지 μ–΄λ–€ 것을 μ„ νƒν•˜λ˜ νŠΈλ ˆμ΄λ“œμ˜€ν”„μž…λ‹ˆλ‹€. μž₯/단점을 λΉ„κ΅ν–ˆμ„ λ•Œ μž₯점이 더 큰 κ²½μš°μ—λ§Œ μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.
    • Member의 state ν•„λ“œμ— final을 λͺ» μ“°λŠ” 것은 ν˜„μž¬ 섀계상 μžμ—°μŠ€λŸ¬μš΄ νŠΈλ ˆμ΄λ“œμ˜€ν”„μž…λ‹ˆλ‹€. 이 경우 setterλ₯Ό λ…ΈμΆœν•˜μ§€ μ•Šκ³  receiveCard()처럼 μ˜λ―ΈμžˆλŠ” λ©”μ„œλ“œλ‘œλ§Œ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” 것이 쒋은 νƒ€ν˜‘μ μ΄μ—μš”.

Copy link
Author

@JYL35 JYL35 Mar 16, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

λ―Έμ…˜ μš”κ΅¬μ‚¬ν•­μ— 제좜 κΈ°ν•œμ΄ λͺ…μ‹œλ˜μ–΄μžˆμ§€ μ•Šμ•˜λ‹€λ©΄, μ‚¬κ³Όν•˜μ§€ μ•ŠμœΌμ…”λ„ λ©λ‹ˆλ‹€.
μ €λŠ” μ‹ κ²½μ“°μ§€ μ•ŠλŠ” νŽΈμ΄μ§€λ§Œ, λ‹€λ₯Έ 리뷰어λ₯Ό λ§Œλ‚¬μ„ λ•ŒλŠ” μƒν˜Έκ°„μ˜ 일정을 μœ„ν•΄ 였래 걸릴 것 κ°™μœΌλ©΄ DM을 λ‚¨κ²¨λ‘λŠ” 방법도 μžˆμ„ 것 κ°™μ•„μš”.

사싀 μ›”μš”μΌκΉŒμ§€ Mergeκ°€ λ˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•˜λŠ” 것 μ™Έμ—λŠ” 일정이 λ”°λ‘œ λͺ…μ‹œλ˜μ–΄μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 주말에 νœ΄μ‹ ν•˜μ‹œλŠ” 것을 κ³ λ €ν–ˆμ„ λ•Œ 평일에 리뷰 μš”μ²­ λ“œλ¦¬λŠ”κ²Œ λ‚«λ‹€κ³  νŒλ‹¨ν•˜μ—¬ μ €λ ‡κ²Œ 말씀 λ“œλ ΈμŠ΅λ‹ˆλ‹€. μ‘°μ–Έ κ°μ‚¬ν•©λ‹ˆλ‹€!

μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λž€, 일반적으둜 객체 ν•˜λ‚˜κ°€ λŸ°νƒ€μž„μ— μ‹€μ œλ‘œ λ³΄μœ ν•˜λŠ” ν•„λ“œμ˜ μ΄ν•©μœΌλ‘œ λ΄…λ‹ˆλ‹€. ν΄λž˜μŠ€μ— μ–΄λ–»κ²Œ μ„ μ–Έλ˜μ–΄ μžˆλŠ”μ§€λŠ” 크게 μ€‘μš”ν•˜μ§€ μ•Šμ•„μš”. 상속을 ν–ˆλ”λΌλ„, λŸ°νƒ€μž„μ— ν•΄λ‹Ή 객체가 μ‹€μ œλ‘œ κ°€μ§€κ³  μžˆλŠ” λ³€μˆ˜λŠ” 3κ°œκ°€ 되겠죠?
ν•„λ“œ 수λ₯Ό 쀄이기 μœ„ν•΄ 상속을 μ„ νƒν•˜λŠ” 것은 μ’‹μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 상속은 "is-a"κ°€ λͺ…ν™•ν•  λ•Œ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ¬Όλ‘  μ§€κΈˆμ€ Playerκ°€ Member인 κ΄€κ³„λŠ” μžμ—°μŠ€λŸ½μ§€λ§Œ, ν•„λ“œμˆ˜ μ œν•œμ„ ν”Όν•˜λ €λŠ” λͺ©μ μœΌλ‘œ 상속을 μ‚¬μš©ν•œλ‹€λ©΄ 섀계 μžμ²΄κ°€ μ™œκ³‘λ  수 μžˆμ–΄μš”.

상속 κ΅¬μ‘°μ—μ„œ λ°œμƒν•˜λŠ” ν•„λ“œ μΉ΄μš΄νŠΈμ™€ 'is-a' 관계에 λŒ€ν•œ 제이미의 쑰언을 λ°”νƒ•μœΌλ‘œ 상속을 μ œκ±°ν•˜κ³  μ‘°ν•©μœΌλ‘œ μ „ν™˜ν•˜κ² μŠ΅λ‹ˆλ‹€.
곡톡 둜직인 이름과 μƒνƒœ 관리λ₯Ό MemberInfoλΌλŠ” 일반 클래슀둜 λΆ„λ¦¬ν•˜κ³ , Dealer와 Playerκ°€ 이λ₯Ό μ†Œμœ ν•˜λ„λ‘ μ„€κ³„ν•˜κ² μŠ΅λ‹ˆλ‹€.

ν˜„μž¬ ꡬ쑰인 μƒμœ„ 도메인이 ν•˜μœ„ λ„λ©”μΈμ˜ κΈ°λŠ₯을 Wrappingν•˜λŠ” 방식이 더 λ‚«μŠ΅λ‹ˆλ‹€. 단, μœ„μž„ λ©”μ„œλ“œκ°€ κ³Όλ„ν•˜κ²Œ λŠ˜μ–΄λ‚œλ‹€λ©΄ 쀑간 계측 μžμ²΄κ°€ λΆˆν•„μš”ν•˜λ‹€λŠ” μ‹ ν˜ΈμΌ 수 μžˆμ–΄μš”.
Service β†’ GameTable β†’ Members 3단계보닀 Service β†’ Members 2λ‹¨κ³„λ‘œ μ€„μ΄λŠ” 것도 κ³ λ €ν•΄λ³΄μ„Έμš”. GameTable이 μ‹€μ§ˆμ μœΌλ‘œ Membersλ₯Ό μ–‡κ²Œ κ°μ‹ΈλŠ” μ—­ν• λ§Œ ν•œλ‹€λ©΄ 제거 λŒ€μƒμ΄ 될 수 μžˆμ–΄μš”.

GameTable을 μ œκ±°ν•˜λŠ” 것도 κ³ λ €ν•΄μ„œ λ¦¬νŒ©ν† λ§ μ§„ν–‰ν•˜κ² μŠ΅λ‹ˆλ‹€!

μƒνƒœ νŒ¨ν„΄ λ„μž…μœΌλ‘œ μƒˆλ‘œμš΄ μƒνƒœ μΆ”κ°€ μ‹œ κΈ°μ‘΄ ν…ŒμŠ€νŠΈκ°€ κΉ¨μ§€μ§€ μ•ŠλŠ” κ΅¬μ‘°λŠ” 잘 μž‘ν˜€ μžˆμ–΄μš”. λ‹€λ§Œ instanceof μ‚¬μš©μ΄ λ‚¨μ•„μžˆλŠ” ν•œ μ™„μ „ν•œ OCP라고 보기 μ–΄λ ΅μŠ΅λ‹ˆλ‹€. instanceof 제거 후에야 μ§„μ •ν•œ ν™•μž₯에 μ—΄λ¦° ꡬ쑰가 λ©λ‹ˆλ‹€.

μƒνƒœ νŒ¨ν„΄μ„ λ„μž…ν•˜λ©° 뢄기문을 많이 μ œκ±°ν–ˆμŒμ—λ„, Stay와 Blackjack μƒνƒœμ—μ„œ 수읡λ₯ μ„ κ²°μ •ν•  λ•Œ μ—¬μ „νžˆ μƒλŒ€λ°©μ˜ νƒ€μž…μ„ ν™•μΈν•˜λŠ” instanceofκ°€ λ‚¨μ•„μžˆμ–΄ μ™„μ „ν•œ OCPλ₯Ό λ‹¬μ„±ν•˜μ§€ λͺ»ν–ˆλ‹€λŠ” 점을 μ΄ν•΄ν–ˆμŠ΅λ‹ˆλ‹€.

이 뢀뢄을 ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μƒνƒœλΌλ¦¬ λ©”μ‹œμ§€λ₯Ό μ£Όκ³ λ°›μœΌλ©° 승패λ₯Ό κ²°μ •ν•˜κ²Œ ν•˜κ±°λ‚˜, μƒνƒœ νŒ¨ν„΄μ— isBust(), isBlackjack()λ₯Ό μΆ”κ°€ν•˜μ—¬ νƒ€μž…μ„ 직접 묻지 μ•ŠλŠ” λ°©μ‹μœΌλ‘œ λ¦¬νŒ©ν„°λ§ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. μΆ”ν›„ ν™•μž₯μ„±κΉŒμ§€ κ³ λ €ν•œ μ™„μ „ν•œ OCP ꡬ쑰에 λŒ€ν•΄ 더 κ³ λ―Όν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€!

λͺ¨λ“  계측을 λΆˆλ³€μœΌλ‘œ λ§Œλ“ λ‹€λ©΄, λͺ¨λ“  계측을 λΆˆλ³€μœΌλ‘œ λ§Œλ“ λ‹€λ©΄ 객체 μž¬μƒμ„± λΉ„μš©κ³Ό μ½”λ“œ λ³΅μž‘λ„κ°€ 컀지겠죠?
뭐든지 μ–΄λ–€ 것을 μ„ νƒν•˜λ˜ νŠΈλ ˆμ΄λ“œμ˜€ν”„μž…λ‹ˆλ‹€. μž₯/단점을 λΉ„κ΅ν–ˆμ„ λ•Œ μž₯점이 더 큰 κ²½μš°μ—λ§Œ μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.
Member의 state ν•„λ“œμ— final을 λͺ» μ“°λŠ” 것은 ν˜„μž¬ 섀계상 μžμ—°μŠ€λŸ¬μš΄ νŠΈλ ˆμ΄λ“œμ˜€ν”„μž…λ‹ˆλ‹€. 이 경우 setterλ₯Ό λ…ΈμΆœν•˜μ§€ μ•Šκ³  receiveCard()처럼 μ˜λ―ΈμžˆλŠ” λ©”μ„œλ“œλ‘œλ§Œ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” 것이 쒋은 νƒ€ν˜‘μ μ΄μ—μš”.

μ•žμœΌλ‘œλŠ” μž₯/단점을 λΉ„κ΅ν•˜μ—¬ 계측에 맞게 λ„μž…ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ§„ν–‰ν•˜κ² μŠ΅λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€!


import domain.Card;
import domain.card.Card;
import domain.GameTable;
import application.dto.RoundResult;
import domain.StandardDeck;
import domain.dto.GameResult;
import domain.dto.MemberStatus;
import domain.member.Money;
import dto.RoundResult;
import domain.card.StandardDeck;
import dto.GameResult;
import dto.MemberStatus;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class BlackjackService {

private GameTable gameTable;
private final GameTable gameTable;

public BlackjackService() {
public BlackjackService(Map<String, Integer> playerBetAmounts) {
Map<String, Money> playerBets = new HashMap<>();
for (String name : playerBetAmounts.keySet()) {
Money betMoney = new Money(playerBetAmounts.get(name));
playerBets.put(name, betMoney);
}
this.gameTable = new GameTable(playerBets, new StandardDeck());
gameTable.distributeInitCard();
}

public void initializeGame(List<String> playerNames) {
this.gameTable = new GameTable(playerNames, new StandardDeck());
gameTable.distributeInitCard();
public boolean isFinishedByName(String playerName) {
return gameTable.isPlayerFinished(playerName);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

getGameTable()λ₯Ό μ“°λŠ” κ²½μš°μ™€ gameTableλ₯Ό μ“°λŠ” κ²½μš°κ°€ ν˜Όμž¬λ˜μ–΄ μžˆλ„€μš”.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

λ†“μΉœ 뢀뢄인 것 κ°™μŠ΅λ‹ˆλ‹€..! κ°μ‚¬ν•©λ‹ˆλ‹€!

}

public RoundResult startOneRound(String memberName) {
List<Card> playerCards = gameTable.drawForMember(memberName);

boolean isBust = gameTable.checkBust(memberName);
boolean isBust = gameTable.isPlayerBust(memberName);

return new RoundResult(playerCards, isBust);
}

public void endPlayerRound(String playerName) {
gameTable.changePlayerState(playerName);
}

public boolean checkDealerDrawable() {
return gameTable.drawForDealer();
}

public List<MemberStatus> getMemberStatuses() {
return gameTable.checkMemberStatuses();
return gameTable.getMemberStatuses();
}

public List<GameResult> getGameResults() {
return gameTable.checkGameResult();
Map<String, Integer> profits = gameTable.getFinalProfits();
return profits.entrySet().stream()
.map(entry -> new GameResult(entry.getKey(), entry.getValue()))
.toList();
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package domain.exception;
package constant.exception;

public class DuplicatedException extends RuntimeException {
public DuplicatedException() {
Expand Down
35 changes: 0 additions & 35 deletions src/main/java/domain/Card.java

This file was deleted.

23 changes: 0 additions & 23 deletions src/main/java/domain/Dealer.java

This file was deleted.

Loading