Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
4a53628
pre-study: 합계가 21 μ΄ˆκ³ΌμΈμ§€ νŒλ‹¨
Mar 1, 2026
045dc35
init: μ΄ˆκΈ°ν™”
Mar 4, 2026
9018e64
test(parser): μž…λ ₯ 검증 ν…ŒμŠ€νŠΈ μž‘μ„±
Mar 4, 2026
177d7f2
feat(parser): μž…λ ₯ νŒŒμ‹± κΈ°λŠ₯ μΆ”κ°€
Mar 4, 2026
e1a792c
docs(readme): μš”κ΅¬μ‚¬ν•­ 정리
Mar 4, 2026
cc97a30
test(cardTest): μΉ΄λ“œ ν…ŒμŠ€νŠΈμ½”λ“œ μž‘μ„±
Mar 4, 2026
c561832
feat(card): μΉ΄λ“œ 객체 κ΅¬ν˜„
Mar 4, 2026
3de16ad
docs(readme): μš”κ΅¬μ‚¬ν•­ ꡬ체화
Mar 5, 2026
b4200f5
test(parser): 빈 μž…λ ₯의 경우 μ˜ˆμ™Έμ²˜λ¦¬
Mar 5, 2026
29ddc2f
feat(parser) 빈 μž…λ ₯ 검증
Mar 5, 2026
5831766
test(domain): μ°Έκ°€μž 이름 쀑볡 검증
Mar 5, 2026
f9de3da
feat(domain): μ°Έκ°€μž 이름 쀑볡 검증
Mar 5, 2026
655ae0d
feat(domain): μΉ΄λ“œ 점수 계산
Mar 5, 2026
3f1bfc6
test(domain): 덱 생성 및 μ„žκΈ°
Mar 5, 2026
1bc1525
feat(domain): 덱 생성 및 μ„žκΈ°
Mar 5, 2026
4e2335d
feat(domain): μΉ΄λ“œλ₯Ό ν•œ μž₯ λ½‘λŠ” κΈ°λŠ₯
Mar 5, 2026
1d31d46
feat(domain): μΉ΄λ“œ 점수 ν•©μ‚° 및 λ²„μŠ€νŠΈ νŒλ³„
Mar 5, 2026
3dddaa6
feat(domain): ACE 처리
Mar 5, 2026
06d5182
feat(domain): μΉ΄λ“œ 숫자 및 무늬 λ°˜ν™˜
Mar 5, 2026
7aab304
refactor(domain): μ˜μ‘΄μ„± 뢄리
Mar 5, 2026
1d7d3d0
feat(domain): μ°Έκ°€μžμ—κ²Œ μΉ΄λ“œ λΆ„λ°°
Mar 5, 2026
9553464
refactor: 도메인 둜직 μˆ˜μ •
Mar 6, 2026
6bbf0b6
feat(domain): λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄ κ°„μ˜ μΉ΄λ“œ ν•© 비ꡐ
Mar 6, 2026
9cce391
feat: κ²Œμž„ κ²°κ³Ό λ°˜ν™˜
Mar 6, 2026
e688417
feat: νλ¦„μ œμ–΄ 및 μž…μΆœλ ₯
Mar 6, 2026
49b1638
refactor: μ°Έκ°€μž 이름 μ›μ‹œκ°’ λž˜ν•‘
Mar 6, 2026
2a266d6
refactor: λ©”μ„œλ“œλͺ… λ³€κ²½
Mar 6, 2026
d90de0e
refactor: ν…ŒμŠ€νŠΈ μ½”λ“œ κ°œμ„ 
Mar 6, 2026
f28f3c1
refactor: λ©”μ„œλ“œ λͺ… κ°œμ„ 
Mar 6, 2026
871df97
refactor: λ§€μ§λ„˜λ²„ 처리 및 dto λ„μž…
Mar 6, 2026
3935817
refactor: 쀑볡 μ½”λ“œ 제거 및 stream 처리
2Jaeheon Mar 7, 2026
02313df
docs(readme): κ΅¬ν˜„ μš”κ΅¬μ‚¬ν•­ 정리 및 μˆ˜μ •
2Jaeheon Mar 7, 2026
e757312
style: μ½”λ“œ ν¬λ§·νŒ… 및 μ„ μ–Έ μˆœμ„œ κ°œμ„ 
frombunny Mar 9, 2026
af15cb2
style: μ˜€νƒ€ μˆ˜μ •
frombunny Mar 9, 2026
ee641a5
refactor: μΉ΄λ“œ κ²°κ³Ό 좜λ ₯ 둜직 κ°œμ„ 
frombunny Mar 9, 2026
74d3f41
refactor(domain): 이쀑 for문을 Stream으둜 λ³€κ²½
frombunny Mar 10, 2026
7e1d730
refactor(domain): μΉ΄λ“œ 생성 μ‹œ, μ…”ν”Œ μ „λž΅μ„ μ‚¬μš©ν•˜λ„λ‘ μˆ˜μ •
frombunny Mar 10, 2026
016eee1
refactor(test): ν…ŒμŠ€νŠΈ 넀이밍 κ°œμ„ 
frombunny Mar 10, 2026
4478ad6
refactor(test): ν…ŒμŠ€νŠΈμ½”λ“œ κ°œμ„ 
frombunny Mar 10, 2026
b252ca8
test(domain): μ°Έκ°€μž μΉ΄λ“œ λͺ©λ‘ λ°˜ν™˜ ν…ŒμŠ€νŠΈ μΆ”κ°€
frombunny Mar 10, 2026
e6ba404
refactor(util): util λ©”μ„œλ“œλ₯Ό static으둜 μ„ μ–Έ
frombunny Mar 10, 2026
26a8bd0
test(domain): ν…ŒμŠ€νŠΈ μΆ”κ°€
frombunny Mar 10, 2026
3abcaee
refactor(domain): 곡톡 μƒμˆ˜ 클래슀 μΆ”κ°€
frombunny Mar 10, 2026
803446e
refactor(domain): 맀직 λ„˜λ²„ μΆ”μΆœ
frombunny Mar 10, 2026
53de135
refactor(domain): 맀직 λ„˜λ²„ μΆ”μΆœ
frombunny Mar 10, 2026
907c9d8
feat(domain): Card 클래슀λ₯Ό λ ˆμ½”λ“œλ‘œ μ„ μ–Έ
frombunny Mar 10, 2026
deba9b4
test: ν…ŒμŠ€νŠΈ μ½”λ“œ κ°œμ„ 
frombunny Mar 10, 2026
12a6a7a
refator(domain): 곡톡 μƒμˆ˜ 뢄리 및 λžŒλ‹€ 적용
frombunny Mar 10, 2026
8111a98
refactor(domain): Participant의 μƒμ„±μžλ₯Ό protected둜 μˆ˜μ •
frombunny Mar 11, 2026
9b83197
refactor: ν•„μš”μ—†λŠ” importλ¬Έ 제거 및 Name 클래슀λ₯Ό λ ˆμ½”λ“œλ‘œ μ„ μ–Έ
frombunny Mar 11, 2026
f31f43d
refactor: μ ‘κ·Όμ œμ–΄μž 점검
frombunny Mar 11, 2026
439ed40
refactor: Stream의 ditinct ν•¨μˆ˜ μ‚¬μš©
frombunny Mar 11, 2026
543030e
refactor: Cards 일급 μ»¬λ ‰μ…˜ 적용
frombunny Mar 11, 2026
9fb4070
refactor(domain): μΉ΄λ“œ μ…”ν”Œ μ „λž΅ μ‚¬μš© μ‹œ, μ „λž΅μ΄ μ „λ‹¬λœ 리슀트λ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šλ„λ‘ λ³€κ²½
frombunny Mar 11, 2026
bcd3028
docs: λ³€κ²½ 및 μΆ”κ°€λœ μš”κ΅¬μ‚¬ν•­ 정리
frombunny Mar 12, 2026
7e52ef0
fix: μž…λ ₯ μ˜ˆμ™Έ 처리 μΆ”κ°€
frombunny Mar 12, 2026
6b95dc1
feat(domain): λΈ”λž™μž­ νŒλ³„ 둜직 μž‘μ„±
frombunny Mar 12, 2026
3a70643
docs: λˆ„λ½λœ μš”κ΅¬μ‚¬ν•­ μΆ”κ°€
frombunny Mar 12, 2026
3b36f8e
refactor(domain): λΈ”λž™μž­ νŒλ³„ 둜직 μˆ˜μ •
frombunny Mar 12, 2026
055878a
feat(doamin): 수읡 계산 κΈ°λŠ₯ μΆ”κ°€
frombunny Mar 12, 2026
1be0dd0
refactor: μ‚¬μš©λ˜μ§€ μ•ŠλŠ” μž„ν¬νŠΈ 및 λ³€μˆ˜ 정리
frombunny Mar 12, 2026
2671cb0
refactor(domain): λΈ”λž™μž­ 여뢀에 λ”°λ₯Έ μŠΉλΆ€ νŒλ³„ 둜직 κ°œμ„ 
frombunny Mar 12, 2026
c7b94b8
style: λžŒλ‹€μ‹μœΌλ‘œ ꡬ문 λ³€κ²½
frombunny Mar 12, 2026
a68d9a0
fix: 좩돌 ν•΄κ²°
frombunny Mar 12, 2026
8d7d9c1
refactor: μ‚¬μš©λ˜μ§€ μ•ŠλŠ” 파일 μ‚­μ œ
frombunny Mar 12, 2026
ab26a90
refactor: 개발 μ‹œ μ‚¬μš©ν–ˆλ˜ 좜λ ₯ 둜그 μ‚­μ œ
frombunny Mar 13, 2026
175f494
docs: μš”κ΅¬μ‚¬ν•­ μˆ˜μ •
frombunny Mar 13, 2026
3ed8f3a
refator: 쀑볡 둜직 제거
frombunny Mar 15, 2026
c4681f6
fix: ν”Œλ ˆμ΄μ–΄μ˜ μΉ΄λ“œ 합이 21일 κ²½μš°μ—λŠ” μΉ΄λ“œλ₯Ό 뽑지 λͺ»ν•˜λ„둝 μˆ˜μ •
frombunny Mar 15, 2026
89a28ba
refactor: GameResult의 ν”Œλ ˆμ΄μ–΄μ™€ λ”œλŸ¬μ˜ κ²Œμž„ κ²°κ³Ό ν•„λ“œ 뢄리
frombunny Mar 15, 2026
1137dea
refactor: GameResult ν•„λ“œ 자료ꡬ쑰 λ³€κ²½
frombunny Mar 15, 2026
689d625
fix: μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ 였λ₯˜ ν•΄κ²°
frombunny Mar 15, 2026
4e52c38
refactor: judgeBlackjack ν•¨μˆ˜κ°€ null λŒ€μ‹  Optional을 λ°˜ν™˜ν•˜λ„λ‘ μˆ˜μ •
frombunny Mar 15, 2026
018bcb0
test: GameResultTest에 헬퍼 λ©”μ„œλ“œ μΆ”κ°€
frombunny Mar 15, 2026
5e7c895
refactor: Players에 방어적 볡사 적용
frombunny Mar 15, 2026
fefcf5b
refactor: 수읡 계산 λ‘œμ§μ„ λ³„λ„μ˜ 클래슀둜 뢄리
frombunny Mar 15, 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
62 changes: 35 additions & 27 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,51 +1,49 @@
# java-blackjack

