Skip to content

[๐Ÿš€ ์‚ฌ์ดํด1 - ๋ฏธ์…˜ (๋ธ”๋ž™์žญ ๊ฒŒ์ž„ ์‹คํ–‰)] ์•„ํ‹ฐ ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.#956

Merged
jurlring merged 53 commits intowoowacourse:parkjiyeoung8297from
ParkJiYeoung8297:parkjiyeong8297
Mar 11, 2026

Conversation

@ParkJiYeoung8297
Copy link

@ParkJiYeoung8297 ParkJiYeoung8297 commented Mar 6, 2026

๋ธ”๋ž™์žญ

์ฒดํฌ ๋ฆฌ์ŠคํŠธ

  • ๋ฏธ์…˜์˜ ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ–ˆ๋‚˜์š”?
  • Gradle test๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ, ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํ†ต๊ณผํ–ˆ๋‚˜์š”?
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋‚˜์š”?

์–ด๋–ค ๋ถ€๋ถ„์— ์ง‘์ค‘ํ•˜์—ฌ ๋ฆฌ๋ทฐํ•ด์•ผ ํ• ๊นŒ์š”?

  1. BlackjackResultTest.java์˜ ์ฐธ๊ฐ€์ž๊ฐ€_๋”œ๋Ÿฌ๋ณด๋‹ค_์ ์ˆ˜_๋‚ฎ์Œ() ํ…Œ์ŠคํŠธ
  • private์ธ ๋ฉ”์„œ๋“œ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด์„œ, ์ตœ์ข… ๊ฒฐ๊ณผ dto๋ฅผ ๋น„๊ตํ•ด์„œ ๊ฐ„์ ‘์ ์œผ๋กœ private ๋ฉ”์„œ๋“œ๋ฅผ ๊ฒ€์ฆํ–ˆ์Šต๋‹ˆ๋‹ค.
    ํ•˜๋‚˜๋งŒ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ private ๋ฉ”์„œ๋“œ๋ฅผ ๊ฑฐ์นœ ๊ฒฐ๊ณผ์ธ๋ฐ, ์ตœ์ข… dto๋กœ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ์‹์ด ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๊ฒ€์ฆํ–ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
  1. SOLID ์ธก๋ฉด์—์„œ ๊ฐœ์„ ํ•  ์‚ฌํ•ญ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
    ํŠนํžˆ SRP ๋ฉด์—์„œ, ํ•˜๋‚˜์˜ ์ฑ…์ž„์œผ๋กœ ๋ฉ”์„œ๋“œ๊ฐ€ ์ž˜ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋Š”์ง€ ํ”ผ๋“œ๋ฐฑ ๋ฐ›๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  2. inputView์™€ OutputView๋ฅผ ์œ ํ‹ธ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„์ง€, ์ธ์Šคํ„ด์Šค๋กœ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

  3. if๋ฌธ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. enum์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„ํ•  ๋•Œ switch ์—†์ด ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋ฉด
    if๋ฌธ์ด ์ฝ”๋“œ์— ๋งŽ์ด ๋‚˜์˜ค๊ฒŒ ๋˜๋Š” ๊ฒƒ์„ ๊ฒฝํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค. values()๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ for๋ฌธ์„ ๋Œ๋ ค ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•ด๊ฒฐํ–ˆ์ง€๋งŒ, ์ด๋•Œ๋„ ๋งค๋„๋Ÿฝ์ง€ ์•Š๊ฒŒ
    ํ•ด๊ฒฐ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ๋Š” ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์ด ์žˆ์„์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.


๊ตฌํ˜„ ๋‚ด์šฉ

ํ•„์ˆ˜ ์š”๊ตฌ ์‚ฌํ•ญ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ๋ธ”๋ž™์žญ ๊ฒŒ์ž„์€ ๋”œ๋Ÿฌ์™€ ํ”Œ๋ ˆ์ด์–ด ์ค‘ ์นด๋“œ์˜ ํ•ฉ์ด 21 ๋˜๋Š” 21์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ˆซ์ž๋ฅผ ๊ฐ€์ง€๋Š” ์ชฝ์ด ์ด๊ธด๋‹ค.
  • Ace๋Š” 1 ๋˜๋Š” 11๋กœ ๊ณ„์‚ฐํ•œ๋‹ค.
  • King, Queen, Jack์€ ๊ฐ๊ฐ 10์œผ๋กœ ๊ณ„์‚ฐํ•œ๋‹ค.
  • ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•˜๋ฉด ํ”Œ๋ ˆ์ด์–ด๋Š” ๋‘ ์žฅ์˜ ์นด๋“œ๋ฅผ ์ง€๊ธ‰ ๋ฐ›๋Š”๋‹ค.
  • 21์„ ๋„˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์›ํ•œ๋‹ค๋ฉด ์–ผ๋งˆ๋“ ์ง€ ์นด๋“œ๋ฅผ ๊ณ„์† ๋ฝ‘์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๋”œ๋Ÿฌ๋Š” ์ฒ˜์Œ์— ๋ฐ›์€ 2์žฅ์˜ ํ•ฉ๊ณ„๊ฐ€ 16์ดํ•˜์ด๋ฉด ๋ฐ˜๋“œ์‹œ 1์žฅ์˜ ์นด๋“œ๋ฅผ ์ถ”๊ฐ€๋กœ ๋ฐ›์•„์•ผ ํ•œ๋‹ค.
  • ๋”œ๋Ÿฌ๋Š” ์ฒ˜์Œ์— ๋ฐ›์€ 2์žฅ์˜ ํ•ฉ๊ณ„๊ฐ€ 17์  ์ด์ƒ์ด๋ฉด ์ถ”๊ฐ€๋กœ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค.
  • ๊ฒŒ์ž„์„ ์™„๋ฃŒํ•œ ํ›„ ๊ฐ ํ”Œ๋ ˆ์ด์–ด๋ณ„๋กœ ์ŠนํŒจ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์ถ”๊ฐ€๋กœ ์ •์˜ํ•œ ์ œ์•ฝ ์‚ฌํ•ญ

  1. ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋ชจ๋‘ burst๋ผ๋ฉด, dealer๋Š” ์ถ”๊ฐ€ ์นด๋“œ๋ฅผ ๋ฐ›์ง€ ์•Š๊ณ  ๋ฌด์กฐ๊ฑด ์Šน๋ฆฌํ•œ๋‹ค.
  2. ํ”Œ๋ ˆ์ด์–ด ์นด๋“œ burst๋ผ๋ฉด, ์ถ”๊ฐ€ ์นด๋“œ๋ฅผ ๋ฐ›์ง€ ๋ชปํ•˜๊ณ  ํ„ด์„ ๋„˜๊ธด๋‹ค.

๊ธฐ๋Šฅ ๋ชฉ๋ก

  • ์ฐธ๊ฐ€์ž ์ž…๋ ฅ ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • ์ฐธ๊ฐ€์ž ์ด๋ฆ„๊ณผ ์นด๋“œ ๊ฐœ์ˆ˜, ์นด๋“œ ์ถœ๋ ฅ
  • ์นด๋“œ ๋žœ๋ค ์ƒ์„ฑํ•˜๊ธฐ
  • ์ฐธ๊ฐ€์ž ์นด๋“œ ๋ฐฐ์ •ํ•˜๊ธฐ
  • ์ถ”๊ฐ€ ์นด๋“œ ์—ฌ๋ถ€ ์ž…๋ ฅ ๊ตฌํ˜„
  • ์ถ”๊ฐ€ ์นด๋“œ ์ถœ๋ ฅ ๊ตฌํ˜„
  • ๋”œ๋Ÿฌ ์ถ”๊ฐ€ ์นด๋“œ ์—ฌ๋ถ€ ํŒ๋‹จ ๋กœ์ง
  • ์นด๋“œ ํ•ฉ๊ณ„ ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • Ace ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • ๋ฒ„์ŠคํŠธ ํŒ๋‹จ ์—ฌ๋ถ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • ๋”œ๋Ÿฌ ์ถ”๊ฐ€ ์นด๋“œ ๋ฐ˜๋ณต ๋ฐฐ๋ถ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • ์นด๋“œ ๊ฒฐ๊ณผ ํŒ๋‹จ ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • ๋ธ”๋ž™์žญ ์Šน๋ถ€ ๊ณ„์‚ฐ (burst ๊ณ ๋ ค)
  • ๋ชจ๋“  player burst ํŒ๋‹จ ๋กœ์ง ์ถ”๊ฐ€
  • ๋”œ๋Ÿฌ ์Šน๋ถ€ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ ๊ธฐ๋Šฅ
  • ๋”œ๋Ÿฌ ์นด๋“œ ์ถœ๋ ฅ ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • ์นด๋“œ 21 ์ดˆ๊ณผ์ด๋ฉด ํ„ด ๋„˜์–ด๊ฐ€๊ธฐ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

ํŽ˜์–ดํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‚ฌ์ „ ํ•™์Šต

๋ฏธ์…˜ ์ค‘ ํ•  ์ผ

  1. ํ† ๋ก  ํ™œ๋™์—์„œ ์ •ํ•œ ๊ทœ์น™์„ ์˜์‹ํ•˜๋ฉฐ ์ฝ”๋“œ ์ž‘์„ฑ
  2. ๊ทœ์น™ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•œ ๊ณณ ๊ธฐ๋ก
  3. ๋ง‰ํžˆ๋Š” ์ˆœ๊ฐ„ ๊ธฐ๋ก

๋ฏธ์…˜ ์ค‘ ๊ธฐ๋ก

