[๐ ์ฌ์ดํด1 - ๋ฏธ์ (๋ธ๋์ญ ๊ฒ์ ์คํ)] ๋ผํฐ ๋ฏธ์ ์ ์ถํฉ๋๋ค.#1018
[๐ ์ฌ์ดํด1 - ๋ฏธ์
(๋ธ๋์ญ ๊ฒ์ ์คํ)] ๋ผํฐ ๋ฏธ์
์ ์ถํฉ๋๋ค.#1018kdongsu5509 wants to merge 52 commits intowoowacourse:kdongsu5509from
Conversation
๋๋ฌ์ ํ๋ ์ด์ด๋ฅผ ์ถ๊ฐํ์๊ณ , ๊ทธ๋ค์ ๊ณตํต ์กฐ์์ธ ์ฐธ๊ฐ์๋ฅผ ์ถ๊ฐํจ. ์ดํ ์นด๋์ ์นด๋๋ค์ ๊ด๋ฆฌํ๋ ๋ฑ์ ์ ์๋ฅผ ์ถ๊ฐํจ.
- ์ ๊ท ๋ฑ ์ ๊ณต ๊ธฐ๋ฅ ํ ์คํธ - ์นด๋ ๋ฝ๊ธฐ ๊ธฐ๋ฅ ํ ์คํธ ์ถ๊ฐ(์ ์, ์คํจ)
- ์๋ก์ด ๋ฑ ์ ๊ณต ๊ธฐ๋ฅ - ์นด๋ ์ ํ ๊ธฐ๋ฅ ์ ์ถ๊ฐํ์์ต๋๋ค.
Ace ๊ฐ ํ์ ๊ณผ ์ ์ฒด ์นด๋ ์ ์ ํฉ ๊ธฐ๋ฅ์ ์ํธ ์์กด์ฑ์ ๋๊ธฐ ๋๋ฌธ์ Ace๋ ์ ์ธํ ์นด๋ ์ ์ ํฉ์ ๊ณ์ฐํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํจ.
- add card score total sum feature - add bust discrimination feature
๋๋ฌ ์์ฑ ์ ํ์ํ ํ๋ผ๋ฏธํฐ Deck์ ์ธ์คํด์ค ์ข ๋ฅ๋ฅผ ๋ช ์ํจ
๊ณตํต ๋ก์ง์ ์ ๊ฑฐํ๊ธฐ ์ํด participant ์ถ๊ฐ
๋๋ฌ๋ง์ ๊ณ ์ ํ ์นด๋ ์ถ๊ฐ ๋ก์ง์ ์ํด ๋ณ๋์ ๋ฉ์๋๊ฐ ์ ์ธ๋์ด ์์ต๋๋ค. ์ฐจํ ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ addCard ๋ฉ์๋ ํธ์ถ ์ ํ์ฌ ์ค๊ณ์์ผ๋ก๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ UnsupportedOperationException์ ๋์ง๋ ๊ฒ์ผ๋ก override ํด๋์์ต๋๋ค
๊ธฐ์กด ๋ณ์ deck์ ๋ชจํธ์ฑ์ ์ ๊ฑฐํ๊ธฐ ์ํด ๋ณ๊ฒฝ
๋๋ฌ์ ํ๋ ์ด์ด์ ์นด๋ ์ถ๊ฐ ๋ฉ์๋๋ฅผ ๋จ์ผํํ์ฌ ์ฐจํ Participant ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋๋ก ๋ณ๊ฒฝ
- ํด๋์ค ๋ด๋ถ์์ ํ๋ ๋ฉค๋ฒ๋ก List ์ฌ์ฉํ๋ ๊ฒ์ ์ค์ด๊ธฐ ์ํด - ์ถํ ์ฐธ๊ฐ์๋ค์ ์ ์ฒด ์ ๋ณด๋ฅผ ์์์ผ๋ง ๊ณ์ฐํ ์ ์๋ ๋ด์ฉ๋ค์ ๋ค๋ฃฐ ํด๋์ค๊ฐ ํ์ํด์
BufferedReader ์ฌ์ฉ ์ IOException ๊ด๋ จ ๋ฌธ์ ๊ฐ ์กด์ฌ. ํด๋น ๋ฌธ์ ๋ฅผ ํธ๋ค๋ง ํ๋ ๊ฒ ๋ณด๋ค ์๋๊ฐ ๋ค์ ๋๋ฆฌ๋๋ผ๋ Scanner ์ ์ด์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํธ๋ค๋ง ํ์ง ์๊ฒ ๋๋ ๊ฒ์ด ๋ ์ข๋ค๊ณ ํ๋จํ์ฌ ๋ณ๊ฒฝํจ
ํ ์คํธ ๋ก์ง ์์ฑ์ ์ฉ์ด์ฑ์ ์ํด mockito ์ถ๊ฐ
- ๋ถ๋ชจ ํด๋์ค(Participants)๊ฐ ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ตฌ์กฐ์ ๋ชจ์์ ํด๊ฒฐํ๊ธฐ ์ํด ํด๋น ๊ณตํต ํด๋์ค ์ ๊ฑฐ - ๋ค์์ ํ๋ ์ด์ด๋ฅผ ๊ด๋ฆฌํ๋ ์ผ๊ธ ์ปฌ๋ ์ Players ํด๋์ค ์ ๊ท ์ถ๊ฐ - Game ๋๋ฉ์ธ์ด Dealer์ Players๋ฅผ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ธ ํ๋๋ก ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํ๋๋ก ๊ฐ์ฒด ๊ตฌ์กฐ ๊ฐ์ - ๋๋ฉ์ธ ๊ตฌ์กฐ ๋ณ๊ฒฝ์ ๋ฐ๋ผ Dealer์ getCards() ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๊ณ , OutputView ์ถ๋ ฅ ๋ก์ง ์์
๊ฐ๋ ์ฑ์ ์ํด ๋ฉ์๋ ๋ถ๋ฆฌ๋ฅผ ์งํํจ
This reverts commit 2fb6f4b.
This reverts commit 2fb6f4b.
echo724
left a comment
There was a problem hiding this comment.
์๋
ํ์ธ์ ๋ผํฐ! ๋ฐ๊ฐ์ต๋๋ค! ์ฒซ ๋ฐฑ์๋ ๋ฏธ์
ํ๋ค์ง ์์๋์? ใ
ใ
,, ์๋ฌด๋๋ ํ์ด์ ํจ๊ป ์ค๊ณํ๊ณ ์ฝ๋๋ฅผ ์์ฑํ๋๊ฒ ์ฝ์ง ์์์ํ
๋ฐ, ๊ณ ์ ๋ง์ผ์
จ์ต๋๋ค.
ํผ๋๋ฐฑ ๋จ๊ธฐ๊ธด ํ๋๋ฐ, ์ด๋ฒ ๋ฏธ์
์์๋ ์ค๋ณต ์ด๋ฆ ๋ฒ๊ทธ ์์ฃผ๋ก ๊ณ ์ณ์ฃผ์๊ณ , ๋๋จธ์ง๋ ์ปค๋ฉํธ๋ก ๋จ๊ฒจ์ฃผ์ธ์! ์๋๋ ์ง๋ฌธ์ ๋ํ ๋ต์
๋๋ค. ๋น ๋ฅด๊ฒ ๋จ๊ฒจ์ฃผ์๊ณ ์์ฒญ ๋จ๊ฒจ์ฃผ์ธ์~ ํ์ดํ
์
๋๋ค!
์ฃผ์ 1. Delegate ํจํด ๋์
์ ๊ดํ ๊ณ ์ฐฐ
์ด ๋
ผ์์ ์ ๊ฐ ๋ฏธ์
ํ์๋๋ ๋ง์ ํฌ๋ฃจ๋ค ์ฌ์ด์ ์์๋ ๋
ผ์์๋ ๊ธฐ์ญ์ด ์๋ค์ ใ
ใ
,,
์ผ๋จ ๊ทธ๋๋ก ๋ค์ ๋์๊ฐ ์ ์๊ฒ ํด์ค ์ ์๋ ์กฐ์ธ์ด ์๋ค๋ฉด, ํ์ฌ ๋ฏธ์
์ ์ถฉ์คํ๋ผ๋ ๊ฒ ๊ทธ๋ฆฌ๊ณ ์ฉ์ด์ ํจํด ์ ์๋ฅผ ์ ํํ ์๋ผ๋ ๊ฒ์
๋๋ค.
Controller๋ผ๋ ์ฉ์ด๋ ์ด๋์ ๋์์๊น์? ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ MVC ํจํด์ด ๋์์๊น์? ์น ์๋น์ค์์์ Controller๋ ์ด๋ค ์ญํ ์ผ๊น์?
CLI ์๋น์ค์ ์น ์๋น์ค์ ์ฐจ์ด๋ ๋ฌด์์ผ๊น์? MVC์ View๋ ์ด๋ค ์ญํ ์ ํ๋์?
์ ๋ ํน์ ํจํด์ ๋ํ ์ถฉ๋ถํ ์ดํด๊ฐ ์์๋ ๋์
์ฌ๋ถ๋ฅผ ์๊ฐํด๋ณผ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋์ ์ ์
์ฅ์์ Delegate ํจํด์ MVC ํจํด์ ์ต์ง๋ก ๋ง์ถ๋ ค๊ณ ํ๋ค๊ฐ ๋์
๋ ํจํด์ผ๋ก ๋ณด์
๋๋ค.
์ ๋ง Controller๊ฐ ํ์ํ ๊น์? Delegation์ด ํ์ํ ๊น์? Game์ InputView, OutputView๋ฅผ ์ฃผ์
ํด์ ์ฌ์ฉํ๋ฉด ์๋ ๊น์?
์ด๋ฒ ๋ฏธ์
์ UI ๋ก์ง ๋ถ๋ฆฌ ์๊ตฌ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํต์ฌ ๋ก์ง์ ๊ตฌํํ๋ ์ฝ๋์ UI๋ฅผ ๋ด๋นํ๋ ๋ก์ง์ ๊ตฌ๋ถํ๋ค.
- UI ๋ก์ง์ InputView, ResultView์ ๊ฐ์ ํด๋์ค๋ฅผ ์ถ๊ฐํด ๋ถ๋ฆฌํ๋ค.
์ด ๋ฏธ์
์๊ตฌ์ฌํญ์ UI๋ก์ง์ ๋ถ๋ฆฌํ๋ผ์ง, Controller๋ฅผ ๋์
ํด๋ผ๊ฐ ์๋๋๋ค.
์ด ๋ถ๋ถ ๊ตฌ๋ถํ์
์ ์ ์๊ฐํด๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์์!
์ฃผ์ 2. CLI ํ๊ฒฝ์์์ Web ์ํคํ
์ฒ ๊ณ ๋ ค ์ฌ๋ถ
ใ
ใ
,, ์์ ๋ต๋ณ๊ณผ ๋น์ทํ๋ฐ์, ํ์ฌ ๋ฏธ์
์์๋ ๋ฒ์ด๋ ๊ณ ๋ฏผ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๋ฒ ๋ฏธ์
ํต์ฌ ์ฃผ์ ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ํ๋ก๊ทธ๋จ์ ์ด๋ป๊ฒ ๋ง๋๋๊ฐ?์
๋๋ค.
์ด๋ฒ ๋ฏธ์
์์๋ ๊ฐ์ฒด์ ์ฑ
์๊ณผ ๋ถ๋ฆฌ, ํ์
์ค๊ณ์ ์ข ๋ ํ์ตํด๋ณด์๊ณ ์น์ ๊ตฌ์กฐ์ ํจํด์ ์ดํ ๋ ๋ฒจ์์ ์ถฉ๋ถํ ํ์ตํด๋ณด์ธ์!
๊ฒฐ๊ตญ ์ด๋ฒ ๋ฏธ์
์์ ์ด ๋ถ๋ถ์ ์ถฉ๋ถํ ํ์ตํ์ง ์๋๋ค๋ฉด, ์น์ ๋ฐฐ์ฐ๋ฉด์๋ ์ด ๋ถ๋ถ์์ ๋ชจํธํจ์ด ๊ณ์ ๋จ์์์ ์ ์์ต๋๋ค.
์ถ๊ฐ๋ก ์น๋ CLI๋ ๊ฒฐ๊ตญ์๋ ํํ ๋ฐฉ์ view์ ์์ญ์
๋๋ค.
Redis์๋ CLI๋ก ๋์๊ฐ๋ Client ํ๋ก๊ทธ๋จ์ด ์๊ณ Server ํ๋ก๊ทธ๋จ์ด ๋ฐ๋ก ์๋ฏ์ด, ๊ฐ์์ ์ฑ
์๊ณผ ์ญํ ์ ๋ฐ๋ผ ๋ถ๋ฆฌ๋๋ ๊ฑฐ์ฃ .
view์ชฝ ๋จ์ ๊ณ ๋ฏผ์ ๋๋ฌด ํ์ง ๋ง์๊ณ ๊ฒฐ๊ตญ์๋ ํต์ฌ์ ์ผ๋ก ๊ด๋ฆฌํด์ผํ๋ ๋น์ง๋์ค ๋ก์ง์ ๋ฌด์์ธ์ง, ์ด๋ป๊ฒ ๋ถ๋ฆฌํ๊ณ ์ง์ผ๋ผ ์ ์์์ง์ ๊ณ ๋ฏผ์ ์ถฉ๋ถํ ๋ ํด๋ณด์๊ธธ ์ถ์ฒ๋๋ ค์!
์ฃผ์ 3. ์ค๊ณ์ ์ ์ ๋ฒ์
์ ๋ ๊ฐ๋ฐ ๋จ๊ณ์์๋ ์ถฉ๋ถํ ๋ณ๊ฒฝ ๋ ์ ๋ ์๊ณ ๋ณ๊ฒฝ ๋์ด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ณ๊ฒฝ์ด ์ต์ํ ๋์ผํ๋ ํ๋ ๋๋ ํด๋น ํ๋ก๊ทธ๋จ์ด ๋ฐฐํฌ ๋์ด ์ค์ ๋ก ์ฌ์ฉ๋๊ณ ์์ ๋์ด๊ตฌ์.
๋ฐฐํฌ ์ดํ์ ์ถ๊ฐ ์๊ตฌ์ฌํญ์ผ๋ก ๊ธฐ์กด ์ค๊ณ๊ฐ ํฌ๊ฒ ๋ณ๊ฒฝ๋๋ค๋ฉด ์ด๋ ์๋ชป๋ ์ค๊ณ์ผ ๊ฐ๋ฅ์ฑ์ด ์์ฃ .
๊ฐ๋ฐ ๋จ๊ณ์์๋ ์ถฉ๋ถํ ์๊ฐ์ ๋ค์ฌ ๋ณํ์๋ ๋ด์ฑ์ด ์๋, ์ฆ ๊ตฌ์กฐ๊ฐ ํฌ๊ฒ ๋ฐ๋์ง ์์ผ๋ฉด์ ์ถ๊ฐ ์๊ตฌ์ฌํญ์ ์ฒ๋ฆฌํ ์ ์๋ ์ค๊ณ๋ฅผ ํ๋ ๊ฒ์ด ๋ ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ผ์๋ ์๊ฐ์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐ์ด ๋์ ๋ค๋ฉด, ์๋ฌด๋๋ ์ค์ ๊ตฌํ์ ํ๋ฉด์ ์ค๊ณ ๋ ๋์น ์๊ตฌ์ฌํญ์ด๋ ์ ์ฝ๋ค์ด ์์ด์ ๊ทธ๋ฐ ๊ฒ์ผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋์ ์ ๋ ์ฒ ์ ํ ์ฌ์ ์ค๊ณ๋ณด๋ค๋, ์ฒ ์ ํ ์๊ตฌ์ฌํญ ๋ถ์๊ณผ ์ ์ฝ์ ๋์ดํด๋ณด๊ณ ์์ํ์๋ ๊ฒ์ ์ถ์ฒ ๋๋ ค์.
๊ทธ๋ฆฌ๊ณ ํ
์คํธ ์ฝ๋ ์์ ์ ๋ํ ๋ถ๋ถ๋ ์๊ธฐํด์ฃผ์
จ๋๋ฐ, ๊ฒฝํ์ ์์ ๋ถ๋ถ๋ถํฐ ์์ฑํ๋ค๊ฐ ๊ฐ์๊ธฐ ์์ ๋ ์ด์ด์์ ์ค๊ณ ๋ณ๊ฒฝ์ด ์์ ๊ฒฝ์ฐ์ ๋ ๊ทธ๋ด๊บผ๊ฐ์์? ๋ง์๊น์?
๊ทธ๋ฐ ๊ฒฝ์ฐ์๋ out->in ๋ฐฉ์์ผ๋ก ํฐ ๋ถ๋ถ์ TDD๋ก ๊ตฌํํด์ ํ์ ์ก๊ณ , ๋ด๋ถ ๋ถํ๋ค์ ๊ตฌํํด๋ณด๋ ๊ฒ๋ ๋ฐฉ๋ฒ์
๋๋ค. ์ด๋ด ๊ฒฝ์ฐ, ๋ด๋ถ ์ค๊ณ๊ฐ ๋ณ๊ฒฝ ๋๋๋ค๋ ์ ์ฒด๊ฐ ๋ณ๊ฒฝ๋์ง ์์ํ
๋๊น์.
์ฃผ์ 4. ์ปค๋ฐ์ ๋จ์
์๋ฌด๋๋ ์ฌ๋๋ง๋ค ์ฐจ์ด๊ฐ ์์ ์ ์๋ ๋ถ๋ถ์ด์ง๋ง ๊ฐ์ธ์ ์ผ๋ก ๋กค๋ฐฑ(revert)ํ๊ธฐ ์ข์ ๋จ์๋ฅผ ์ ๋ ์ด์์ ์ธ ์ปค๋ฐ ๋จ์๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์๋ฌด๋๋ ๊ธฐ๋ฅ์ 100์ค ์ด์์ด๋ผ๋ฉด ๋ถ๋ช
์ฌ๋ฌ ์ปดํฌ๋ํธ ์์
์ด ๊ฐ์ด ํฌํจ๋์ด์์ ์ ์๊ฒ ์ฃ ?
๋ง์ฝ ๋ค๋ฅธ ๊ธฐ๋ฅ์์๋ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋๋ฐ ํด๋น ์ปดํฌ๋ํธ๊ฐ ๋ฌธ์ ๊ฐ ์์ ๊ฒฝ์ฐ์๋ ๊ทธ๋ฌ๋ฉด ์ ์ฒด ๊ธฐ๋ฅ์ ๋กค๋ฐฑํด์ผํ๋ ์ํฉ์ด ์๊น๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ๋กค๋ฐฑ์ด ์ ๋๋ ์ปค๋ฐ์ ๋ํ ์ต๋ํ ์์ ์ปค๋ฐ์
๋๋ค.
๊ทธ๋์ ์ฝ๋ ๋ฆฌ๋ทฐ, ํ์
์ ์๊ฐํด์ ์ปค๋ฐ ๋จ์๋ฅผ ์ ํ์๋ ๊ฒ ๋ณด๋ค๋ ๋ด๊ฐ ์ด ์ปค๋ฐ์ ์ฝ๊ฒ ๋๋๋ฆด ์ ์์๊น?๋ฅผ ๊ธฐ์ค์ผ๋ก ์๊ฐํด๋ณด์๋ ๊ฒ๋ ์ถ์ฒ๋๋ ค์!
| public Optional<Card> addCard(Deck totalDeck) { | ||
| Card newCard = totalDeck.drawCard(); | ||
| this.deck.addCard(newCard); | ||
| return Optional.of(newCard); |
There was a problem hiding this comment.
newCard๊ฐ Null์ด ๋๋ ๊ฒฝ์ฐ๊ฐ ์๋์? Optional์ ์ ์ฌ์ฉํ์ ๊ฑฐ์ฃ ?
There was a problem hiding this comment.
์ Dealer๊ฐ ์นด๋๋ฅผ ๋ ๋ฐ์ ์ ์์์ง ์์์ง์ ๋ํด ํ๋จ์ ๋ฆฌํด๊ฐ์ผ๋ก ํ๊ณ , ์ด๋ฅผ ์ํด ๋ฆฌํด ํ์ ์ Participant์์ ๋ง์ถฐ์ค ๊ฑฐ๊ตฐ์?
์ฆ, ๋ถ๋ชจ ํ์ ์ธ Participant๊ฐ ์์ ํ์ ์ธ Dealer์ ์นด๋ ๋๋ก์ฐ ๋ก์ง์ ์ํด ๋ฆฌํด ํ์ ์ด ๋ง์ถฐ์ง ๋ถ๋ถ์ด๋ผ๊ณ ๋ณผ ์ ์๊ฒ ์ฃ ? ํ์ฌ Optional๋ก ๊ฐ์ธ์ง ํํ๋ผ ๊ด์ฐฎ๊ธด ํ๋ฐ, ์ด์์ ์ผ๋ก๋ ์์ ํ์ ์ ํ์ ํ์ ๊ตฌํ์ ๋ํด ์๊ณ ์์ผ๋ฉด ์๋ฉ๋๋ค. ์ด๋ ๋ค๋ฅธ ํ์ ํ์ ์ ์์ฑํ ๋, ๋ค๋ฅธ ํ์ ํ์ ์ ๊ตฌํ ๋ํ ์ผ์ ์์์ผํ๊ณ , ์์ ํ์ ์ ๋ก์ง์ด ๋ฐ๋ ๊ฒฝ์ฐ ํ์ ํ์ ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ์ปค์ง๊ธฐ ๋๋ฌธ์ ๋๋ค. ํน์ ์ด๋ป๊ฒ ์๊ฐํ์๋์?
| return new Game(totalDeck, dealer, players); | ||
| } | ||
|
|
||
| public void play(GameDelegate observer) { |
There was a problem hiding this comment.
delegate, observer ๋ ์ฉ์ด๊ฐ ๋์์ ์ฌ์ฉ๋๊ณ ์๋ค์. play ๋ฉ์๋ ์์์ ํน๋ณํ ์๋ฏธ๋ฅผ ๊ฐ์ง ์๋ ์ด์ ํต์ผ ํ์๊ธธ ์ถ์ฒ๋๋ฆฝ๋๋ค.
| Map<Result, Integer> dealerWinLossResults = new HashMap<>(); | ||
| List<Player> playingPlayers = playerWinLossResults.keySet().stream().toList(); | ||
| for (Player player : playingPlayers) { | ||
| Result dealerResult = playerWinLossResults.get(player).reverse(); | ||
| int currentValue = dealerWinLossResults.getOrDefault(dealerResult, 0); | ||
| dealerWinLossResults.put(dealerResult, currentValue + 1); | ||
| } | ||
| return dealerWinLossResults; |
There was a problem hiding this comment.
for (Result playerWinLossResult : playerWinLossResults.values()) {
Result dealerResult = playerWinLossResult.reverse();
int currentValue = dealerWinLossResults.getOrDefault(dealerResult, 0);
dealerWinLossResults.put(dealerResult, currentValue + 1);
}์ด ๋ถ๋ถ, values๋ง ์์ผ๋ฉด ๋์ง ์์๊น์?
| import java.util.regex.Pattern; | ||
|
|
||
| public abstract class Participant { | ||
| private final Deck deck; |
There was a problem hiding this comment.
Participant๊ฐ Deck์ ๊ฐ๊ณ ์๋๊ฒ ์ ๋ ์กฐ๊ธ ์ด์ํด๋ณด์
๋๋ค. ์ด๋ด ๊ฒฝ์ฐ isBurst()์ calculateCardScoreSum() ๊ฐ์ด ํ๋ ์ด์ด ํธ๋์๋ง ํ์ํ ๋ฉ์๋/๋ก์ง ๋ค์ด Deck์ ๋ค์ด๊ฐ๊ณ , ๋ฐ๋๋ก Participant์์๋ ๋ฑ ์์ฑ ๋ก์ง์ด๋ ๋ฑ๊ณผ ๊ด๋ จ๋ ๋ก์ง๋ค์ด ์ ๊ทผ ๊ฐ๋ฅํด์ง์ฃ ? ๊ฐ๋จํ ์๋ก, ๋ง์ฝ 2๋
๋ค์ ์ด๋ค ๊ฐ๋ฐ์๊ฐ Participant์ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ ๋ง๋ ๋ค๊ณ ํ ๋, Participant์ Deck์ด ์๋ ๊ฒ์ ๋ณด๊ณ ์ด๊ฒ ๊ฒ์์ ์ฌ์ฉ๋๋ ๋ชจ๋ ์นด๋์ ๋ฑ์ธ์ง, ์๋๋ฉด 2์ฅ๋ง ์๋ ์นด๋ ๋ฑ์ธ์ง ์ด๋ป๊ฒ ์ ์ ์์๊น์?
There was a problem hiding this comment.
๋ฆฌ๋ทฐ์ด๋์ด ๋จ๊ฒจ์ฃผ์ ๋ฌธ์ ์ํฉ์ ํ์ฌ Deck์ 2๊ฐ์ง ์ญํ ์ด ํผ์ฌํ๊ธฐ ๋๋ฌธ์ ์ถฉ๋ถํ ๋ฐ์ ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ต๋๋ค.
์ฒซ ๋ฒ์งธ ์ญํ ์ ์ ์ฒด ์นด๋๋ฅผ ์์ฑ, ๊ด๋ฆฌํ๋ ์ญํ ์ด๊ณ ๋ ๋ฒ์งธ ์ญํ ์ Player ์ ์ธ์คํด์ค ๋ณ์๋ก ์์ฑ๋์ด ์ฌ์ฉ์๋ค์ ์นด๋๋ฅผ ๊ด๋ฆฌํ๋ ์ญํ ์ด๋ผ๊ณ ํ๋จ์ ํ์์ต๋๋ค.
๋ ๊ฐ์ง ์ญํ ์ ํผ์ฌ๋ก ์ธํ ํผ๋์ธ ๋งํผ ํด๋์ค๋ฅผ ์ญํ ๋จ์๋ก ๋ถ๋ฆฌํ์ฌ์ผ ํ ๊ฒ ๊ฐ์์ ์ธ์งํ์์ต๋๋ค!
| Pattern NAME_PATTERN = Pattern.compile("^[a-zA-Z๊ฐ-ํฃ]+$"); | ||
| validateIsNotBlank(name); | ||
| validateKoreanAndEnglish(name, NAME_PATTERN); |
There was a problem hiding this comment.
์ฌ์ํ ์ ์๊ธด ํ๋ฐ, NAME_PATTERN์ validateKoreanAndEnglish ๋ฐ์ผ๋ก ๋บ ์ด์ ๋ฅผ ์ ์ ์์๊น์? ํด๋น ๋ค์ ํจํด์ ํ๊ตญ์ด์ ์์ด์ธ์ง ๊ฒ์ฌํ๋ ํจํด ์๋๊ฐ์? ๊ทธ๋ฌ๋ฉด validateKoreanAndEnglish ๋ฉ์๋ ๋ด๋ถ์ ์๋๊ฒ ์์ฐ์ค๋ฌ์ ๋ณด์ด๋๋ฐ ์ด๋ป๊ฒ ์๊ฐํ์๋์? ํน์ ์ด ํจํด์ด ์ด ๋ฉ์๋ ์ธ์ ๋ค๋ฅธ ๊ณณ์์๋ ์ฌ์ฉ๋ ์ ์์๊น์?
There was a problem hiding this comment.
NAME_PATTERN ์ ๋ฐ์ผ๋ก ๋นผ๋ธ ํน๋ณํ ์ด์ ๋ ์์ต๋๋ค. Ctrl + Alt + M ์ ์ด์ฉํ ๋ฉ์๋ ์ถ์ถ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ํด๋น ๋ถ๋ถ์ ๊ฐ๊ณผํ์ต๋๋ค.
| return calculateCardScoreSum() > BUST_CRITERIA; | ||
| } | ||
|
|
||
| public int calculateCardScoreSum() { |
There was a problem hiding this comment.
๋ค๋ฅธ ์ปค๋ฉํธ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด ๋ก์ง์ด Deck์ ํ์ํ ๋ก์ง์ผ๊น์? ๊ฒ์ ๋ฑ๊ณผ ์ฐธ์ฌ์ ํธ๋๊ฐ ๋๋ค Card ์ปฌ๋ ์ ์ ํ์๋ก ํ๋ ๊ฒ์ ๋ง์ง๋ง ๋์ ์๋ช ์ฃผ๊ธฐ(LifeCycle)๋ ๋ค๋ฅด๊ณ ์ญํ ๊ณผ ์ฑ ์๋ ๋ค๋ฅด๋ค๊ณ ์๊ฐํฉ๋๋ค
There was a problem hiding this comment.
๋ค๋ฅธ ์ปค๋ฉํธ์์ ์ธ๊ธํ ๋ฐ์ ๊ฐ์ด Deck ์ 2๊ฐ์ง ์ญํ ์ด ์กด์ฌํ๊ฒ ๋๋ฉด์ ๋ฐ์ํ ๋ฌธ์ ๋ผ๊ณ ํ๋จ์ด ๋ฉ๋๋ค. Deck์ ์ญํ ์ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌํ์ฌ์ ํ์ํ ๊ฒฝ์ฐ์๋ง ์์ฑ๋๊ณ , ์ฑ
์๋ ์ค์ด๋ ํํ๋ก ๋ฆฌํฉํ ๋ง ์งํํ๊ฒ ์ต๋๋ค
|
|
||
| public int calculateCardScoreSum() { | ||
| int sumExceptAce = calculateCardScoreSumExceptAce(); | ||
| int sumAce = new AceScoreDiscriminator().calculateAceCardsSum(cards, sumExceptAce); |
There was a problem hiding this comment.
์ด ํด๋์ค์ ๊ฒฝ์ฐ, ๋ด๋ถ ์ํ๊ฐ ์์ด๋ณด์ด๋๋ฐ ์ด๋ ๊ฒ ๊ณ์ฐํ ๋๋ง๋ค ์์ฑํ๋๊ฒ ๋ง์๊น์?
There was a problem hiding this comment.
ํ
์คํธ ์ฝ๋ ์์ฑ์๋ง ์ด์ ์ ๋๊ณ ๊ฐ์ฒด์ ์์ฑ ๋น์ฉ์ ๋ํ ๊ณ ๋ ค๋ฅผ ํ์ง ๋ชปํ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ static ํ ๋ฉ์๋๋ก ๋ณ๊ฒฝํ์ฌ ์ต์ด์ ํ๋ก๊ทธ๋จ์ด jvm ์์์ ๋ก๋ฉ๋ ๋ ํ ๋ฒ๋ง ์์ฑ๋๋ ๊ฒ์ด ์ ์ ํ ๊ฒ ๊ฐ์ต๋๋ค.
| import view.OutputView; | ||
|
|
||
| @ExtendWith(MockitoExtension.class) | ||
| class BlackJackControllerTest { |
There was a problem hiding this comment.
BlackJackControllerTest๋ฅผ ๋ณผ๋, Game run ๊ด๋ จ ๋ก์ง์ ํด๋น Controller ํ ์คํธ๋ก ์ปค๋ฒ๊ฐ ์๋๊ณ ์์ฃ ? ํ ์คํธ๊ฐ ์ด๋ ต๋ค๋ฉด ์ด๋ ๊ทธ ๋ก์ง์ด ํด๋น ๊ฐ์ฒด์ ์ญํ ์ ๋ง์ง ์์ ์ ๋ ์๋ค๋ ์๋ฏธ์ผ ๊ฒ ๊ฐ์ต๋๋ค.
| return new Players(createPlayers(playerNames, totalDeck)); | ||
| } | ||
|
|
||
| private static List<Player> createPlayers(List<String> playerNames, Deck totalDeck) { |
There was a problem hiding this comment.
์ค๋ณต ์ด๋ฆ ๊ด๋ จ ์์ฑ ๋ฐฉ์ด ๋ก์ง์ด ๋น ์ง ๊ฒ ๊ฐ์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์ค๋ณต ์ด๋ฆ์ ๊ฒฝ์ฐ, ํ๋ ์ด๋ ๋๋๋ฐ ๊ฒฐ๊ณผ ์ฐฝ์์ ํ ๋ช ์ ์ฐธ์ฌ์ ๊ฒฐ๊ณผ๋ง ๋ณด์ด๋๋ผ๊ตฌ์. ํ์ธํด๋ณด์ธ์!
๊ฒ์์ ์ฐธ์ฌํ ์ฌ๋์ ์ด๋ฆ์ ์
๋ ฅํ์ธ์.(์ผํ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌ)
ee,ee
๋๋ฌ์ ee, ee์๊ฒ 2์ฅ์ ๋๋์์ต๋๋ค.
๋๋ฌ์นด๋: Aํํธ
ee์นด๋: 10ํด๋ก๋ฒ, J๋ค์ด์๋ชฌ๋
ee์นด๋: 3์คํ์ด๋, K๋ค์ด์๋ชฌ๋
ee๋ ํ์ฅ์ ์นด๋๋ฅผ ๋ ๋ฐ๊ฒ ์ต๋๊น?(์๋ y, ์๋์ค๋ n)
y
ee์นด๋: 10ํด๋ก๋ฒ, J๋ค์ด์๋ชฌ๋, 4์คํ์ด๋
ee๋ ํ์ฅ์ ์นด๋๋ฅผ ๋ ๋ฐ๊ฒ ์ต๋๊น?(์๋ y, ์๋์ค๋ n)
n
๋๋ฌ์นด๋: Aํํธ, 9ํํธ - ๊ฒฐ๊ณผ: 20
ee์นด๋: 10ํด๋ก๋ฒ, J๋ค์ด์๋ชฌ๋, 4์คํ์ด๋ - ๊ฒฐ๊ณผ: 24
ee์นด๋: 3์คํ์ด๋, K๋ค์ด์๋ชฌ๋ - ๊ฒฐ๊ณผ: 13
## ์ต์ข
์นํจ
๋๋ฌ: 2์น
ee: ํจ| @ExtendWith(MockitoExtension.class) | ||
| class GameTest { | ||
| private static final List<String> TEST_PLAYER_NAMES = List.of("pobi", "terry", "rati", "gump"); | ||
| private static final CardCreationStrategy STRATEGY = GameTest::createSampleCards; |
There was a problem hiding this comment.
random์ CreationStrategy๋ก ๋นผ์ ์ ์ ํ ์คํธ ํ์ จ๊ตฐ์๐
์ฒดํฌ ๋ฆฌ์คํธ
test๋ฅผ ์คํํ์ ๋, ๋ชจ๋ ํ ์คํธ๊ฐ ์ ์์ ์ผ๋ก ํต๊ณผํ๋์?์ด๋ค ๋ถ๋ถ์ ์ง์คํ์ฌ ๋ฆฌ๋ทฐํด์ผ ํ ๊น์?
์ฃผ์ 1.
Delegateํจํด ๋์ ์ ๊ดํ ๊ณ ์ฐฐํ์ด ํ๋ก๊ทธ๋๋ฐ ์ค ๊ฐ์ฅ ์น์ดํ๊ฒ ๋ ผ์ํ ์ง์ ์ 'View์ Model(Domain) ๊ฐ์ ์ํธ์์ฉ์ ์ ํต์ ์ธ Controller๋ก ์ ํํ ๊ฒ์ธ๊ฐ, ์๋๋ฉด Delegate ํจํด์ ๋์ ํ ๊ฒ์ธ๊ฐ'**์์ต๋๋ค. ํ์ฌ๋ Delegate๋ฅผ ํ์ฉํ ํ๋ฆ์ ๊ตฌํํ์ผ๋, ์ด๊ฒ์ด Controller ๋ณธ์ฐ์ ์ญํ ์ ์ถฉ๋ถํ ์ํํ๊ณ ์๋์ง์ ๋ํ ์๊ตฌ์ฌ์ด ๋จ์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก Controller๋ View์ Model์ ์ค์ฌ์ ์ญํ ์ ์ํํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฒ ๊ตฌํ์์๋ ๋ณ๋์
Service๋ ์ด์ด ์์ดView <-> Controller <-> Game(Domain)์ ์ง๊ฒฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค. ์ด ๊ณผ์ ์์ Controller๊ฐ Domain์ ํ๋ฆ์ ๊ฐํ๊ฒ ๊ฒฐํฉ๋๊ฑฐ๋, Domain ๋ด๋ถ ๋ก์ง์ ๊ด์ฌํ๊ฒ ๋๋ ๊ตฌ์กฐ์ ๋ํด "์ค๊ณ ์์น์ ์๋ฐํ ๊ฒ์ด ์๋๊ฐ"๋ผ๋ ์์ํจ๊ณผ ์ฐ๋ ค๋ฅผ ๋์์ ๋๋ผ๊ณ ์์ต๋๋ค.์ฃผ์ 2. CLI ํ๊ฒฝ์์์ Web ์ํคํ ์ฒ ๊ณ ๋ ค ์ฌ๋ถ
ํ์ด๋ 'Web ํ๊ฒฝ์ ํ์ฅ์ฑ์ ๊ณ ๋ คํ ๋, ์ํ ์ ์ง๊ฐ ์ ์ ๋ Delegate ๋ฐฉ์์ ๋ถ์ ์ ํ๋ค'๋ ์๊ฒฌ์ ์ ์ํ์ต๋๋ค. ์น์ ์์ฒญ-์๋ต(Request-Response) ๊ตฌ์กฐ์ ์ค๋ ๋ ์ ์ ๋ฌธ์ ๋ฅผ ๊ณ ๋ คํ๋ฉด ํ๋นํ ์ง์ ์ด๋, ์ด๋ฅผ CLI ํ๊ฒฝ์๊น์ง ๊ฐ์ ์ ์ฉํด์ผ ํ๋์ง์ ๋ํด์๋ ์๋ฌธ์ด ์๊ฒผ์ต๋๋ค.
๋ชจ๋ฐ์ผ(Flutter) ํ๊ฒฝ์์๋ ์๋ฒ์ ํต์ ํ ๋ ID ๊ฐ ๋ฑ์ ๋๊ฒจ ์ํ๋ฅผ ์๋ณํ๋ ๋ฐฉ์์ผ๋ก ๋ฌด์ํ์ฑ(Stateless)์ ํด๊ฒฐํฉ๋๋ค. ๋ฐ๋ฉด CLI๋ ํ๋ก์ธ์ค๊ฐ ์ ์ง๋๋ ๋์ ์ํ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ณด๊ดํ ์ ์์ต๋๋ค. ๋ ๋ฒจ 1์์ CLI์ Web์ ๊ตฌ์กฐ์ ์ฐจ์ด(ํนํ HTTP์ ๋ฌด์ํ์ฑ์ผ๋ก ์ธํ ๋ฆฌ์์ค ๊ด๋ฆฌ ๋ฐฉ์)๋ฅผ ๊น์ด ์๊ฒ ๊ณ ๋ฏผํ๋ ๊ฒ์ด ํฅํ ๋ ๋ฒจ 2 ์น ํ์ต์ ์ํ ํ์์ ์ธ ๊ณผ์ ์ธ์ง, ๊ทธ๋ฆฌ๊ณ ์ ๊ฐ ์ดํดํ '์น์ ์ ์ฝ ์ฌํญ ๋๋ฌธ์ ์๊ฒจ๋ ์ค๊ณ์ ์ฐจ์ด'๊ฐ ๋ณธ์ง์ ์ผ๋ก ๋ง๋์ง ํ์ธํ๊ณ ์ถ์ต๋๋ค.
์ฃผ์ 3. ์ค๊ณ์ ์ ์ ๋ฒ์
์ด๋ฒ ๊ฐ๋ฐ ์ฌ์ดํด ์ดํ ์ค๊ณ์ ๊น์ด์ ๊ตฌํ ์๋ ์ฌ์ด์ ์ต์ ์ ์ค๊ฐ ์ง์ ์ ์ด๋์ผ๊น๋ผ๋ ๊ณ ๋ฏผ์ด ์๊ฒผ์ต๋๋ค. ๊ณผ๋ํ ์ฌ์ ์ค๊ณ๊ฐ ๊ตฌํ์ ์ง์ฐ์ํฌ ๊ฒ์ด๋ผ ํ๋จํ์ฌ ์ต์ํ์ ์ํคํ ์ฒ์ ํต์ฌ ๊ฐ์ฒด๋ง์ ์ ์ํ ์ฑ ๊ฐ๋ฐ์ ์ฐฉ์ํ์ผ๋, ์ดํ ์ฌ์ค๊ณ์ ์ฝ๋ ์์ ์ด ๋น๋ฒํ๊ฒ ๋ฐ์ํ์ฌ ๋ง์ ์๊ฐ์ ์์ํ์์ต๋๋ค.
๊ฒ๋ค๊ฐ ๋ถ์์ ํ ์ค๊ณ ์ํ์์์ TDD๊น์ง ์๋ํ๋ ๋ฌธ์ ๊ฐ ๋์ฑ ํฌ๊ฒ ๋ค๊ฐ์จ ๊ฒ ๊ฐ์ต๋๋ค. ์ค๊ณ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์์ฑ๋ ํ ์คํธ ์ฝ๋๋ ์์ ํด์ผ ํด์ ์๊ฐ์ด ๋ ๊ฑธ๋ ธ๋ค๊ณ ์๊ฐ์ด ๋ฉ๋๋ค. ์ฒ ์ ํ ์ฌ์ ์ค๊ณ์ ๊ฐ์ํ ์ค๊ณ ์ฌ์ด์ ์ ์ ์ค๊ณ๋ฅผ ๊ฒฐ์ ํ๋ ๊ธฐ์ค์ ๋ฌด์์ธ์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ์ค๊ณ์ ์ง๊ด์ ๊ธฐ๋ฅด๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ๋ํด ๊น์ ๊ณ ๋ฏผ์ด ๋จ์์ผ๋ ์ค๋ง๋ฆฌ์กฐ์ฐจ ์กํ์ง ์์ ๋ฐฉํฅ์ฑ์ ์ด๋ป๊ฒ ์ก์์ผ ํ ์ง ๊ณ ๋ฏผ์ ๋๋ค.
์ฃผ์ 4. ์ปค๋ฐ์ ๋จ์
๋ฏธ์ ์ ์งํํ ๋ ์ปค๋ฐ์ ๋จ์๋ ๊ธฐ๋ฅ์ด์์ต๋๋ค. ์ด ๋๋ฌธ์ ํ ์ปค๋ฐ์ 100์ค์ด ๋๋ ์ฝ๋๊ฐ ํฌํจ๋๋ ๊ฒฝ์ฐ๊ฐ ์ฆ์๊ณ , ์ด ์ ๋๋ก ํฐ ๋ฉ์ด๋ฆฌ๋ ์ฐจํ์ ๋ฆฌ๋ทฐ์ด๊ป์ ๋ฆฌ๋ทฐํ ๋ ๊ฐ๋ ์ฑ์ ํฌ๊ฒ ์ ํ์ํค์ง ์์๊น๋ผ๋ ์๊ฐ์ ํ์ต๋๋ค. ๋ฌด์์ '๊ธฐ๋ฅ ๊ตฌํ ์๋ฃ'๋ผ๋ ๋ช ๋ชฉ์ผ๋ก ์ฝ๋๋ฅผ ๋ชฐ์๋ฃ๋ ๊ฒ์ด ๊ณผ์ฐ ์ต์ ์ธ์ง, ์๋๋ฉด ํ์ ๊ณผ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๊ณ ๋ คํ์ ๋ ๊ฐ์ฅ ์ด์์ ์ธ ์ปค๋ฐ๋น ์ฝ๋ ์์ด๋ ๋ถ๋ฆฌ ๊ธฐ์ค์ด ๋ฐ๋ก ์๋์ง ๊ถ๊ธํฉ๋๋ค.