# λΈ”λž™μž­ λ―Έμ…˜ μ €μž₯μ†Œ

# λΈ”λž™μž­ λ―Έμ…˜ μš”κ΅¬μ‚¬ν•­ 정리

# User Requirement
## User Requirement

- ν”Œλ ˆμ΄μ–΄μ˜ 이름을 μž…λ ₯ν•œλ‹€.
- μ‹œμŠ€ν…œμ€ λ”œλŸ¬μ™€ 각 ν”Œλ ˆμ΄μ–΄μ—κ²Œ μΉ΄λ“œλ₯Ό 두 μž₯μ‹Ή λΆ„λ°°ν•œλ‹€.
- ν”Œλ ˆμ΄μ–΄λŠ” μžμ‹ μ˜ μΉ΄λ“œλ₯Ό ν™•μΈν•œ λ’€, μΉ΄λ“œλ₯Ό μΆ”κ°€λ‘œ 받을지 κ²°μ •ν•œλ‹€.
- λͺ¨λ“  ν”Œλ ˆμ΄μ–΄μ˜ μ°¨λ‘€κ°€ λλ‚˜λ©΄ λ”œλŸ¬κ°€ κ·œμΉ™μ— 따라 μΉ΄λ“œλ₯Ό μΆ”κ°€λ‘œ λ°›λŠ”λ‹€.
- λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄μ˜ 점수λ₯Ό λΉ„κ΅ν•΄μ„œ 21을 μ΄ˆκ³Όν•˜μ§€ μ•Šλ˜, 21에 더 κ·Όμ ‘ν•œ μ‚¬λžŒμ΄ μŠΉλ¦¬ν•œλ‹€.