ํ•„์ˆ˜ ๊ธฐ๋ก:

  • ๊ทœ์น™์„ ์ ์šฉํ•ด์„œ ๋ณ€๊ฒฝํ•œ ์ฝ”๋“œ 1๊ณณ ์ด์ƒ
  • ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์ด ์–ด๋ ค์› ๋˜ ์ฝ”๋“œ 1๊ณณ ์ด์ƒ
  • ๋ง‰ํžŒ ์ˆœ๊ฐ„ 1ํšŒ ์ด์ƒ
  1. ์ ์šฉํ•œ ๊ทœ์น™ : ๋‹ค์ค‘ ์ฑ…์ž„
    ์ฒ˜์Œ ๊ตฌํ˜„ํ•  ๋•Œ, ์šฐ์„  ๊ธฐ๋Šฅ์„ ๋จผ์ € ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์— ์ดˆ์ ์„ ๋‘์—ˆ๋‹ค.
    ๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ Controller์˜ run ๋ฉ”์„œ๋“œ์— ๋ชจ๋“  ๋กœ์ง์„ ์ง‘์ค‘๋˜์—ˆ๋‹ค.
    ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋„๋ฉ”์ธ ์ƒ์„ฑ๊ณผ ์ดˆ๊ธฐ ์„ค์ •์— ๊ด€ํ•œ ๊ธฐ๋Šฅ๋“ค์„ service ์ฝ”๋“œ์— ๋ถ„๋ฆฌํ•˜์˜€๋‹ค.

  2. ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์ด ์–ด๋ ค์› ๋˜ ๊ณณ : ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ Cards์˜ ๊ธธ์ด๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค.

  3. ๋ง‰ํžŒ ์ˆœ๊ฐ„ :

    1. Player์™€ Dealer์˜ ์ค‘๋ณต๋˜๋Š” ํ–‰๋™์ด ์žˆ๋Š”๋ฐ ํด๋ž˜์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ์ง€.
      ๊ณตํ†ต๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ์€ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋ฅผ ๋”ฐ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ vs Player์— ๊ตฌํ˜„ ํ›„ ์ƒ์†๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜๊ธฐ
      โ†’ Player์— ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ ํ›„ Dealer๊ฐ€ ์ด๋ฅผ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์˜€๋‹ค.


    2. Cards๋ฅผ ๊ณต์šฉ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”๋ฐ ์–ด๋””์„œ ๊ด€๋ฆฌํ• ์ง€.
      main์—์„œ ์ƒ์„ฑ ํ›„ service ํ•„๋“œ๋กœ ๋‘๊ธฐ vs service ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ƒ์„ฑํ•˜๊ธฐ
      โ†’ ํ•„๋“œ๋กœ ๋‘์ง€ ์•Š๊ณ  Service ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ƒ์„ฑํ•ด์„œ Controller๋กœ ๋„˜๊ฒจ์ฃผ์—ˆ๋‹ค.


    3. ์–ด๋–ค ๊ฒƒ์„ ํ…Œ์ŠคํŠธ ํ•ด์•ผํ•˜์ง€?
      shuffle์„ ํ•˜๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ฒ€์ฆํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ,
      ์นด๋“œ ์‚ฌ์ด์ฆˆ ๋น„๊ต๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜์—ˆ๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜์˜€๋‹ค.
      ์˜ˆ์‹œ. 1) ์นด๋“œ ์ƒ์„ฑ ํ›„ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์นด๋“œ 52์žฅ์ด ์ƒ์„ฑ 2) ํ”Œ๋ ˆ์ด์–ด์™€ ๋”œ๋Ÿฌ๊ฐ€ ์ดˆ๊ธฐ์— 2์žฅ์”ฉ ๋‚˜๋ˆ ๋ฐ›์•˜๋Š”์ง€

๋ฏธ์…˜ ์™„๋ฃŒ ์กฐ๊ฑด

  • ์š”๊ตฌ์‚ฌํ•ญ ๊ตฌํ˜„
  • ๊ทœ์น™์— ์˜ํ•œ ์ฝ”๋“œ ๋ณ€๊ฒฝ 1ํšŒ ์ด์ƒ
  • ๋ฏธ์…˜ ์ค‘ ๊ธฐ๋ก ์ž‘์„ฑ

๊ธฐ๋ก

  1. ๋‹ค์ค‘ ์ฑ…์ž„ ๊ทœ์น™
    ์ฒ˜์Œ์— controller์—์„œ ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ๋ชจ์—ฌ์žˆ์–ด์„œ ๊ธฐ๋Šฅ ๋ณ„๋กœ ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ค์› ๋‹ค

๊ณ ๋ฏผํ–ˆ๋˜ ์ 

  1. controller์—์„œ ์ž…์ถœ๋ ฅ ๊ธฐ๋Šฅ ๋ฉ”์„œ๋“œ๋ฅผ private์œผ๋กœ ํ•ด์•ผํ•˜๋Š”์ง€
  2. InputView, OutputView ์œ ํ‹ธ ํด๋ž˜์Šค ์•„๋‹ˆ๋ฉด, ์ธ์Šคํ„ด์Šค ํด๋ž˜์Šค๋กœ?

์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ˜์˜ ์‚ฌํ•ญ (260311 ์ถ”๊ฐ€)

  • BlackjackService์—์„œ cards๋ฅผ shuffleํ•˜๋Š” ์ฑ…์ž„ ๋ถ„๋ฆฌ
    โ†’ ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ, ์™ธ๋ถ€์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฃผ์ž…ํ•˜๊ฒŒ๋” ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•ด
    ํ…Œ์ŠคํŠธ ์‹œ ShuffledCardsGenerator๋ฅผ FakeShuffledCardsGenerator๋กœ ๋Œ€์ฒดํ•ด์„œ
    shuffle ๊ฐ’์„ ์กฐ์ž‘๊ฐ€๋Šฅํ•˜๋„๋ก ํ•จ.
  • Dealer์˜ ์ด๋ฆ„ ์ƒ์ˆ˜์— ๋Œ€ํ•œ ์ฑ…์ž„์„ Controller์—์„œ Dealer ํด๋ž˜์Šค๋กœ ๋ณ€๊ฒฝ
  • List๋Œ€์‹  Players๋ผ๋Š” ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ ์‚ฌ์šฉ
  • ํ…Œ์ŠคํŠธ์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ getCardCount() ์‚ญ์ œ
  • ํ‚ค์™€ ๊ฐ’์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ๋•Œ๋Š” entrySet() ์‚ฌ์šฉ
  • ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” import ์ œ๊ฑฐ

์งˆ๋ฌธ

  1. ์ƒ์ˆ˜ํ™”
    Dealer ํด๋ž˜์Šค์— ๋‘” ์•„๋ž˜์˜ ์ƒ์ˆ˜์˜ ๊ฒฝ์šฐ outputView์—์„œ Dealer.ADDITIONAL_THRESHOLD๋ผ๊ณ  ์‚ฌ์šฉํ•ด๋„ ๋ ๊นŒ์š”?
    ์บก์Аํ™”์˜ ๊ด€์ ์œผ๋กœ Dealer ๋‚ด๋ถ€๋กœ ์˜ฎ๊ธด๊ฑด๋ฐ outputView์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ์˜๋„๋Œ€๋กœ ์ž‘๋™ํ•œ๊ฒŒ ๋งž๋‚˜ ์‹ถ์–ด์„œ์š”.
    ์ฑ…์ž„๋งŒ Dealer์—๊ฒŒ ํ• ๋‹นํ•˜๊ณ , ์‚ฌ์šฉ์€ ์–ด์ฒ˜ํ”ผ ์ƒ์ˆ˜์—ฌ์„œ OutputView์—์„œ ์‚ฌ์šฉํ•ด๋„ ์ƒ๊ด€์—†์„๊นŒ์š”?
public static final int ADDITIONAL_THRESHOLD = 16;
  1. ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ
    shuffle์€ ๋žœ๋ค ์ถ”์ถœ์ฒ˜๋Ÿผ ํ†ต์ œํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’์ด๋ผ,
    ์ด ๊ฐ’์„ ํ…Œ์ŠคํŠธ์—์„œ ํŽธํ•˜๊ฒŒ ์กฐ์ž‘ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด CardsGenerator๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
    ๋•๋ถ„์—, FakeShuffledCardsGenerator๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ ์‹œ ์ œ๊ฐ€ ์ง์ ‘ ์ˆœ์„œ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
    ํ†ต์ œํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’์„ ํ…Œ์ŠคํŠธ ํ• ๋•Œ, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฃผ๋กœ ํ•˜๋‚˜์š”? ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋„ ์žˆ๋‚˜์š”?
    ์ถ”๊ฐ€๋กœ, ์ง€๊ธˆ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ด๋ฅผ ์ด์šฉํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ž˜ ๊ตฌํ˜„๋˜์–ด์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!
    (์ฐธ๊ณ  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ : BlackjackServiceTest์˜ ์…”ํ”Œ_์นด๋“œ_์ˆœ์„œ๋Œ€๋กœ_๋ฐฐ๋ถ€_์ •์ƒ_ํ…Œ์ŠคํŠธ())

  2. ๋” ์ถ”๊ฐ€ํ•ด์•ผํ•  ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์„์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

ParkJiYeoung8297 and others added 30 commits March 5, 2026 10:32
Copy link

@jurlring jurlring left a comment

Choose a reason for hiding this comment

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

์•„ํ‹ฐ ์•ˆ๋…•ํ•˜์„ธ์š”! ๋ธ”๋ž™์žญ ๋ฆฌ๋ทฐ๋ฅผ ๋งก๊ฒŒ๋œ ์ฃผ๋””์ž…๋‹ˆ๋‹ค ๐Ÿฐ ๋ฐ˜๊ฐ€์›Œ์š”!

์•„ํ‹ฐ์˜ ์ƒ๊ฐ์ด ๊ถ๊ธˆํ•œ ๋ถ€๋ถ„๊ณผ ์ˆ˜์ •ํ•˜๋ฉด ์ข‹์„ ๋ถ€๋ถ„์„ ์ฝ”๋ฉ˜ํŠธ๋กœ ๋‚จ๊ฒจ๋‘์—ˆ์–ด์š”.
์‹œ๊ฐ„ ๊ดœ์ฐฎ์œผ์‹ค ๋•Œ ํ™•์ธํ•ด์ฃผ์„ธ์š”~
๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ ๋ฏธ์…˜์—์„œ ํ•™์Šตํ•˜๊ณ  ์‹ถ์œผ์‹ ๊ฒŒ ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ด์š”.
ํ•™์Šตํ•ด์•ผํ•  ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€, ๋‚ด๊ฐ€ ๋ถ€์กฑํ•œ๊ฒŒ ๋ญ”์ง€ ์ธ์ง€ํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด๋„ˆ๋ฌด ์ค‘์š”ํ•˜๊ฑฐ๋“ ์š”!
๋ฏธ์…˜์ด ๋๋‚˜๊ณ  ์ œ๊ฐ€ ํ™•์ธํ• ๊ฒŒ์š”!

import java.util.List;
import java.util.function.Supplier;