# System Requirement
- [X] μ°Έκ°€μžλŠ” λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄ λͺ¨λ‘λ₯Ό μ˜λ―Έν•œλ‹€.
## System Requirement

- [x] μ°Έκ°€μžλŠ” λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄ λͺ¨λ‘λ₯Ό μ˜λ―Έν•œλ‹€.

#### κ²Œμž„ ν™˜κ²½ μ„ΈνŒ…

- [X] κ²Œμž„μ— μ°Έμ—¬ν•  ν”Œλ ˆμ΄μ–΄μ˜ 이름을 μ‰Όν‘œλ₯Ό κΈ°μ€€μœΌλ‘œ λΆ„λ¦¬ν•˜μ—¬ μž…λ ₯λ°›λŠ”λ‹€.
- [X] μ•ž λ’€μ˜ 곡백은 μ œκ±°ν•œλ‹€.
- [X] μž…λ ₯이 λΉ„μ–΄μžˆμœΌλ©΄ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.
- [X] ν”Œλ ˆμ΄μ–΄μ˜ 이름이 μ€‘λ³΅λ˜λŠ” 경우 μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.
- [X] κ΅¬λΆ„μžμΈ μ‰Όν‘œκ°€ 맨 μ•žμ— μžˆλŠ” 경우 이λ₯Ό μ—†μ• κ³  정상 μž…λ ₯으둜 μ²˜λ¦¬ν•œλ‹€.
- [X] κ΅¬λΆ„μžμΈ μ‰Όν‘œκ°€ μ—°μ†λ˜μ–΄ λ‚˜μ˜€λŠ” 경우 이λ₯Ό μ—†μ• κ³  정상 μž…λ ₯으둜 μ²˜λ¦¬ν•œλ‹€.
- [X] ν”Œλ ˆμ΄μ–΄ μˆ˜λŠ” μ΅œλŒ€ 5인으둜 μ œν•œν•œλ‹€.
- [x] κ²Œμž„μ— μ°Έμ—¬ν•  ν”Œλ ˆμ΄μ–΄μ˜ 이름을 μ‰Όν‘œλ₯Ό κΈ°μ€€μœΌλ‘œ λΆ„λ¦¬ν•˜μ—¬ μž…λ ₯λ°›λŠ”λ‹€.
- [x] μ•ž λ’€μ˜ 곡백은 μ œκ±°ν•œλ‹€.
- [x] μž…λ ₯이 λΉ„μ–΄μžˆμœΌλ©΄ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.
- [x] ν”Œλ ˆμ΄μ–΄μ˜ 이름이 μ€‘λ³΅λ˜λŠ” 경우 μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.
- [x] κ΅¬λΆ„μžμΈ μ‰Όν‘œκ°€ 맨 μ•žμ— μžˆλŠ” 경우 이λ₯Ό μ—†μ• κ³  정상 μž…λ ₯으둜 μ²˜λ¦¬ν•œλ‹€.
- [x] κ΅¬λΆ„μžμΈ μ‰Όν‘œκ°€ μ—°μ†λ˜μ–΄ λ‚˜μ˜€λŠ” 경우 이λ₯Ό μ—†μ• κ³  정상 μž…λ ₯으둜 μ²˜λ¦¬ν•œλ‹€.
- [x] ν”Œλ ˆμ΄μ–΄ μˆ˜λŠ” μ΅œλŒ€ 5인으둜 μ œν•œν•œλ‹€.
- [x] ν”Œλ ˆμ΄μ–΄μ˜ 이름은 μ΅œλŒ€ 5자둜 μ œν•œν•œλ‹€.
- [X] μ€‘λ³΅λ˜μ§€ μ•Šμ€ 52μž₯의 μΉ΄λ“œ 덱을 λ§Œλ“ λ‹€.
- [X] μΉ΄λ“œ λ¬ΆμŒμ„ λžœλ€ν•˜κ²Œ μ„žλŠ”λ‹€.
- [X] λ”œλŸ¬μ™€ 각 ν”Œλ ˆμ΄μ–΄μ—κ²Œ μΉ΄λ“œ 두 μž₯을 λΆ„λ°°ν•œλ‹€.
- [x] 각 ν”Œλ ˆμ΄μ–΄λ§ˆλ‹€ λ² νŒ…ν•  κΈˆμ•‘μ„ μž…λ ₯ν•œλ‹€.
- [x] μ€‘λ³΅λ˜μ§€ μ•Šμ€ 52μž₯의 μΉ΄λ“œ 덱을 λ§Œλ“ λ‹€.
- [x] μΉ΄λ“œ λ¬ΆμŒμ„ λžœλ€ν•˜κ²Œ μ„žλŠ”λ‹€.
- [x] λ”œλŸ¬μ™€ 각 ν”Œλ ˆμ΄μ–΄μ—κ²Œ μΉ΄λ“œ 두 μž₯을 λΆ„λ°°ν•œλ‹€.
- [x] λ‚˜λˆ„μ–΄μ§„ μΉ΄λ“œλ₯Ό 화면에 좜λ ₯ν•œλ‹€.

#### μΉ΄λ“œ 점수 계산

- [X] 2~10 μ‚¬μ΄μ˜ 숫자 μΉ΄λ“œλŠ” ν•΄λ‹Ή 숫자만큼의 점수둜 μ²˜λ¦¬ν•œλ‹€.
- [X] J, Q, K μΉ΄λ“œλŠ” 10점으둜 μ²˜λ¦¬ν•œλ‹€.
- [X] ACE μΉ΄λ“œλŠ” κΈ°λ³Έ 11점으둜 μ²˜λ¦¬ν•œλ‹€.
- [X] μΉ΄λ“œμ˜ 합이 21을 λ„˜κ³  ACE μΉ΄λ“œκ°€ μ‘΄μž¬ν•˜λŠ” 경우, μΉ΄λ“œμ˜ 합이 21을 λ„˜μ§€ μ•Šλ˜ 21에 κ°€μž₯ κ·Όμ ‘ν•˜λ„λ‘ κ³„μ‚°ν•œλ‹€.
- [X] ν”Œλ ˆμ΄μ–΄κ°€ μ§€λ‹ˆκ³  μžˆλŠ” μΉ΄λ“œμ˜ 점수λ₯Ό ν•©μ‚°ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.
- [x] 2~10 μ‚¬μ΄μ˜ 숫자 μΉ΄λ“œλŠ” ν•΄λ‹Ή 숫자만큼의 점수둜 μ²˜λ¦¬ν•œλ‹€.
- [x] J, Q, K μΉ΄λ“œλŠ” 10점으둜 μ²˜λ¦¬ν•œλ‹€.
- [x] ACE μΉ΄λ“œλŠ” κΈ°λ³Έ 11점으둜 μ²˜λ¦¬ν•œλ‹€.
- [x] μΉ΄λ“œμ˜ 합이 21을 λ„˜κ³  ACE μΉ΄λ“œκ°€ μ‘΄μž¬ν•˜λŠ” 경우, μΉ΄λ“œμ˜ 합이 21을 λ„˜μ§€ μ•Šλ˜ 21에 κ°€μž₯ κ·Όμ ‘ν•˜λ„λ‘ κ³„μ‚°ν•œλ‹€.
- [x] ν”Œλ ˆμ΄μ–΄κ°€ μ§€λ‹ˆκ³  μžˆλŠ” μΉ΄λ“œμ˜ 점수λ₯Ό ν•©μ‚°ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.

#### ν”Œλ ˆμ΄μ–΄ ν„΄ μ§„ν–‰

- [X] 덱에 μ—¬λΆ„μ˜ μΉ΄λ“œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우 μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.
- [X] λ±μ—μ„œ μΉ΄λ“œλ₯Ό ν•œ μž₯ λ½‘λŠ”λ‹€.
- [x] 덱에 μ—¬λΆ„μ˜ μΉ΄λ“œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우 μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.
- [x] λ±μ—μ„œ μΉ΄λ“œλ₯Ό ν•œ μž₯ λ½‘λŠ”λ‹€.
- [x] ν”Œλ ˆμ΄μ–΄μ˜ μΉ΄λ“œμ˜ 합이 21 미만인 경우 더 받을지 λ¬»λŠ”λ‹€.
- [x] 'y'λ₯Ό μž…λ ₯ν•˜λŠ” 경우 λ±μ—μ„œ μΉ΄λ“œ ν•œ μž₯을 뽑아 ν”Œλ ˆμ΄μ–΄μ—κ²Œ μ œκ³΅ν•œλ‹€.
- [x] 'n'λ₯Ό μž…λ ₯ν•˜κ±°λ‚˜, μΉ΄λ“œμ˜ 합이 21 이상이면 ν•΄λ‹Ή ν”Œλ ˆμ΄μ–΄μ˜ μ°¨λ‘€λ₯Ό μ’…λ£Œν•œλ‹€.
- [x] 'y'λ‚˜ 'n'μ΄μ™Έμ˜ λ‹€λ₯Έ 값이 μž…λ ₯되면 μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜κ³  λ‹€μ‹œ μž…λ ₯λ°›λŠ”λ‹€.
- [x] 'n'λ₯Ό μž…λ ₯ν•˜κ±°λ‚˜, μΉ΄λ“œμ˜ 합이 21을 μ΄ˆκ³Όν•˜λ©΄ ν•΄λ‹Ή ν”Œλ ˆμ΄μ–΄μ˜ μ°¨λ‘€λ₯Ό μ’…λ£Œν•œλ‹€.
- [x] 'y'λ‚˜ 'n'μ΄μ™Έμ˜ λ‹€λ₯Έ 값이 μž…λ ₯되면 μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