public class BlackjackController {
Copy link

Choose a reason for hiding this comment

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

controller๊ฐ€ ํ•„์š”ํ• ๊นŒ์š”?

Copy link
Author

Choose a reason for hiding this comment

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

controller๊ฐ€ ์•Œ๋งž์€ ๋กœ์ง์„ ํ˜ธ์ถœํ•˜๋Š” ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!๐Ÿ™‚

์ž…์ถœ๋ ฅ ๊ด€๋ จํ•ด์„œ๋Š” InputView์™€ OutputView๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์ ์ ˆํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ๊ฒฝ์šฐ ์ฃผ๋กœ Service๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
๋ฌผ๋ก  ์ง€๊ธˆ์€ Service๊ฐ€ ํ•˜๋‚˜ ๋ฐ–์— ์—†์ง€๋งŒ, ์ถ”ํ›„ Service๊ฐ€ ๋Š˜์–ด๋‚  ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•ด์„œ๋„ ๋ถ„๋ฆฌํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!
์ง€๊ธˆ๋„ ์ž…์ถœ๋ ฅ๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ค‘ ์–ด๋А ๋กœ์ง์„ ํ˜ธ์ถœํ• ์ง€ ์•ˆ๋‚ดํ•ด์ฃผ๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ฐ™์€ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”.

์งˆ๋ฌธ์„ ์ฃผ์…”์„œ ์ƒ๊ฐํ•ด๋ดค๋Š”๋ฐ Controller๊ฐ€ ์—†๋‹ค๋ฉด ์–ด๋–ค ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌ์„ฑํ•ด์•ผํ•˜๋Š”์ง€ ๊ฐ์ด ์ž˜ ์•ˆ์˜ค๋„ค์š”.๐Ÿฅฒ
ํ˜น์‹œ Controller๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‚˜์š”?

Choose a reason for hiding this comment

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

MVC ํŒจํ„ด์„ ๊ณ ๋ คํ•ด์„œ Controller๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์‹  ๊ฑธ๊นŒ์š”?

ํŒจํ„ด์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋น„์Šทํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ฒช์œผ๋ฉด์„œ, ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๋Š” ๊ฒฝํ—˜์ด ์Œ“์—ฌ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์š”. ๊ทธ๋ž˜์„œ ๊ตฌ์กฐ๊ฐ€ ์–ด๋А ์ •๋„ ์ •ํ˜•ํ™”๋˜์–ด ์žˆ์–ด ์ฝ”๋“œ๋ฅผ ์ฝ์„ ๋•Œ ์ „์ฒด์ ์ธ ๊ตฌ์กฐ๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์‰ฝ๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค๋Š” ์žฅ์ ๋„ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

๊ทธ๋ž˜์„œ ์ด๋ฒˆ ๊ตฌํ˜„์—์„œ ์™œ MVC ํŒจํ„ด์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์…จ๋Š”์ง€ ๊ถ๊ธˆํ•ด์„œ ์งˆ๋ฌธ๋“œ๋ ธ์Šต๋‹ˆ๋‹ค ๐Ÿ™‚

๋‹ค๋งŒ Controller๋ผ๋Š” ํ˜•ํƒœ๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์–‘ํ•  ๊ฒƒ ๊ฐ™์•„์š”.
ํŒจํ„ด์€ ์—ฌ๋Ÿฌ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ๊ณ ์ˆ˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ํ•จ๊ป˜ ๋ง์”€๋“œ๋ฆฌ๊ณ  ์‹ถ์—ˆ์–ด์š”~!

Copy link
Author

Choose a reason for hiding this comment

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

์ถ”ํ›„์˜ ์›น๊ฐœ๋ฐœ๋กœ ๊ฐ€๋ฉด controller-service-domain ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—,
์ˆœ์ˆ˜ ์ž๋ฐ”์—์„œ๋„ ๊ทธ ๊ณ„์ธต๋ณ„ ์—ญํ• ์„ ๋šœ๋ ทํ•˜๊ฒŒ ์ดํ•ดํ•ด๋ณด๊ณ  ์‹ถ์–ด์„œ controller-domain ๊ณ„์ธต์œผ๋กœ ์ฝ”๋“œ ์ž‘์„ฑ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.
์‹œ์ž‘ํ•  ๋•Œ๋Š” service๊ฐ€ ๊ตณ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๊ฑฐ ๊ฐ™์•„์š”.

๊ทผ๋ฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋‹ค๋ณด๋‹ˆ controller์—์„œ ๊ฐ์ฒด ์ƒ์„ฑ์ด๋‚˜ dto ์ƒ์„ฑ๊นŒ์ง€ ์„ž์—ฌ๋ฒ„๋ฆฌ๋ฉด ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ๊ณ  ํด๋ž˜์Šค๊ฐ€ ๋ฌด๊ฑฐ์›Œ์ ธ์„œ
service์—๊ฒŒ ์ด๋Ÿฐ ์ค‘๊ฐ„ ์—ญํ• ์˜ ์ฑ…์ž„์„ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ดํด 2๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋„๋ฉ”์ธ ๊ตฌ์กฐ๋ฅผ ๋‹ค์‹œ ์žฌ๊ตฌ์„ฑํ–ˆ๋Š”๋ฐ, ๊ทธ ๊ฒฐ๊ณผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฑ…์ž„์ด ๋‚˜๋ˆ ์ง„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

InputView : ์ž…๋ ฅ ์ฑ…์ž„
OutputView: ์ถœ๋ ฅ ์ฑ…์ž„
Controller: ์ž…๋ ฅ, ์ถœ๋ ฅ, service์ค‘ ์–ด๋Š” ๊ฒƒ์„ ํ˜ธ์ถœํ• ์ง€ ๊ฒฐ์ •
Service: ๋„๋ฉ”์ธ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ dto๋ฅผ ์ƒ์„ฑ
Domain: ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋“ค

์ฃผ๋”” ํ”ผ๋“œ๋ฐฑ์ฒ˜๋Ÿผ controller๊ฐ€ ๊ผญ ํ•„์š”ํ•œ ๊ณผ์ œ๋Š” ์•„๋‹ˆ์˜€์–ด์„œ, ๋˜ ๋‹ค๋ฅธ ๋ฐฉ์‹์˜ ๊ตฌํ˜„๋„ ์ถ”๊ฐ€๋กœ ์ฐพ์•„๋ณด๋Š”๊ฒŒ ์ข‹์„ ๊ฑฐ ๊ฐ™๋„ค์š”.
์ข€ ๋” ์ฐพ์•„๋ณด๊ณ  ๊ณต๋ถ€ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!โ˜บ๏ธ

import java.util.ArrayList;
import java.util.List;

public final class CardGenerator {
Copy link

Choose a reason for hiding this comment

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

CardGenerator ํด๋ž˜์Šค์— final์— ๋ถ™์ด์‹  ์ด์œ ๊ฐ€ ๊ถ๊ธˆํ•ด์š” :)

ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ, ํ•„๋“œ์— ๊ฐ๊ฐ final์„ ๋ถ™์ผ ๋•Œ ์–ด๋–ค ์˜๋ฏธ์ผ๊นŒ์š”~?
๊ทธ๋ฆฌ๊ณ  final์ด ์™œ ์กด์žฌํ•˜๋Š”์ง€ ์•„ํ‹ฐ์˜ ์ƒ๊ฐ๋„ ๊ถ๊ธˆํ•ด์š” :)

Copy link
Author

Choose a reason for hiding this comment

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

์œ ํ‹ธ ํด๋ž˜์Šค์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ƒ์†์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ final์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
์œ ํ‹ธ ํด๋ž˜์Šค๋Š” ๋‚ด๋ถ€์— static ๋ฉ”์„œ๋“œ๋“ค๋งŒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ƒ์†์ด ํ•„์š”์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

final์˜ ์˜๋ฏธ

์ž๋ฐ” docs ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ final์˜ ์˜๋ฏธ์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

Oracle java docs
image

  1. ํด๋ž˜์Šค final
    ํด๋ž˜์Šค ์ž์ฒด์˜ ์ƒ์†์„ ๋ง‰๋Š”๋‹ค.
    ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

  2. ๋ฉ”์„œ๋“œ final
    ์ƒ์†๋ฐ›์€ ํด๋ž˜์Šค์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•˜์ง€ ์•Š๊ฒŒ ๋ง‰๋Š”๋‹ค.
    ์ƒ์„ฑ์ž ๋ฉ”์„œ๋“œ์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ final๋กœ ์ •์˜ํ•˜์—ฌ, ์žฌ์ •์˜๋˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š”๋‹ค.

  3. ํ•„๋“œ final
    ํ•„๋“œ์˜ ์ƒํƒœ๊ฐ€ ๋ถˆ๋ณ€ํ•˜๋„๋ก ๋ง‰๋Š”๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด, final์€ ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ์บก์Аํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์™ธ๋ถ€์—์„œ ์ด ๊ฐ์ฒด์˜ ํƒ€์ž…์— ๋Œ€ํ•œ ์กฐ์ž‘์„ ํ•  ์ˆ˜ ์—†์–ด์„œ, ์•ˆ์ •์ ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Comment on lines +16 to +17
Cards cards = CardGenerator.generate();
cards.shuffle();
Copy link

Choose a reason for hiding this comment

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

CardGenerator.generate๋กœ Cards๊ฐ€ ๋‚˜์˜จ๋‹ค๋ฉด CardsGenerator๊ฐ€ ๋” ๋งž๋Š” ์˜๋ฏธ ์•„๋‹๊นŒ์š”~?

๋˜ํ•œ BlackjackService๊ฐ€ cards๋ฅผ shuffleํ•˜๋Š” ์ฑ…์ž„๊นŒ์ง€ ๊ฐ€์ ธ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๋Š”์ง€ ๊ถ๊ธˆํ•ด์š” :)

Copy link
Author

Choose a reason for hiding this comment

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

ํ”ผ๋“œ๋ฐฑ ์ฃผ์‹  ๋Œ€๋กœ CardsGenerator๊ฐ€ ๋” ์ ์ ˆํ•  ๊ฒƒ ๊ฐ™๋„ค์š”. โ˜บ๏ธ

BlackjackService๊ฐ€ cards๋ฅผ shuffleํ•˜๋Š” ๋ถ€๋ถ„๋„ ํŽ˜์–ด๋ž‘ ๋…ผ์˜ํ–ˆ๋˜ ๋ถ€๋ถ„์ธ๋ฐ์š”
์ €๋Š” shuffle์„ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋Š” ํŽ˜์–ด์—๊ฒŒ ์ œ๋Œ€๋กœ ์„ค๋ช…ํ•˜์ง€ ๋ชปํ•ด์„œ,
์šฐ์„ ์€ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ๋ชฉํ‘œ๋กœ Service์— ์ž‘์„ฑ ํ›„ ๋ฆฌํŒฉํ† ๋งํ•˜๊ธฐ๋กœ ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ”ผ๋“œ๋ฐฑ ์ฃผ์‹  ๋•๋ถ„์— ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ณ ๋ฏผํ•˜๊ณ  ๊ฒฐ๋ก ์„ ๋‚ด๋ ค๋ดค์Šต๋‹ˆ๋‹ค!
์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด Service์™€ shuffle์— ๋Œ€ํ•œ ์˜์กด์„ฑ์ด ๋‚ฎ์•„์ง€๊ณ , ์™ธ๋ถ€์—์„œ shuffle ๊ฐ’์„ mocking ํ•ด์„œ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ์–ด ํ…Œ์ŠคํŠธ์— ์šฉ์ดํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ˆ˜์ •ํ•œ๋‹ค๋ฉด ์™ธ๋ถ€์—์„œ ์˜์กด์„ฑ ์ฃผ์ž…์œผ๋กœ shuffle์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋„ฃ์–ด์ค„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Choose a reason for hiding this comment

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

์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ
shuffle์€ ๋žœ๋ค ์ถ”์ถœ์ฒ˜๋Ÿผ ํ†ต์ œํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’์ด๋ผ,
์ด ๊ฐ’์„ ํ…Œ์ŠคํŠธ์—์„œ ํŽธํ•˜๊ฒŒ ์กฐ์ž‘ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด CardsGenerator๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋•๋ถ„์—, FakeShuffledCardsGenerator๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ ์‹œ ์ œ๊ฐ€ ์ง์ ‘ ์ˆœ์„œ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
ํ†ต์ œํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’์„ ํ…Œ์ŠคํŠธ ํ• ๋•Œ, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฃผ๋กœ ํ•˜๋‚˜์š”? ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋„ ์žˆ๋‚˜์š”?
(์ฐธ๊ณ  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ : BlackjackServiceTest์˜ ์…”ํ”Œ_์นด๋“œ_์ˆœ์„œ๋Œ€๋กœ_๋ฐฐ๋ถ€_์ •์ƒ_ํ…Œ์ŠคํŠธ())

๋„ค ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’์„ ํ…Œ์ŠคํŠธํ• ๋•Œ๋Š” mockingํ•˜๊ฑฐ๋‚˜, ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค :)

์ถ”๊ฐ€๋กœ, ์ง€๊ธˆ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ด๋ฅผ ์ด์šฉํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ž˜ ๊ตฌํ˜„๋˜์–ด์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!

FakeShuffledCardsGenerator์—์„œ ๊ณ ์ •๋œ cards๋งŒ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋กœ ๋ณด์ด๋Š”๋ฐ, FakeShuffledCardsGenerator์— ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ฒŒ ํ•˜๊ณ , ์ƒ์„ฑํ• ๋•Œ๋งˆ๋‹ค ๋„ฃ์–ด์ฃผ๊ณ  generateShuffledCards์—์„œ ์‘๋‹ตํ•˜๊ฒŒ ํ•ด๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”~

Copy link
Author

Choose a reason for hiding this comment

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

์ƒํƒœ๋ฅผ ๊ฐ–๊ฒŒํ•˜๋ฉด ํ…Œ์ŠคํŠธ๋งˆ๋‹ค ๋‹ค๋ฅธ ์นด๋“œ๋กœ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ์–ด์„œ, ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹๊ฒ ๋„ค์š”!
๋ฐ˜์˜ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿ˜

class FakeShuffledCardsGenerator implements CardsGenerator {
    private final List<Card> cards;

    public FakeShuffledCardsGenerator(List<Card> cards) {
        this.cards = cards;
    }

    public Cards generate() {
        return new Cards(cards);
    }
}

Comment on lines +107 to +109
if (retry >= MAX_RETRY) {
throw new IllegalStateException("์ž…๋ ฅ ํšŸ์ˆ˜๋ฅผ ์ดˆ๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค.");
}
Copy link

Choose a reason for hiding this comment

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

์ž…๋ ฅ ํšŸ์ˆ˜์— ๋Œ€ํ•œ ์ œํ•œ์„ ๋‘๊ณ  ์ด ํšŸ์ˆ˜๋ฅผ ๋„˜์–ด๊ฐ€๋ฉด ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋˜๋„๋ก ๊ตฌํ˜„ํ•ด์ฃผ์…จ๊ตฐ์š”!
์‚ฌ์šฉ์ž์˜ ๋‹จ์ˆœ ์‹ค์ˆ˜๋กœ ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋˜์–ด ์‚ฌ์šฉ์ž์˜ ๋ถˆํŽธํ•จ์„ ๊ฐœ์„ ํ•œ ๋ถ€๋ถ„์ด๋ผ๊ณ  ๋ณด์ด๋„ค์š”! ๋ฉ‹์ ธ์š”! ๐Ÿ’ฏ
(๋ฐ˜์˜ํ•˜์ง€ ์•Š์•„๋„ ๋จ) ๋‹ค๋งŒ ์„œ๋น„์Šค ๊ฐœ๋ฐœ์ž๋กœ์„œ ๊ณ ๋ฏผํ•ด๋ณด๋ฉด ์ข‹์„ ํฌ์ธํŠธ๋Š” ๋ช‡ ํšŒ๊นŒ์ง€ ์žฌ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ~? ์— ๋Œ€ํ•œ ๋ถ€๋ถ„์ด์—์š”. ๋งŽ๋‹ค๊ณ  ์ข‹์ง€๋„ ์•Š๊ณ  ์ ๋‹ค๊ณ  ์ข‹์ง€๋„ ์•Š์ง€์š”!

Copy link
Author

Choose a reason for hiding this comment

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

๋ณดํ†ต ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” 5ํšŒ, 10ํšŒ ๊ธฐ์ค€์œผ๋กœ ๋งŽ์ด ์„ค์ •ํ•˜๋Š”๋ฐ
๊ฒŒ์ž„์ด๊ธฐ ๋•Œ๋ฌธ์— 5ํšŒ๋ณด๋‹ค๋Š” 10ํšŒ๊ฐ€ ์ ์ ˆํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค!

Comment on lines +5 to +6
import java.util.ArrayList;
import java.util.List;
Copy link

Choose a reason for hiding this comment

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

์—ฌ๊ธฐ ๋ฟ๋งŒ์•„๋‹ˆ๋ผ, ์ „์ฒด์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” import๊ฐ€ ์žˆ์–ด์š”.
์Šต๊ด€์ ์œผ๋กœ IDE์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” Code Reformat๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ข‹์•„์š” :)

public class Player {
private static final int ACE_ADDITIONAL_SCORE = 10;
private static final int ACE_ADDITION_NONE_SCORE = 0;
protected final List<Card> cards = new ArrayList<>();
Copy link

Choose a reason for hiding this comment

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

Cards๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ์‹  ์ด์œ ๊ฐ€ ์žˆ๋‚˜์š”?

Copy link
Author

@ParkJiYeoung8297 ParkJiYeoung8297 Mar 9, 2026

Choose a reason for hiding this comment

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

Player๊ฐ€ ์ถ”๊ฐ€๋กœ ์นด๋“œ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์ธ Cards๋ณด๋‹ค๋Š” List๊ฐ€ ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค!

Choose a reason for hiding this comment

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

ํ—‰ ๊ทธ๋Ÿผ ์ผ๊ธ‰์ปฌ๋ ‰์…˜์„ ๋งŒ๋“  ์˜๋ฏธ๊ฐ€ ์—†์ง€ ์•Š์„๊นŒ์š”!?
Cards์—๋„ ์นด๋“œ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฐ›๊ฒŒํ•˜๋ฉด ์•ˆ๋˜๋‚˜์š”?

Copy link
Author

Choose a reason for hiding this comment

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

Cards๋ฅผ ์ „์ฒด ์นด๋“œ ๋ฌถ์Œ์ด๋ผ ์ƒ๊ฐํ•ด์„œ Player์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ, ์ „์ฒด ์นด๋“œ ๋ฌถ์Œ๊ณผ ํด๋ ˆ์ด์–ด๊ฐ€ ๊ฐ€์ง„ ์นด๋“œ ๋ฌถ์Œ์€ ํ–‰๋™์˜ ์ฐจ์ด๊ฐ€ ์žˆ์–ด์„œ ๋”ฐ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ๋„ค์š”.

์‚ฌ์ดํด 2์—์„œ Deck(์ „์ฒด ์นด๋“œ)๊ณผ Cards(ํ”Œ๋ ˆ์ด์–ด ์†Œ์œ  ์นด๋“œ)๋กœ ๋ถ„๋ฆฌํ•ด์„œ ๊ตฌํ˜„ํ•˜๊ณ ,
ํ”Œ๋ ˆ์ด์–ด์—์„œ Cards๋ผ๋Š” ์ผ๊ธ‰์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.๐Ÿ™‚

return cards;
}