#### λ”œλŸ¬ ν„΄ μ§„ν–‰

Expand All @@ -58,6 +56,16 @@
- [x] ν”Œλ ˆμ΄μ–΄μ˜ μΉ΄λ“œ 점수의 합이 21을 μ΄ˆκ³Όν–ˆλŠ”μ§€ κ³„μ‚°ν•œλ‹€.
- [x] λ”œλŸ¬μ˜ μΉ΄λ“œ 점수의 합이 21을 μ΄ˆκ³Όν–ˆλŠ”μ§€ κ³„μ‚°ν•œλ‹€.
- [x] λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄ 쀑 μΉ΄λ“œ 점수의 합이 21을 μ΄ˆκ³Όν•˜μ§€ μ•Šλ˜, 21에 더 κ°€κΉŒμš΄ μ‚¬λžŒμ„ 승자둜 μ²˜λ¦¬ν•œλ‹€.
- [x] ν”Œλ ˆμ΄μ–΄κ°€ μŠΉλ¦¬ν•˜λ©΄, ν”Œλ ˆμ΄μ–΄λŠ” μžμ‹ μ΄ λ² νŒ…ν•œ κΈˆμ•‘λ§ŒνΌ λ”œλŸ¬μ—κ²Œ λ°›λŠ”λ‹€.
- [x] λ”œλŸ¬κ°€ μŠΉλ¦¬ν•˜λ©΄, ν”Œλ ˆμ΄μ–΄λŠ” μžμ‹ μ΄ λ² νŒ…ν•œ κΈˆμ•‘μ„ λ”œλŸ¬μ—κ²Œ μ€€λ‹€.
- [x] μ μˆ˜κ°€ 같은 경우 λ¬΄μŠΉλΆ€λ‘œ μ²˜λ¦¬ν•œλ‹€.
- [x] 이 경우 ν”Œλ ˆμ΄μ–΄λŠ” λ² νŒ…ν•œ κΈˆμ•‘μ„ λŒλ €λ°›λŠ”λ‹€.
- [x] λΈ”λž™μž­μ€ 처음 받은 두 μž₯의 μΉ΄λ“œμ˜ 합이 21인 경우λ₯Ό μ˜λ―Έν•œλ‹€.
- [x] ν”Œλ ˆμ΄μ–΄λŠ” λΈ”λž™μž­μ΄κ³ , λ”œλŸ¬λŠ” λΈ”λž™μž­μ΄ μ•„λ‹ˆλΌλ©΄ ν”Œλ ˆμ΄μ–΄λŠ” μŠΉλ¦¬ν•œλ‹€. 이 κ²½μš°μ—λŠ” ν”Œλ ˆμ΄μ–΄λŠ” λ² νŒ…ν•œ κΈˆμ•‘μ˜ 1.5λ°°λ₯Ό λ”œλŸ¬μ—κ²Œ λ°›λŠ”λ‹€.
- [x] λ”œλŸ¬λŠ” λΈ”λž™μž­μ΄κ³ , ν”Œλ ˆμ΄μ–΄λŠ” λΈ”λž™μž­μ΄ μ•„λ‹ˆλΌλ©΄ ν”Œλ ˆμ΄μ–΄λŠ” νŒ¨λ°°ν•œλ‹€.
- [x] λ‘˜λ‹€ λΈ”λž™μž­μΈ 경우, λ¬΄μŠΉλΆ€λ‘œ μ²˜λ¦¬ν•œλ‹€.
- [x] μ μˆ˜κ°€ 같은 경우 λ¬΄μŠΉλΆ€λ‘œ μ²˜λ¦¬ν•œλ‹€.
- [x] 이 경우 ν”Œλ ˆμ΄μ–΄λŠ” λ² νŒ…ν•œ κΈˆμ•‘μ„ λŒλ €λ°›λŠ”λ‹€.
- [x] λ”œλŸ¬μ™€ 각 ν”Œλ ˆμ΄μ–΄μ˜ μ΅œμ’… μΉ΄λ“œ λͺ©λ‘κ³Ό 점수λ₯Ό 좜λ ₯ν•œλ‹€.
- [x] μ΅œμ’… 승패λ₯Ό 좜λ ₯ν•œλ‹€.
- [x] λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄κ°€ λͺ¨λ‘ λ™μ‹œμ— λΈ”λž™μž­μΈ 경우 ν”Œλ ˆμ΄μ–΄λŠ” λ² νŒ…ν•œ κΈˆμ•‘μ„ λŒλ €λ°›λŠ”λ‹€.
- [x] μ΅œμ’… μˆ˜μ΅μ„ κ³„μ‚°ν•˜μ—¬ 좜λ ₯ν•œλ‹€.
21 changes: 17 additions & 4 deletions src/main/java/controller/BlackjackGame.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,15 @@ public BlackjackGame(InputView inputView, OutputView outputView) {

public void run() {
String names = inputView.getNames();
List<String> parsedName = InputParser.parseName(names);
List<String> parsedNames = InputParser.parseName(names);

Players players = new Players(parsedNames
.stream()
.map(Player::new).toList()
);

players.getPlayers().forEach(player -> player.bet(inputView.getBetAmount(player.name())));
Copy link
Member

Choose a reason for hiding this comment

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

μΌκΈ‰μ»¬λ ‰μ…˜μ—μ„œμ˜ μš”μ†Œλ₯Ό 받은 λ’€ κ·Έ μš”μ†Œκ°€ playerκ°€ λ³€κ²½λ˜λŠ” κ΅¬μ‘°λ„€μš”!
ꡬ쑰적으둜 λΆˆμ•ˆμ •ν•œ ν˜•νƒœκ°€ λ˜λŠ” 것 같은데 μ–΄λ–»κ²Œ μ•ˆμ •μ μΈ ν˜•νƒœλ‘œλ§Œλ“€μ–΄ λ³Ό 수 μžˆμ„κΉŒμš”?
방어적 볡사λ₯Ό μ μš©ν•΄λ³΄μ‹œμ£ !

Copy link
Author

@frombunny frombunny Mar 15, 2026

Choose a reason for hiding this comment

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

말씀해주신 λ‚΄μš©μ„ λ°”νƒ•μœΌλ‘œ playersλ₯Ό λ°˜ν™˜ν•˜λŠ” λΆ€λΆ„μ—μ„œ 방어적 볡사λ₯Ό μ μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€!

그런데 κ°œλ°œμ„ ν•˜λ‹€κ°€ ν•œ κ°€μ§€ κ³ λ―Όν–ˆλ˜ 뢀뢄이 μƒκ°λ‚¬μŠ΅λ‹ˆλ‹€.
[이름을 μž…λ ₯ λ°›μ•„ Player 객체λ₯Ό μƒμ„±ν•œ ν›„, λ² νŒ… κΈˆμ•‘μ„ μž…λ ₯ λ°›λŠ” 방식] VS [이름과 λ² νŒ… κΈˆμ•‘μ„ λͺ¨λ‘ μž…λ ₯ 받은 ν›„ Player 객체λ₯Ό μƒμ„±ν•˜λŠ” 방식] 쀑 무엇이 더 μ μ ˆν• μ§€ κ³ λ―Όλ˜μ—ˆμŠ΅λ‹ˆλ‹€..!

개인적으둜 μ½”λ“œλ₯Ό μž‘μ„±ν•  λ‹Ήμ‹œμ—λŠ” 이름을 μž…λ ₯λ°›μ•„ Player 객체λ₯Ό μƒμ„±ν•œ ν›„ λ² νŒ… κΈˆμ•‘μ„ μž…λ ₯ λ°›λŠ” 것이 μ‹€μ œ κ²Œμž„ 흐름과 더 μœ μ‚¬ν•˜λ‹€κ³  μƒκ°ν•΄μ„œ μ΄λ ‡κ²Œ μž‘μ„±ν–ˆλŠ”λ°, 그둜 인해 μ €λŸ° μ½”λ“œκ°€ λ‚˜μ˜€κ²Œ 된 것 κ°™μ•„μš”!

ν˜Ήμ‹œ 이름과 λ² νŒ… κΈˆμ•‘μ„ λͺ¨λ‘ μž…λ ₯받은 λ’€ Player 객체λ₯Ό μƒμ„±ν•˜λŠ” 방식이 더 μ μ ˆν•œ 섀계일지 κΆκΈˆν•©λ‹ˆλ‹€!


Players players = new Players(parsedName);
Dealer dealer = new Dealer(DEALER_NAME);

CardShuffleStrategy cardShuffleStrategy = new RandomShuffleStrategy();
Expand Down Expand Up @@ -70,10 +76,17 @@ private void dealerTurn(Dealer dealer, Deck deck) {

private void playerTurn(Player player, Deck deck) {
while (player.canDraw()) {
if (inputView.getChoice(player.name()).equals("n")) {
String playerName = player.name();
String choice = inputView.getChoice(playerName);

if (choice.equals("n")) {
break;
}

if (!choice.equals("y")) {
throw new IllegalArgumentException();
}

player.receive(deck.draw());
outputView.printParticipantCards(player);
}
Expand All @@ -85,6 +98,6 @@ private void showGameResult(Players players, Dealer dealer) {
participants.forEach(outputView::printFinalResult);

GameResult gameResult = new GameResult(players, dealer);
outputView.printGameResult(gameResult, dealer);
outputView.printGameResult(gameResult, players, dealer);
}
}
41 changes: 15 additions & 26 deletions src/main/java/domain/game/GameResult.java
Original file line number Diff line number Diff line change
@@ -1,45 +1,34 @@
package domain.game;

import domain.participant.Dealer;
import domain.participant.Participant;
import domain.participant.Player;
import domain.participant.Players;
import dto.DealerResultInfo;
import dto.PlayerResultInfo;
import dto.ParticipantResultInfo;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

import static java.util.Collections.frequency;
import static domain.game.ProfitCalculator.calculatePlayerProfit;

public class GameResult {
private final Map<Player, WinningStatus> playerWinningStatus = new LinkedHashMap<>();
private final Map<Participant, BigDecimal> participantsProfits = new HashMap<>();

public GameResult(Players players, Dealer dealer) {
for (Player player : players.getPlayers()) {
playerWinningStatus.put(player, WinningStatus.of(player, dealer));
}
}

public List<PlayerResultInfo> getPlayersResult() {
List<PlayerResultInfo> result = new ArrayList<>();
BigDecimal playersProfitSum = BigDecimal.ZERO;
Copy link
Member

Choose a reason for hiding this comment

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

BigDecimal을 μ‚¬μš©ν•΄μ£Όμ…¨κ΅°μš”!
μ™œ BigDecimal을 μ‚¬μš©ν•˜μ…¨λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€

Copy link
Author

Choose a reason for hiding this comment

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

float, double 같은 κ²½μš°λŠ” λΆ€λ™μ†Œμˆ˜μ μ„ μ΄μš©ν•΄ 수λ₯Ό μ €μž₯ν•˜λŠ”λ°, 이 κ³Όμ •μ—μ„œ μ˜€μ°¨κ°€ λ°œμƒν•  수 μžˆλ‹€κ³  μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€. λˆμ€ λ―Έμ„Έν•œ μ˜€μ°¨λ„ ν—ˆμš©λ˜λ©΄ μ•ˆλœλ‹€κ³  νŒλ‹¨ν•˜μ—¬, BigDecimalλ₯Ό μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€ 🐰


for (Map.Entry<Player, WinningStatus> entry : playerWinningStatus.entrySet()) {
String name = entry.getKey().name();
WinningStatus status = entry.getValue();
for (Player player : players.getPlayers()) {
BigDecimal profit = calculatePlayerProfit(player, dealer);
playersProfitSum = playersProfitSum.add(profit);

result.add(new PlayerResultInfo(name, status));
participantsProfits.put(player, profit);
}

return result;
participantsProfits.put(dealer, playersProfitSum.negate());
}

public DealerResultInfo getDealerResult() {
int winCount = frequency(playerWinningStatus.values(), WinningStatus.LOSE);
int tieCount = frequency(playerWinningStatus.values(), WinningStatus.TIE);
int loseCount = frequency(playerWinningStatus.values(), WinningStatus.WIN);

return new DealerResultInfo(winCount, tieCount, loseCount);
public ParticipantResultInfo participantResultInfo(Participant participant) {
return new ParticipantResultInfo(participant.name(), participantsProfits.get(participant));
}
}

27 changes: 27 additions & 0 deletions src/main/java/domain/game/ProfitCalculator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package domain.game;

import domain.participant.Dealer;
import domain.participant.Player;

import java.math.BigDecimal;

public class ProfitCalculator {
public static BigDecimal calculatePlayerProfit(Player player, Dealer dealer) {
WinningStatus winningStatus = WinningStatus.of(player, dealer);
BigDecimal betAmount = player.betAmount();

if (player.isBlackjack() && winningStatus == WinningStatus.WIN) {
return betAmount.multiply(BigDecimal.valueOf(1.5));
}

if (winningStatus == WinningStatus.WIN) {
return betAmount;
}

if (winningStatus == WinningStatus.TIE) {
return BigDecimal.ZERO;
}

return betAmount.negate();
}
}
33 changes: 26 additions & 7 deletions src/main/java/domain/game/WinningStatus.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,43 @@
import domain.participant.Dealer;
import domain.participant.Player;

import static domain.BlackjackRule.BLACK_JACK;
import java.util.Optional;

public enum WinningStatus {
WIN,
TIE,
LOSE;

public static WinningStatus of(Player player, Dealer dealer) {
int playerScore = player.score();
int dealerScore = dealer.score();
if (dealer.isBust()) {
return WIN;
}

if (playerScore > BLACK_JACK) {
if (player.isBust()) {
return LOSE;
}

if (dealerScore > BLACK_JACK) {
return WIN;
Optional<WinningStatus> winningStatus = judgeBlackjack(player, dealer);
return winningStatus.orElseGet(() -> compareScore(player.score(), dealer.score()));
}

private static Optional<WinningStatus> judgeBlackjack(Player player, Dealer dealer) {
boolean isPlayerBlackjack = player.isBlackjack();
boolean isDealerBlackjack = dealer.isBlackjack();

if (isPlayerBlackjack && !isDealerBlackjack) {
return Optional.of(WIN);
}
return compareScore(playerScore, dealerScore);

if (!isPlayerBlackjack && isDealerBlackjack) {
return Optional.of(LOSE);
}

if (isPlayerBlackjack && isDealerBlackjack) {
return Optional.of(TIE);
}

return Optional.empty();
}

private static WinningStatus compareScore(int playerScore, int dealerScore) {
Expand All @@ -31,6 +49,7 @@ private static WinningStatus compareScore(int playerScore, int dealerScore) {
if (playerScore < dealerScore) {
return LOSE;
}

return TIE;
}
}
7 changes: 6 additions & 1 deletion src/main/java/domain/participant/Hand.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.util.List;

import static domain.BlackjackRule.BLACK_JACK;
import static domain.BlackjackRule.INITIAL_CARDS_COUNT;

public class Hand {
public static final int ACE_ADJUST_VALUE = 10;
Expand All @@ -24,6 +25,10 @@ public boolean isBust() {
return score() > BLACK_JACK;
}

public boolean isBlackjack() {
return score() == BLACK_JACK && size() == INITIAL_CARDS_COUNT;
}

public int score() {
int total = cards.sum();
int aceCount = cards.countAce();
Expand All @@ -36,7 +41,7 @@ public int score() {
return total;
}

public Card peek(){
public Card peek() {
return cards.peek();
}

Expand Down
8 changes: 8 additions & 0 deletions src/main/java/domain/participant/Participant.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,14 @@ public void receiveInitialCards(Cards cards) {
cards.cards().forEach(this::receive);
}

public boolean isBlackjack() {
return hand.isBlackjack();
}

public boolean isBust() {
return hand.isBust();
}

public void receive(Card card) {
hand.add(card);
}
Expand Down
13 changes: 12 additions & 1 deletion src/main/java/domain/participant/Player.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,26 @@
package domain.participant;

import java.math.BigDecimal;

import static domain.BlackjackRule.BLACK_JACK;

public class Player extends Participant {
private BigDecimal betAmount = BigDecimal.ZERO;
Copy link
Member

Choose a reason for hiding this comment

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

λ² νŒ… κΈˆμ•‘μ„ κ΄€λ¦¬ν•˜λŠ” 객체가 λ”°λ‘œ ν•„μš”ν• κΉŒμš”?
이 뢀뢄을 κ³ λ―Όν•˜λ©΄μ„œ κ³Όν•œ 섀계와 ν™•μž₯ κ°€λŠ₯ν•œ 섀계 μ‚¬μ΄μ—μ„œ μ–΄λ–»κ²Œ κ· ν˜•μ„ μž‘μ•„μ•Ό ν• μ§€ κΆκΈˆν•΄μ‘Œμ–΄μš”.
도메인 객체λ₯Ό 뢄리할 λ•Œ μ–΄λŠ μ •λ„μ˜ μ±…μž„μ΄λ‚˜ κ·œμΉ™μ΄ 생기면 객체둜 λΆ„λ¦¬ν•˜λŠ” 것이 μ μ ˆν•œμ§€,
ν˜Ήμ€ 미래 ν™•μž₯을 κ³ λ €ν•΄ 미리 객체λ₯Ό λ§Œλ“œλŠ” 것이 쒋은 κ²½μš°λŠ” μ–Έμ œμΈμ§€ κΆκΈˆν•΄μš”!
일단 제 생각은 μ±…μž„μ΄ λŠ˜μ–΄κ°€κ±°λ‚˜ 도메인 κ·œμΉ™μ΄ μΆ”κ°€λ˜λ©΄ 객체둜 λΆ„λ¦¬ν•˜λŠ” 것이 μ’‹λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.
κ³Όν•œ μΆ”μƒν™”λŠ” 였히렀 μ½”λ“œ λ³΅μž‘λ„λ₯Ό 높일 수 μžˆλ‹€κ³  μƒκ°ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€!

쒋은 기쀀이라고 μƒκ°ν•©λ‹ˆλ‹€! 저도 λ°”λ‹ˆμ˜ μ˜κ²¬μ— λ™μ˜ν•΄μš” :)
μ €λŠ” 개인적으둜 λˆμ΄λΌλŠ” 도메인을 μ€‘μš”ν•˜κ²Œ μƒκ°ν•˜λŠ” 편이라 λˆμ„ λ‹€λ£¨λŠ” 값은 λ°˜λ“œμ‹œ λž˜ν•‘ν•΄μ•Όν•œλ‹€κ³  μƒκ°ν•˜λŠ” νŽΈμ΄μ—μš”
1원이라도 μ˜€μ°¨κ°€ λ‚˜λ©΄ μ•ˆλ˜λŠ” 도메인이라고 μƒκ°ν•˜κ±°λ“ μš”!

이건 제 개인적인 의견이고, λ°”λ‹ˆμ˜ μ£Όμž₯κ³Ό 근거도 νƒ€λ‹Ήν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€!

Copy link
Author

@frombunny frombunny Mar 15, 2026

Choose a reason for hiding this comment

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

사싀 μ΄μ „κΉŒμ§€λŠ” ν˜„μ‹œμ μ—μ„œ ꡳ이 λˆμ„ λž˜ν•‘ν•΄μ•Ό ν• κΉŒ ν•˜λŠ” 생각이 μžˆμ—ˆλŠ”λ°,
μ£Όλ…Έμ˜ μ˜κ²¬μ„ λ“£κ³  λ³΄λ‹ˆ λˆμ΄λΌλŠ” 도메인을 λ³„λ„μ˜ κ°’ 객체둜 λ‹€λ£¨λŠ” 이유λ₯Ό μ•Œκ² μ–΄μš”πŸ˜ƒ
λ‹€μ‹œ 생각해도 μ€‘μš”ν•œ 건은 슀슀둜 κ·Έ μ„ νƒμ˜ κ·Όκ±°λ₯Ό μ„€λͺ…ν•  수 μžˆμ–΄μ•Ό ν•˜λŠ” κ²ƒμ΄λΌλŠ” 생각이 λ“œλ„€μš”!


public Player(String name) {
super(name);
}

@Override
public boolean canDraw() {
return super.score() <= BLACK_JACK;
return super.score() < BLACK_JACK;
}

public void bet(BigDecimal betAmount) {
this.betAmount = betAmount;
}

public BigDecimal betAmount() {
return betAmount;
}
}
11 changes: 4 additions & 7 deletions src/main/java/domain/participant/Players.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,10 @@

public class Players {
private static final int PLAYER_THRESHOLD = 5;
private final List<Player> players = new ArrayList<>();
private final List<Player> players;

public Players(List<String> names) {
for (String name : names) {
Player player = new Player(name);
players.add(player);
}
public Players(List<Player> players) {
this.players = new ArrayList<>(players);

validatePlayerCount(players);
validateDuplicatedName(players);
Expand Down Expand Up @@ -42,6 +39,6 @@ public List<String> getPlayerNames() {
}

public List<Player> getPlayers() {
return players;
return List.copyOf(players);
}
}
8 changes: 0 additions & 8 deletions src/main/java/dto/DealerResultInfo.java

This file was deleted.

Loading