public int getCardCount() {
Copy link

Choose a reason for hiding this comment

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

ํ…Œ์ŠคํŠธ์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ๋กœ ๋ณด์—ฌ์š”.

Copy link
Author

Choose a reason for hiding this comment

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

์ €๋„ ํ…Œ์ŠคํŠธ๋งŒ์„ ์œ„ํ•ด์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.
๊ฒฐ๋ก ์„ ๋‚ด๋ฆฌ์ง€ ๋ชปํ•œ ์ƒํƒœ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ, ์ถ”๊ฐ€๋กœ ํŒ€์›๋“ค๊ณผ ๋…ผ์˜๋ฅผ ํ•ด๋ณด๊ณ  ๋‚˜๋‹ˆ
ํ…Œ์ŠคํŠธ๋งŒ์„ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๋Š” ์ตœ์†Œํ•œ์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ๋ฉ”์„œ๋“œ ๋ณด๋‹ค๋Š” ์œ„์— getCards ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ cards.size()๋กœ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋ฉด,
getCardCount()๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

import java.util.ArrayList;
import java.util.List;

public class Dealer extends Player {
Copy link

Choose a reason for hiding this comment

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

Dealer๊ฐ€ Player๋ฅผ ์ƒ์†๋ฐ›๋„๋ก ๊ตฌํ˜„ํ•˜์‹  ์ด์œ ๊ฐ€ ์žˆ๋‚˜์š”?
๋”œ๋Ÿฌ์™€ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ is-a ๊ด€๊ณ„๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋Š”์ง€ ๊ถ๊ธˆํ•ด์š” :)

Copy link
Author

Choose a reason for hiding this comment

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

์ด ๋ถ€๋ถ„์€ ํŽ˜์–ด์™€ ๊ณ ๋ฏผํ–ˆ๋˜ ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค!
๋”œ๋Ÿฌ๋„ ์‚ฌ์‹ค ํ”Œ๋ ˆ์ด์–ด๋กœ๋„ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ์–ด์„œ, ๋”œ๋Ÿฌ์™€ ํ”Œ๋ ˆ์ด์–ด์˜ ํ–‰๋™์ด ๊ฒน์นœ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ณธ์ธ์˜ ์นด๋“œ๋ฅผ ์†Œ์œ ํ•œ๋‹ค.
  2. ๋ณธ์ธ ์นด๋“œ์˜ ํ•ฉ์„ ๊ตฌํ•œ๋‹ค.

ํŽ˜์–ด๊ฐ€ ํ–‰๋™์ด ๊ฒน์นœ๋‹ค๋ฉด ์ƒ์†์„ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜์ž๊ณ  ์ œ์•ˆํ•ด์ฃผ์–ด์„œ, ํ•ด๋‹น ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.
์‚ฌ์šฉํ•ด๋ณด๋‹ˆ ์ค‘๋ณต ์ฝ”๋“œ๊ฐ€ ์—†์–ด์ง€๋Š” ์žฅ์ ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ, ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์ด ์ƒ๊ธฐ๊ณ , ํด๋ž˜์Šค์˜ ์บก์Аํ™”๊ฐ€ ๊นจ์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ, ์ƒ์† ๋Œ€์‹  ํ•ด๋‹น ์—ญํ• ๋งŒ ๊ฐ€์ง„ ํด๋ž˜์Šค๋กœ ์•„์— ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

Choose a reason for hiding this comment

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

๋„ค ๋ง์”€์ฃผ์‹ ๋Œ€๋กœ ์ถ”์ƒํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ๊ฒƒ์€ ๊ฒฐํ•ฉ๋„๊ฐ€ ์—„์ฒญ ๋†’์€ ์ž‘์—…์ด์—์š”.
๊ทธ๋ ‡๋‹ค๋ณด๋‹ˆ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด ์ˆ˜์ •์ด ์–ด๋ ต์ง€์š”!

ํ”Œ๋ ˆ์ด์–ด๋Š” ์นด๋“œ๋ฅผ ๊บผ๋‚ด๋Š” ํ–‰์œ„๋ฅผ ํ•˜๋Š”๋ฐ ์ƒ์†๋ฐ›๋Š” ๋”œ๋Ÿฌ๋Š” ๋ถˆํ•„์š”ํ•œ ํ–‰์œ„์ธ๋ฐ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š”๋ฐ์š”
๋”œ๋Ÿฌ๊ฐ€ ๋ถˆํ•„์š”ํ•œ ํ–‰์œ„๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์—ด์–ด๋‘๋Š”๊ฒŒ ๋งž์„๊นŒ์š”?

Copy link
Author

Choose a reason for hiding this comment

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

๋”œ๋Ÿฌ์—๊ฒŒ ๋ถˆํ•„์š”ํ•œ ํ–‰์œ„๋Š” ๋ง‰์•„๋‘๋Š” ๊ฒƒ์ด ์•ˆ์ •์ ์ด๊ฒ ๋„ค์š”. ๐Ÿ™‚
์ƒ์†๋ฐ›๋Š” ๊ฐ์ฒด๋„ ํ•ด๋‹น ํ–‰๋™์„ ํ•  ์ˆ˜ ์—†๊ฒŒ private๋กœ ์ˆ˜์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

Comment on lines +21 to +23
4. if๋ฌธ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. enum์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„ํ•  ๋•Œ switch ์—†์ด ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋ฉด
if๋ฌธ์ด ์ฝ”๋“œ์— ๋งŽ์ด ๋‚˜์˜ค๊ฒŒ ๋˜๋Š” ๊ฒƒ์„ ๊ฒฝํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค. `values()`๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ for๋ฌธ์„ ๋Œ๋ ค ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•ด๊ฒฐํ–ˆ์ง€๋งŒ, ์ด๋•Œ๋„ ๋งค๋„๋Ÿฝ์ง€ ์•Š๊ฒŒ
ํ•ด๊ฒฐ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ๋Š” ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์ด ์žˆ์„์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
Copy link

Choose a reason for hiding this comment

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

์ข‹์€ ๊ณ ๋ฏผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค~! if๋ฅผ ์™„์ „ํžˆ ์—†์• ๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ์ข‹์€ ๋ฐฉํ–ฅ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ƒํ™ฉ์— ๋”ฐ๋ผ ์–ด๋–ค ๋ฐฉ์‹์ด ๋” ์ ์ ˆํ•œ์ง€ ๊ณ ๋ฏผํ•ด ๋ณด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด์š”!

enum์„ ์‚ฌ์šฉํ•  ๋•Œ switch ๋Œ€์‹  if๊ฐ€ ๋งŽ์•„์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋•Œ๋Š” ์กฐ๊ฑด ๋ถ„๊ธฐ ์ž์ฒด๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉํ–ฅ์ด ์žˆ๋Š”์ง€ ๋จผ์ € ๊ณ ๋ฏผํ•ด ๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด enum์— ๊ฐ ์ƒํ™ฉ์— ๋งž๋Š” ํ–‰๋™์ด๋‚˜ ๋กœ์ง์„ ํ•จ๊ป˜ ๋‘์–ด ๋ถ„๊ธฐ๋ฅผ enum ๋‚ด๋ถ€๋กœ ์ด๋™์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•๋„ ํ•˜๋‚˜์˜ ๋ฐฉ์‹์ด ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š” :)

Copy link
Author

Choose a reason for hiding this comment

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

enum ๋‚ด๋ถ€๋กœ ์ด๋™์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ• ๋„ˆ๋ฌด ์ข‹๋„ค์š”!
์ƒ๊ฐํ•ด๋ณด๋‹ˆ ํ”„๋ฆฌ์ฝ”์Šค ๋™์•ˆ์— ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ๋„, enum์œผ๋กœ ๋งŒ๋“  ํ›„์— enum ๊ฐ’์„ ์ˆœํšŒํ•ด์„œ ์กฐ๊ฑด ๋ถ„๊ธฐ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ–ˆ๋˜๊ฒŒ ์ƒ๊ฐ๋‚˜๋„ค์š”. if๊ฐ€ ๋งŽ์•„์ง€๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๊ณ , ์ฝ”๋“œ๋„ ํ›จ์”ฌ ๊น”๋”ํ•ด์งˆ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ํ”ผ๋“œ๋ฐฑ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

Copy link
Author

@ParkJiYeoung8297 ParkJiYeoung8297 left a comment

Choose a reason for hiding this comment

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

ํ”ผ๋“œ๋ฐฑ ์ฃผ์…”์„œ ๋„ˆ๋ฌด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋งŽ์ด ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฆฌ๋ทฐ์—ฌ์„œ ๋„ˆ๋ฌด ๋„์›€๋˜์—ˆ์–ด์š”. โ˜บ๏ธ
๋‚ด์ผ ๋‚˜๋จธ์ง€ ์ปค๋ฉ˜ํŠธ์—๋„ ๋ฆฌ๋ทฐ ๋‹ฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

Comment on lines +3 to +6
public final class GameConstant {
public static final int ADDITIONAL_THRESHOLD = 16;
public static final int GAME_OVER_THRESHOLD_SCORE = 21;
}
Copy link
Author

Choose a reason for hiding this comment

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

์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ƒ์ˆ˜์˜ ๊ฒฝ์šฐ ๋”ฐ๋กœ ๋บ๊ณ , ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ƒ์ˆ˜์˜ ๊ฒฝ์šฐ ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์œ„์น˜ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ธ”๋ž™์žญ์˜ ์กฐ๊ฑด โ†’ 21
  2. ๋”œ๋Ÿฌ๊ฐ€ ์นด๋“œ๋ฅผ ๋” ๋ฐ›๋Š” ์กฐ๊ฑด โ†’ 16

์ง€๊ธˆ ๋ฆฌ๋ทฐ ์ฃผ์‹  ๋‚ด์šฉ์œผ๋กœ ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ, 2๋ฒˆ์˜ ๊ฒฝ์šฐ์—๋Š” ๋”œ๋Ÿฌ์—๊ฒŒ๋งŒ ํ•ด๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋”œ๋Ÿฌ ํด๋ž˜์Šค์— ๋‘๋Š”๊ฒŒ ๋‚˜์„๊ฑฐ ๊ฐ™๋„ค์š”.

import java.util.ArrayList;
import java.util.List;

public class Dealer extends Player {
Copy link
Author

Choose a reason for hiding this comment

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

์ด ๋ถ€๋ถ„์€ ํŽ˜์–ด์™€ ๊ณ ๋ฏผํ–ˆ๋˜ ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค!
๋”œ๋Ÿฌ๋„ ์‚ฌ์‹ค ํ”Œ๋ ˆ์ด์–ด๋กœ๋„ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ์–ด์„œ, ๋”œ๋Ÿฌ์™€ ํ”Œ๋ ˆ์ด์–ด์˜ ํ–‰๋™์ด ๊ฒน์นœ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ณธ์ธ์˜ ์นด๋“œ๋ฅผ ์†Œ์œ ํ•œ๋‹ค.
  2. ๋ณธ์ธ ์นด๋“œ์˜ ํ•ฉ์„ ๊ตฌํ•œ๋‹ค.

ํŽ˜์–ด๊ฐ€ ํ–‰๋™์ด ๊ฒน์นœ๋‹ค๋ฉด ์ƒ์†์„ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜์ž๊ณ  ์ œ์•ˆํ•ด์ฃผ์–ด์„œ, ํ•ด๋‹น ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.
์‚ฌ์šฉํ•ด๋ณด๋‹ˆ ์ค‘๋ณต ์ฝ”๋“œ๊ฐ€ ์—†์–ด์ง€๋Š” ์žฅ์ ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ, ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์ด ์ƒ๊ธฐ๊ณ , ํด๋ž˜์Šค์˜ ์บก์Аํ™”๊ฐ€ ๊นจ์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ, ์ƒ์† ๋Œ€์‹  ํ•ด๋‹น ์—ญํ• ๋งŒ ๊ฐ€์ง„ ํด๋ž˜์Šค๋กœ ์•„์— ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

public class Player {
private static final int ACE_ADDITIONAL_SCORE = 10;
private static final int ACE_ADDITION_NONE_SCORE = 0;
protected final List<Card> cards = new ArrayList<>();
Copy link
Author

@ParkJiYeoung8297 ParkJiYeoung8297 Mar 9, 2026

Choose a reason for hiding this comment

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

Player๊ฐ€ ์ถ”๊ฐ€๋กœ ์นด๋“œ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์ธ Cards๋ณด๋‹ค๋Š” List๊ฐ€ ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค!

}

private int calculateAceScore() {
if (!isAceExist() || calculateScore() > 11) {
Copy link
Author

Choose a reason for hiding this comment

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

11๋„ ์ƒ์ˆ˜๋กœ ๋‘๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!
์ˆซ์ž๋‚˜ ๋ฌธ์ž์™€ ๊ฐ™์ด ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ฑฐ๋‚˜ ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’์„ ์ƒ์ˆ˜๋กœ ๋งŒ๋“ค๋ฉด,
๊ด€๋ฆฌํ•˜๊ธฐ๋„ ์ˆ˜์›”ํ•˜๊ณ  ํ…Œ์ŠคํŠธ์—์„œ๋„ ๋™์ผํ•œ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

return cards;
}

public int getCardCount() {
Copy link
Author

Choose a reason for hiding this comment

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

์ €๋„ ํ…Œ์ŠคํŠธ๋งŒ์„ ์œ„ํ•ด์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.
๊ฒฐ๋ก ์„ ๋‚ด๋ฆฌ์ง€ ๋ชปํ•œ ์ƒํƒœ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ, ์ถ”๊ฐ€๋กœ ํŒ€์›๋“ค๊ณผ ๋…ผ์˜๋ฅผ ํ•ด๋ณด๊ณ  ๋‚˜๋‹ˆ
ํ…Œ์ŠคํŠธ๋งŒ์„ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๋Š” ์ตœ์†Œํ•œ์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ๋ฉ”์„œ๋“œ ๋ณด๋‹ค๋Š” ์œ„์— getCards ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ cards.size()๋กœ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋ฉด,
getCardCount()๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

Comment on lines +16 to +17
Cards cards = CardGenerator.generate();
cards.shuffle();
Copy link
Author

Choose a reason for hiding this comment

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

ํ”ผ๋“œ๋ฐฑ ์ฃผ์‹  ๋Œ€๋กœ CardsGenerator๊ฐ€ ๋” ์ ์ ˆํ•  ๊ฒƒ ๊ฐ™๋„ค์š”. โ˜บ๏ธ

BlackjackService๊ฐ€ cards๋ฅผ shuffleํ•˜๋Š” ๋ถ€๋ถ„๋„ ํŽ˜์–ด๋ž‘ ๋…ผ์˜ํ–ˆ๋˜ ๋ถ€๋ถ„์ธ๋ฐ์š”
์ €๋Š” shuffle์„ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋Š” ํŽ˜์–ด์—๊ฒŒ ์ œ๋Œ€๋กœ ์„ค๋ช…ํ•˜์ง€ ๋ชปํ•ด์„œ,
์šฐ์„ ์€ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ๋ชฉํ‘œ๋กœ Service์— ์ž‘์„ฑ ํ›„ ๋ฆฌํŒฉํ† ๋งํ•˜๊ธฐ๋กœ ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ”ผ๋“œ๋ฐฑ ์ฃผ์‹  ๋•๋ถ„์— ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ณ ๋ฏผํ•˜๊ณ  ๊ฒฐ๋ก ์„ ๋‚ด๋ ค๋ดค์Šต๋‹ˆ๋‹ค!
์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด Service์™€ shuffle์— ๋Œ€ํ•œ ์˜์กด์„ฑ์ด ๋‚ฎ์•„์ง€๊ณ , ์™ธ๋ถ€์—์„œ shuffle ๊ฐ’์„ mocking ํ•ด์„œ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ์–ด ํ…Œ์ŠคํŠธ์— ์šฉ์ดํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ˆ˜์ •ํ•œ๋‹ค๋ฉด ์™ธ๋ถ€์—์„œ ์˜์กด์„ฑ ์ฃผ์ž…์œผ๋กœ shuffle์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋„ฃ์–ด์ค„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import java.util.Map;

public class BlackjackResult {
private final Map<String, MatchCase> playerWinningMap = new HashMap<>();
Copy link
Author

Choose a reason for hiding this comment

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

์ œ๊ฐ€ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ํ™•์‹คํ•˜์ง€ ์•Š์•„์„œ ์ฐพ์•„๋ดค๋Š”๋ฐ, ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์™”์Šต๋‹ˆ๋‹ค.

์ผ๊ธ‰ ์ปฌ๋ ‰์…˜(First Class Collection)์€ ์ปฌ๋ ‰์…˜(List, Set, Map ๋“ฑ)์„ Wrappingํ•˜๋ฉด์„œ,
ํ•ด๋‹น ์ปฌ๋ ‰์…˜ ์ด์™ธ์˜ ๋‹ค๋ฅธ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š” ํด๋ž˜์Šค๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์šฐ์„  ์ฝ”๋ฉ˜ํŠธ ๋‹ฌ์•„์ฃผ์‹  ํ•ด๋‹น ํด๋ž˜์Šค๋Š” ๋ฐ‘์— ๋‹ค๋ฅธ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ €์™€ ํŽ˜์–ด๊ฐ€ ์ด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๋•Œ๋„ ๋‹จ์ˆœ ์ง‘๊ฒŒ์šฉ์ด๋‚˜ ๊ฒฐ๊ณผ ์ €์žฅ์šฉ์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋˜ ๊ฒƒ ๊ฐ™์•„์š”.

์งˆ๋ฌธ ์ฃผ์…จ๋˜ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์„ ์™œ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค!

  1. ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ ๋ณด์žฅ (๋˜๋Š” ์บก์Аํ™”)
  2. ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค์ ์ธ ๊ฒ€์ฆ๊ณผ ํ–‰๋™์„ ๋ฌถ์–ด์„œ ํด๋ž˜์Šค ๊ตฌ์„ฑ ๊ฐ€๋Šฅ (์‘์ง‘์„ฑ์„ ๋”์šฑ ํ–ฅ์ƒ์‹œ์ผœ์คŒ)

์šฐ์„  ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋‚ด๋ถ€์—์„œ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œ ๋“ฑ์„ private์œผ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด
์™ธ๋ถ€์—์„œ๋Š” ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•ด์ค€๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์กฐ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋”๋”์šฑ ์บก์Аํ™”์— ์šฉ์ดํ•ด์ง‘๋‹ˆ๋‹ค.

List ์™€ ๊ฐ™์ด ์นด๋“œ ํ•˜๋‚˜๊ฐ€ ์•„๋‹Œ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๊ฒ€์ฆ์ด๋‚˜ ํ–‰๋™์„ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ,
์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด์„œ ๋‚ด๋ถ€์— ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์‘์ง‘์„ฑ์žˆ๊ฒŒ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ”ผ๋“œ๋ฐฑ ์ฃผ์‹  ๋•๋ถ„์— ์ž˜ ๋ชฐ๋ž๋˜ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•ด ์กฐ๊ธˆ์ด๋‚˜๋งˆ ์•Œ๊ฒŒ๋œ ๊ฒƒ ๊ฐ™์•„์š”. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
ํ˜น์‹œ ๋‹ค๋ฅด๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ๋ฆฌ๋ทฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. โ˜บ๏ธ

Comment on lines +21 to +23
4. if๋ฌธ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. enum์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„ํ•  ๋•Œ switch ์—†์ด ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋ฉด
if๋ฌธ์ด ์ฝ”๋“œ์— ๋งŽ์ด ๋‚˜์˜ค๊ฒŒ ๋˜๋Š” ๊ฒƒ์„ ๊ฒฝํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค. `values()`๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ for๋ฌธ์„ ๋Œ๋ ค ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•ด๊ฒฐํ–ˆ์ง€๋งŒ, ์ด๋•Œ๋„ ๋งค๋„๋Ÿฝ์ง€ ์•Š๊ฒŒ
ํ•ด๊ฒฐ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ๋Š” ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์ด ์žˆ์„์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
Copy link
Author

Choose a reason for hiding this comment

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

enum ๋‚ด๋ถ€๋กœ ์ด๋™์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ• ๋„ˆ๋ฌด ์ข‹๋„ค์š”!
์ƒ๊ฐํ•ด๋ณด๋‹ˆ ํ”„๋ฆฌ์ฝ”์Šค ๋™์•ˆ์— ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ๋„, enum์œผ๋กœ ๋งŒ๋“  ํ›„์— enum ๊ฐ’์„ ์ˆœํšŒํ•ด์„œ ์กฐ๊ฑด ๋ถ„๊ธฐ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ–ˆ๋˜๊ฒŒ ์ƒ๊ฐ๋‚˜๋„ค์š”. if๊ฐ€ ๋งŽ์•„์ง€๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๊ณ , ์ฝ”๋“œ๋„ ํ›จ์”ฌ ๊น”๋”ํ•ด์งˆ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ํ”ผ๋“œ๋ฐฑ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

public static void displayMatchResult(BlackjackResultDto resultDto) {
System.out.printf("## ์ตœ์ข… ์ŠนํŒจ\n๋”œ๋Ÿฌ: %d์Šน %dํŒจ\n", resultDto.winCount(), resultDto.loseCount());
Map<String, MatchCase> resultMap = resultDto.matchResultMap();
for (String playerName : resultMap.keySet()) {
Copy link
Author

Choose a reason for hiding this comment

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

entrySet()์„ ์‚ฌ์šฉํ•˜๋ฉด ํ‚ค์™€ ๊ฐ’์„ ๋™์‹œ์— ๊ฐ–๊ณ  ์˜ฌ ์ˆ˜ ์žˆ๊ตฐ์š”! ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

return input.equals("y");
}

private String readInput(List<Validator> validators) {
Copy link
Author

Choose a reason for hiding this comment

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

์ž…๋ ฅ๊ฐ’ ๊ฒ€์‚ฌ์—์„œ ๊ฒ€์ฆ์„ ์—ฌ๋Ÿฌ ๊ฐœ ํ• ์ˆ˜๋„ ์žˆ์–ด์„œ, ์ข€ ๋” ์ž์œ ๋กญ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Validator๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ตฌํ˜„ํ•ด์•ผ, Validator ๋ฌถ์Œ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์š”

String input = readInput(List.of(
        Validator::validateNotBlank,
        Validator::validateChoice
));

Consumer๋ฅผ ์ด์šฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ,
"List<Validator> validators"๊ฐ€ "List<Consumer> validators"์™€ ๊ฐ™์ด ๋” ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ธฐ๋„ ํ•˜๊ณ ,
๊ฒ€์ฆ์ด๋ผ๋Š” ์˜๋ฏธ์˜ Validator๋ฅผ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€๋ฒผ์šด ๊ฒ€์ฆ์˜ ๊ฒฝ์šฐ ๋ง์”€ํ•ด์ฃผ์‹  ๋Œ€๋กœ static ๊ฒ€์ฆ ์ฝ”๋“œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! ๐Ÿ˜„

@ParkJiYeoung8297
Copy link
Author

์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ˜์˜ ์‚ฌํ•ญ

  • BlackjackService์—์„œ cards๋ฅผ shuffleํ•˜๋Š” ์ฑ…์ž„ ๋ถ„๋ฆฌ
    โ†’ ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ, ์™ธ๋ถ€์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฃผ์ž…ํ•˜๊ฒŒ๋” ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•ด
    ํ…Œ์ŠคํŠธ ์‹œ ShuffledCardsGenerator๋ฅผ FakeShuffledCardsGenerator๋กœ ๋Œ€์ฒดํ•ด์„œ
    shuffle ๊ฐ’์„ ์กฐ์ž‘๊ฐ€๋Šฅํ•˜๋„๋ก ํ•จ.
  • Dealer์˜ ์ด๋ฆ„ ์ƒ์ˆ˜์— ๋Œ€ํ•œ ์ฑ…์ž„์„ Controller์—์„œ Dealer ํด๋ž˜์Šค๋กœ ๋ณ€๊ฒฝ
  • List๋Œ€์‹  Players๋ผ๋Š” ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ ์‚ฌ์šฉ
  • ํ…Œ์ŠคํŠธ์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ getCardCount() ์‚ญ์ œ
  • ํ‚ค์™€ ๊ฐ’์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ๋•Œ๋Š” entrySet() ์‚ฌ์šฉ
  • ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” import ์ œ๊ฑฐ

์งˆ๋ฌธ

  1. ์ƒ์ˆ˜ํ™”
    Dealer ํด๋ž˜์Šค์— ๋‘” ์•„๋ž˜์˜ ์ƒ์ˆ˜์˜ ๊ฒฝ์šฐ outputView์—์„œ Dealer.ADDITIONAL_THRESHOLD๋ผ๊ณ  ์‚ฌ์šฉํ•ด๋„ ๋ ๊นŒ์š”?
    ์บก์Аํ™”์˜ ๊ด€์ ์œผ๋กœ Dealer ๋‚ด๋ถ€๋กœ ์˜ฎ๊ธด๊ฑด๋ฐ outputView์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ์˜๋„๋Œ€๋กœ ์ž‘๋™ํ•œ๊ฒŒ ๋งž๋‚˜ ์‹ถ์–ด์„œ์š”.
    ์ฑ…์ž„๋งŒ Dealer์—๊ฒŒ ํ• ๋‹นํ•˜๊ณ , ์‚ฌ์šฉ์€ ์–ด์ฒ˜ํ”ผ ์ƒ์ˆ˜์—ฌ์„œ OutputView์—์„œ ์‚ฌ์šฉํ•ด๋„ ์ƒ๊ด€์—†์„๊นŒ์š”?
public static final int ADDITIONAL_THRESHOLD = 16;
  1. ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ
    shuffle์€ ๋žœ๋ค ์ถ”์ถœ์ฒ˜๋Ÿผ ํ†ต์ œํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’์ด๋ผ,
    ์ด ๊ฐ’์„ ํ…Œ์ŠคํŠธ์—์„œ ํŽธํ•˜๊ฒŒ ์กฐ์ž‘ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด CardsGenerator๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
    ๋•๋ถ„์—, FakeShuffledCardsGenerator๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ ์‹œ ์ œ๊ฐ€ ์ง์ ‘ ์ˆœ์„œ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
    ํ†ต์ œํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’์„ ํ…Œ์ŠคํŠธ ํ• ๋•Œ, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฃผ๋กœ ํ•˜๋‚˜์š”? ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋„ ์žˆ๋‚˜์š”?
    ์ถ”๊ฐ€๋กœ, ์ง€๊ธˆ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ด๋ฅผ ์ด์šฉํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ž˜ ๊ตฌํ˜„๋˜์–ด์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!
    (์ฐธ๊ณ  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ : BlackjackServiceTest์˜ ์…”ํ”Œ_์นด๋“œ_์ˆœ์„œ๋Œ€๋กœ_๋ฐฐ๋ถ€_์ •์ƒ_ํ…Œ์ŠคํŠธ())

  2. ๋” ์ถ”๊ฐ€ํ•ด์•ผํ•  ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์„์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

@ParkJiYeoung8297
Copy link
Author

์•ˆ๋…•ํ•˜์„ธ์š” ์ฃผ๋””.
ํ”ผ๋“œ๋ฐฑ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ƒ๊ฐํ•ด๋ณผ ์งˆ๋ฌธ๋“ค์ด ๋งŽ์•„์„œ ๋„ˆ๋ฌด ๋„์›€๋˜์—ˆ์–ด์š”. ๐Ÿ˜

์ปค๋ฉ˜ํŠธ์— ๋‚จ๊ฒจ์ฃผ์‹  ์งˆ๋ฌธ์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ ๋ฏธ์…˜์—์„œ ํ•™์Šตํ•˜๊ณ  ์‹ถ์œผ์‹ ๊ฒŒ ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ด์š”.
ํ•™์Šตํ•ด์•ผํ•  ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€, ๋‚ด๊ฐ€ ๋ถ€์กฑํ•œ๊ฒŒ ๋ญ”์ง€ ์ธ์ง€ํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด๋„ˆ๋ฌด ์ค‘์š”ํ•˜๊ฑฐ๋“ ์š”!

์ด๋ฒˆ ๋ฏธ์…˜์—์„œ๋Š” ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด์„œ ๊ฐ•์กฐํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„์„œ, ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด ์ง‘์ค‘ํ•ด๋ณด๊ณ  ์‹ถ์–ด์š”.
๊ทธ๋ž˜์„œ ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜ ์‹œ์—๋„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ shuffle์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ”ํžˆ ๋งํ•˜๋Š” mock ๋ฐฉ์‹์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ์ด๋Ÿฐ ๋ฐฉ์‹์ธ์ง€๋Š” ์กฐ๊ธˆ ๋” ๊ณต๋ถ€ํ•ด๋ด์•ผํ•  ๊ฒƒ ๊ฐ™์•„์š”. ๐Ÿ˜…

์‚ฌ์ดํด 2๊นŒ์ง€ ํ•˜๋ฉด์„œ ์•„๋ž˜์˜ ์งˆ๋ฌธ์— ์ €์˜ ๋‚˜๋ฆ„๋Œ€๋กœ ๋‹ต์„ ๋‚ด๋ ค๋ณด๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค!

  1. ํ…Œ์ŠคํŠธํ•ด์•ผํ•˜๋Š” ๋ฉ”์„œ๋“œ์ธ์ง€ ํŒ๋‹จํ•˜๋Š” ๊ธฐ์ค€
  2. private, shuffle ๋“ฑ ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ค์šธ ๋•Œ, ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์ฒด ๋ฐฉ๋ฒ•

Copy link

@jurlring jurlring left a comment

Choose a reason for hiding this comment

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

์•„ํ‹ฐ ์•ˆ๋…•ํ•˜์„ธ์š”!
์ˆ˜์ •ํ•  ๋ถ€๋ถ„๊ณผ ์—ฌ์ญค๋ณด๊ณ  ์‹ถ์€ ๋ถ€๋ถ„ ์ฝ”๋ฉ˜ํŠธ๋กœ ๋‚จ๊ฒจ๋‘์—ˆ์Šต๋‹ˆ๋‹ค~!
๋‹ค์Œ ์‚ฌ์ดํด์—์„œ ๋ฐ˜์˜์ฃผ์„ธ์š” :)


import java.util.Objects;

public class Card {

Choose a reason for hiding this comment

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

record์— ๋Œ€ํ•ด์„œ ์•„์‹œ๋‚˜์š”~? ํ•™์Šตํ•ด๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š” :)

Copy link
Author

Choose a reason for hiding this comment

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

์ €๋Š” Card๋ฅผ ๋„๋ฉ”์ธ ๋ชจ๋ธ๋กœ ์ƒ๊ฐํ•˜๊ณ  record๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ,
๋‹ค์‹œ๋ณด๋‹ˆ ๋„๋ฉ”์ธ ๋ชจ๋ธ ๋‚ด์—์„œ VO์™€ ๊ฐ™์€ ์„ฑ๊ฒฉ์„ ๋„๊ณ  ์žˆ๋„ค์š”.
์ง€๊ธˆ๊นŒ์ง€ record๋Š” Dto์—์„œ๋งŒ ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ, VO์—์„œ๋„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค! โ˜บ๏ธ

[Record ์ •๋ฆฌ]

  1. ๋ชจ๋“  ํ•„๋“œ๊ฐ€ private final๋กœ ์„ ์–ธ๋˜์–ด ๋ถˆ๋ณ€ ๊ฐ์ฒด์ด๋‹ค. (setter ์ œ๊ณต X)
  2. equals(), hashcode()๋“ฑ์„ ์ž๋™์„ ๋งŒ๋“ค์–ด์ค˜์„œ ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค.
  3. Dto, Vo ๋“ฑ์—์„œ ๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ๋•Œ, ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

import java.util.List;
import java.util.function.Supplier;

public class BlackjackController {

Choose a reason for hiding this comment

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

MVC ํŒจํ„ด์„ ๊ณ ๋ คํ•ด์„œ Controller๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์‹  ๊ฑธ๊นŒ์š”?

ํŒจํ„ด์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋น„์Šทํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ฒช์œผ๋ฉด์„œ, ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๋Š” ๊ฒฝํ—˜์ด ์Œ“์—ฌ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์š”. ๊ทธ๋ž˜์„œ ๊ตฌ์กฐ๊ฐ€ ์–ด๋А ์ •๋„ ์ •ํ˜•ํ™”๋˜์–ด ์žˆ์–ด ์ฝ”๋“œ๋ฅผ ์ฝ์„ ๋•Œ ์ „์ฒด์ ์ธ ๊ตฌ์กฐ๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์‰ฝ๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค๋Š” ์žฅ์ ๋„ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

๊ทธ๋ž˜์„œ ์ด๋ฒˆ ๊ตฌํ˜„์—์„œ ์™œ MVC ํŒจํ„ด์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์…จ๋Š”์ง€ ๊ถ๊ธˆํ•ด์„œ ์งˆ๋ฌธ๋“œ๋ ธ์Šต๋‹ˆ๋‹ค ๐Ÿ™‚

๋‹ค๋งŒ Controller๋ผ๋Š” ํ˜•ํƒœ๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์–‘ํ•  ๊ฒƒ ๊ฐ™์•„์š”.
ํŒจํ„ด์€ ์—ฌ๋Ÿฌ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ๊ณ ์ˆ˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ํ•จ๊ป˜ ๋ง์”€๋“œ๋ฆฌ๊ณ  ์‹ถ์—ˆ์–ด์š”~!

Comment on lines +16 to +17
Cards cards = CardGenerator.generate();
cards.shuffle();

Choose a reason for hiding this comment

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

์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ
shuffle์€ ๋žœ๋ค ์ถ”์ถœ์ฒ˜๋Ÿผ ํ†ต์ œํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’์ด๋ผ,
์ด ๊ฐ’์„ ํ…Œ์ŠคํŠธ์—์„œ ํŽธํ•˜๊ฒŒ ์กฐ์ž‘ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด CardsGenerator๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋•๋ถ„์—, FakeShuffledCardsGenerator๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ ์‹œ ์ œ๊ฐ€ ์ง์ ‘ ์ˆœ์„œ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
ํ†ต์ œํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’์„ ํ…Œ์ŠคํŠธ ํ• ๋•Œ, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฃผ๋กœ ํ•˜๋‚˜์š”? ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋„ ์žˆ๋‚˜์š”?
(์ฐธ๊ณ  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ : BlackjackServiceTest์˜ ์…”ํ”Œ_์นด๋“œ_์ˆœ์„œ๋Œ€๋กœ_๋ฐฐ๋ถ€_์ •์ƒ_ํ…Œ์ŠคํŠธ())

๋„ค ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’์„ ํ…Œ์ŠคํŠธํ• ๋•Œ๋Š” mockingํ•˜๊ฑฐ๋‚˜, ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค :)

์ถ”๊ฐ€๋กœ, ์ง€๊ธˆ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ด๋ฅผ ์ด์šฉํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ž˜ ๊ตฌํ˜„๋˜์–ด์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!

FakeShuffledCardsGenerator์—์„œ ๊ณ ์ •๋œ cards๋งŒ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋กœ ๋ณด์ด๋Š”๋ฐ, FakeShuffledCardsGenerator์— ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ฒŒ ํ•˜๊ณ , ์ƒ์„ฑํ• ๋•Œ๋งˆ๋‹ค ๋„ฃ์–ด์ฃผ๊ณ  generateShuffledCards์—์„œ ์‘๋‹ตํ•˜๊ฒŒ ํ•ด๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”~

2. SOLID ์ธก๋ฉด์—์„œ ๊ฐœ์„ ํ•  ์‚ฌํ•ญ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
ํŠนํžˆ SRP ๋ฉด์—์„œ, ํ•˜๋‚˜์˜ ์ฑ…์ž„์œผ๋กœ ๋ฉ”์„œ๋“œ๊ฐ€ ์ž˜ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋Š”์ง€ ํ”ผ๋“œ๋ฐฑ ๋ฐ›๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

3. inputView์™€ OutputView๋ฅผ ์œ ํ‹ธ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„์ง€, ์ธ์Šคํ„ด์Šค๋กœ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

Choose a reason for hiding this comment

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

์„œ๋น„์Šค๋‚˜ ๋„๋ฉ”์ธ์—์„œ ์ธ์Šคํ„ด์Šค ๊ฐ์ฒด๋กœ ๋‘๋ฉด ๊ฒฐ๊ตญ ๋™์ผํ• ๊ฑฐ๋ผ ๊ณ„์ธต๊ฐ„์˜ ๋ถ„๋ฆฌ๊ฐ€ ๋” ๋ช…ํ™•ํ•˜๋‹ค๋Š” ์ดํ•ด๋ฅผ ๋ชปํ–ˆ์–ด์š”!
๋‘ ๋ฐฉ๋ฒ•์ค‘์— ์ •๋‹ต์€ ์—†์ง€๋งŒ ๊ณ„์ธต๋งˆ๋‹ค ๊ตฌํ˜„์„ ํ†ต์ผํ•˜๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค :)

์•ž์œผ๋กœ ์–ด๋–ค ๊ณ„์ธต์ด๋“  ์ ์  ๋„“์–ด์งˆํ…๋ฐ, ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์ด ์ œ๊ฐ๊ฐ์ด๋ฉด ๊ฐœ๋ฐœํ•  ๋•Œ๋„ ์–ด๋–ค ๋ฐฉ๋ฒ•์„ ๋”ฐ๋ผ์•ผํ• ์ง€ ๊ณ ๋ฏผ๋˜๊ณ  ์ฝ์„๋•Œ๋„ ์ข€ ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”~~
์ •๋‹ต์ด ์—†๋Š” ๋ฌธ์ œ๋“ค์€ ์ปจ๋ฒค์…˜์„ ์žก๊ณ  ํ†ต์ผํ•˜๋Š”๊ฒŒ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”!

Comment on lines +13 to +14
- private์ธ ๋ฉ”์„œ๋“œ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด์„œ, ์ตœ์ข… ๊ฒฐ๊ณผ dto๋ฅผ ๋น„๊ตํ•ด์„œ ๊ฐ„์ ‘์ ์œผ๋กœ private ๋ฉ”์„œ๋“œ๋ฅผ ๊ฒ€์ฆํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ•˜๋‚˜๋งŒ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ private ๋ฉ”์„œ๋“œ๋ฅผ ๊ฑฐ์นœ ๊ฒฐ๊ณผ์ธ๋ฐ, ์ตœ์ข… dto๋กœ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ์‹์ด ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๊ฒ€์ฆํ–ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

Choose a reason for hiding this comment

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

๊ฐ์ฒด์˜ ๊ผญ ํ•ด์•ผํ•˜๋Š” ํ–‰์œ„๋ฅผ public์œผ๋กœ ๋‘๊ณ , ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ๋ฉ”์„œ๋“œ ๋ถ„๋ฆฌ ํ•˜๋Š” ๊ฒƒ์ด ๋‚˜์„ ๋•Œ private๋กœ ๋ถ„๋ฆฌํ•˜๊ณ ์žˆ์–ด์š” :)

public class Player {
private static final int ACE_ADDITIONAL_SCORE = 10;
private static final int ACE_ADDITION_NONE_SCORE = 0;
protected final List<Card> cards = new ArrayList<>();

Choose a reason for hiding this comment

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

ํ—‰ ๊ทธ๋Ÿผ ์ผ๊ธ‰์ปฌ๋ ‰์…˜์„ ๋งŒ๋“  ์˜๋ฏธ๊ฐ€ ์—†์ง€ ์•Š์„๊นŒ์š”!?
Cards์—๋„ ์นด๋“œ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฐ›๊ฒŒํ•˜๋ฉด ์•ˆ๋˜๋‚˜์š”?

import java.util.ArrayList;
import java.util.List;

public class Dealer extends Player {

Choose a reason for hiding this comment

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

๋„ค ๋ง์”€์ฃผ์‹ ๋Œ€๋กœ ์ถ”์ƒํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ๊ฒƒ์€ ๊ฒฐํ•ฉ๋„๊ฐ€ ์—„์ฒญ ๋†’์€ ์ž‘์—…์ด์—์š”.
๊ทธ๋ ‡๋‹ค๋ณด๋‹ˆ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด ์ˆ˜์ •์ด ์–ด๋ ต์ง€์š”!

ํ”Œ๋ ˆ์ด์–ด๋Š” ์นด๋“œ๋ฅผ ๊บผ๋‚ด๋Š” ํ–‰์œ„๋ฅผ ํ•˜๋Š”๋ฐ ์ƒ์†๋ฐ›๋Š” ๋”œ๋Ÿฌ๋Š” ๋ถˆํ•„์š”ํ•œ ํ–‰์œ„์ธ๋ฐ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š”๋ฐ์š”
๋”œ๋Ÿฌ๊ฐ€ ๋ถˆํ•„์š”ํ•œ ํ–‰์œ„๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์—ด์–ด๋‘๋Š”๊ฒŒ ๋งž์„๊นŒ์š”?

Comment on lines +63 to +65
public CardContentDto toCardContentDto() {
return new CardContentDto(this.name, this.cards);
}

Choose a reason for hiding this comment

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

๋„๋ฉ”์ธ์ด DTO๋ฅผ ์•Œ์•„๋„ ๋ ๊นŒ์š”? ๋„๋ฉ”์ธ๊ณผ DTO์— ๋Œ€ํ•ด์„œ ๊ฐ๊ฐ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋Š”์ง€ ๊ถ๊ธˆํ•ด์š”

Copy link
Author

Choose a reason for hiding this comment

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

ํ”ผ๋“œ๋ฐฑ ์ฃผ์…”์„œ ํ•œ๋ฒˆ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ, ๋„๋ฉ”์ธ์—์„œ DTO๋ฅผ ๋ชจ๋ฅด๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

DTO๋Š” ์ „์†ก ๊ฐ์ฒด์ด๋ฉฐ, ๋ณ€๊ฒฝ์ด ๋นˆ๋ฒˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (ex. ๊ณ ๊ฐ์˜ ์š”์ฒญ์œผ๋กœ ์นด๋“œ ๊ทธ๋ฆผ ๊ฐ’๋„ ์ถ”๊ฐ€๋กœ ๋ณด๋‚ด์ค˜์•ผํ•œ๋‹ค๋ฉด, dto๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค.)
๊ทธ์— ๋ฐ˜ํ•ด, ๋„๋ฉ”์ธ์€ ์ตœ๋Œ€ํ•œ ์บก์Аํ™”๋˜์–ด์žˆ๊ณ , ๋ณ€๊ฒฝ์— ์˜ํ–ฅ์ด ์ ์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
dto๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค, ๋„๋ฉ”์ธ์„ ์ˆ˜์ •ํ•ด์ค˜์•ผํ•œ๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”.

๋„๋ฉ”์ธ์—์„œ๋Š” ๊ฐ’์„ ๋„˜๊ฒจ์ฃผ๊ณ , ์„œ๋น„์Šค์—์„œ dto๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•ด ์ฃผ๋””๋Š” ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!

}

private int calculateAceScore() {
if (!isAceExist() || calculateScore() > 11) {

Choose a reason for hiding this comment

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

๋ฐ˜์˜์ด ๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์•„์š” ๐Ÿ˜ฟ

return action.get();
} catch (IllegalArgumentException e) {
retry++;
System.out.println(e.getMessage());

Choose a reason for hiding this comment

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

์ถœ๋ ฅ๊ณผ ๊ด€๋ จ๋œ ํ–‰์œ„๋ฅผ controller ๊ฐ€ ํ•˜๊ณ  ์žˆ๋„ค์š” ๐Ÿ˜ฟ

Copy link
Author

Choose a reason for hiding this comment

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

OutputView์˜ ์ฑ…์ž„์ธ๋ฐ, Controller๊ฐ€ ํ•˜๊ณ  ์žˆ๋„ค์š”.๐Ÿ˜… ์ˆ˜์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants