Skip to content

[๐Ÿš€ ์‚ฌ์ดํด1 - ๋ฏธ์…˜ (๋ณด๋“œ ์ดˆ๊ธฐํ™” + ๊ธฐ๋ฌผ ์ด๋™)] ๋Ÿฌํ‚ค ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.#237

Open
Jiihyun wants to merge 68 commits intowoowacourse:jiihyunfrom
Jiihyun:step1

Conversation

@Jiihyun
Copy link
Copy Markdown

@Jiihyun Jiihyun commented Mar 28, 2026

ํŽ˜์–ด: @MODUGGAGI


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

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

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

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

์•„๋ž˜๋Š” ๋ฏธ์…˜์„ ์ง„ํ–‰ํ•˜๋ฉฐ ๊ณ ๋ฏผํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค!
์งˆ๋ฌธ์ด ์กฐํผ,,, ๋งŽ์€ ๊ฒƒ ๊ฐ™์•„ ์ค‘์š”๋„ ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด ์šฐ์„ ์ˆœ์œ„๋ฅผ ์„ค์ •ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.
์ฐธ๊ณ  ๋ถ€ํƒ๋“œ๋ฆฌ๋ฉฐ, 2์ฃผ ๊ฐ„ ์ž˜ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค ๐Ÿ˜„

์งˆ๋ฌธ ์ค‘์š”๋„ ํƒœ๊ทธ ๊ทœ์น™

[๐Ÿ”ด Must]
๊ผญ ๋‹ต๋ณ€์„ ๋ฐ›๊ณ  ์‹ถ์€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.
๋ฆฌ๋ทฐ์–ด์˜ ์˜๊ฒฌ์ด ์žˆ์–ด์•ผ ๋‹ค์Œ ๋ฐฉํ–ฅ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[๐ŸŸข Optional]
๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋‹ต๋ณ€์„ ๋ฐ›๊ณ  ์‹ถ์€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.
๋ฐ”์˜์‹œ๋ฉด ๋‚˜์ค‘์— ๋‹ต๋ณ€ํ•ด์ฃผ์…”๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

[โšช๏ธ Curious]
๊ฐœ์ธ์ ์œผ๋กœ ๊ถ๊ธˆํ•ด ์—ฌ์ญค๋ณด๋Š” ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.
๋‹ต๋ณ€์ด ์—†์–ด๋„ ๋ฏธ์…˜ ์ง„ํ–‰์—๋Š” ์˜ํ–ฅ์ด ์—†์Šต๋‹ˆ๋‹ค.

[๐Ÿ”ด Must][ 1. ์žฅ๊ธฐ ๊ธฐ๋ฌผ ์„ค๊ณ„ ๋ฐฉ์‹: Piece ์ƒ์† vs ํ–‰๋งˆ๋ฒ• interface ]

์žฅ๊ธฐ ๊ธฐ๋ฌผ์„ ์„ค๊ณ„ํ•˜๋Š” ๊ณผ์ •์—์„œ Piece๋ฅผ ์ƒ์†๋ฐ›๋Š” ๊ตฌ์กฐ๋กœ ๊ตฌํ˜„ํ• ์ง€, ํ˜น์€ ํ–‰๋งˆ๋ฒ•์„ interface๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ „๋žต ํŒจํ„ด์œผ๋กœ ๊ตฌ์„ฑํ• ์ง€์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ๊ฐ ๊ธฐ๋ฌผ์ด Piece๋ฅผ ์ƒ์†๋ฐ›์•„ ์ž์‹ ์˜ ์ด๋™ ๊ทœ์น™์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์„ ๋– ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค.
์ด ๋ฐฉ์‹์€ ๊ตฌ์กฐ๊ฐ€ ์ง๊ด€์ ์ด๋ผ๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, โ€œ์ฐจ(Chariot)๋Š” ๊ธฐ๋ฌผ(Piece)์˜ ํ•œ ์ข…๋ฅ˜์ด๋ฉฐ ์ž์‹ ์˜ ์ด๋™ ๋กœ์ง์„ ๊ฐ€์ง„๋‹คโ€๋Š” ๊ด€๊ณ„๊ฐ€ ์ฝ”๋“œ์—์„œ๋„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋“œ๋Ÿฌ๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ ์žฅ๊ธฐ์˜ ์ด๋™ ๊ทœ์น™์„ ์‚ดํŽด๋ณด๋ฉด์„œ ์ผ๋ถ€ ๊ธฐ๋ฌผ๋“ค์ด ์ด๋™ ๊ทœ์น™์„ ๋ถ€๋ถ„์ ์œผ๋กœ ๊ณต์œ ํ•œ๋‹ค๋Š” ์ ์ด ์‹ ๊ฒฝ ์“ฐ์˜€์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด,

  • ์ฐจ(่ปŠ)์™€ ํฌ(ๅŒ…)๋Š” ๋ชจ๋‘ ์ƒํ•˜์ขŒ์šฐ ์ง์ง„ ์ด๋™์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ถ(ๆฅš/ๆผข)๊ณผ ์‚ฌ(ๅฃซ)๋Š” ์ด๋™ ๋ฐฉ์‹์ด ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ตฌ์กฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์ƒ์† ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ,
Chariot(์ฐจ)์™€ Cannon(ํฌ) ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ์ง์ง„ ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋กœ์ง์ด ์ค‘๋ณต๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ–‰๋งˆ๋ฒ•์„ MoveStrategy์™€ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ๊ธฐ๋ฌผ์ด ์ด๋ฅผ ์กฐํ•ฉํ•˜๋Š” ์ „๋žต ํŒจํ„ด ๊ตฌ์กฐ๋„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
์ด ๋ฐฉ์‹์—์„œ๋Š” ์ด๋™ ๊ทœ์น™์„ ์กฐํ•ฉ ๊ฐ€๋Šฅํ•œ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ์—, ์ฐจ์™€ ํฌ์ฒ˜๋Ÿผ ์ง์ง„ ์ด๋™์ด๋ผ๋Š” ๊ณตํ†ต ํ–‰๋งˆ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์กด์žฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌ๋ทฐ ์š”์ฒญ ํฌ์ธํŠธ

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

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

์ œ๊ฐ€ ์ƒ์†์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ธฐ์ค€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. ์ƒ์œ„ ํด๋ž˜์Šค๊ฐ€ ์ƒ์†์„ ๊ณ ๋ คํ•ด ์„ค๊ณ„๋œ ๊ฒฝ์šฐ
์˜ˆ๋ฅผ ๋“ค์–ด abstract ๋ฉ”์„œ๋“œ๋กœ ํ™•์žฅ ํฌ์ธํŠธ๋ฅผ ์—ด์–ด ๋‘๊ณ , final ๋ฉ”์„œ๋“œ๋กœ ๊ณตํ†ต ๋กœ์ง์„ ์ œํ•œํ•˜๋Š” ๋“ฑ ์ƒ์†์„ ์ „์ œ๋กœ ํ•œ ๊ตฌ์กฐ๋กœ ์„ค๊ณ„๋œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

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

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

ํ˜„์žฌ ์žฅ๊ธฐ ๊ธฐ๋ฌผ ๊ตฌ์กฐ๊ฐ€ ์œ„ ๊ธฐ์ค€์„ ํฌ๊ฒŒ ์œ„๋ฐ˜ํ•œ๋‹ค๊ณ  ๋А๊ปด์ง€์ง€๋Š” ์•Š์•„์„œ,
๊ฐ ๊ธฐ๋ฌผ์ด Piece๋ฅผ ์ƒ์†๋ฐ›๊ณ  ๊ฐ ํด๋ž˜์Šค์—์„œ ํ–‰๋งˆ๋ฒ•์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌ์กฐ๋„ ์ถฉ๋ถ„ํžˆ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์„๊นŒ?๋ผ๋Š” ์ƒ๊ฐ๋„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฒ ๋ฃจ์Šค๊ป˜์„œ๋Š” ์–ด๋–ค ๊ด€์ ์—์„œ ์žฅ๊ธฐ ๊ธฐ๋ฌผ์— ๋Œ€ํ•ด ์ƒ์† ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ์™€ ์ „๋žต ํŒจํ„ด ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ ์ค‘ ์–ด๋–ค ์„ค๊ณ„๋ฅผ ๋” ์„ ํ˜ธํ•˜์‹ค์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!

[๐ŸŸข Optional][ 2. ๋‹คํ˜•์„ฑ ํ™œ์šฉ ๊ธฐ์ค€ ]

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

ํŠนํžˆ โ€œ์–ด๋””๊นŒ์ง€๋ฅผ ์„ค๊ณ„๋กœ ๋Œ€๋น„ํ•˜๊ณ , ์–ด๋””์„œ๋ถ€ํ„ฐ๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€์ง€โ€ ๊ทธ ์ ์ ˆํ•œ ์„ ์„ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต๋‹ค๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌ๋ทฐ ์š”์ฒญ ํฌ์ธํŠธ

  • ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ ์„ค๊ณ„ํ• ์ง€์— ๋Œ€ํ•œ ํŒ๋‹จ์„ ํ•  ๋•Œ ์–ด๋–ค ๊ธฐ์ค€์„ ๊ฐ€์ง€๊ณ  ๊ฒฐ์ •ํ•˜์‹œ๋‚˜์š”?
    ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•œ ์„ค๊ณ„์™€ ์˜ค๋ฒ„ ์—”์ง€๋‹ˆ์–ด๋ง ์‚ฌ์ด์˜ ๊ฒฝ๊ณ„๋ฅผ ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ํŒ๋‹จํ•˜์‹œ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!

์ฝ”๋“œ ๊ด€๋ จ ์งˆ๋ฌธ์€ ๋”ฐ๋กœ ์ฝ”๋ฉ˜ํŠธ ๋‚จ๊ฒจ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.
์ด ์™ธ์—๋„ ์ž์œ ๋กญ๊ฒŒ ํ”ผ๋“œ๋ฐฑ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋ทฐ ์ž˜ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค๐Ÿ™‡๐Ÿปโ€โ™€๏ธ

Position ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ํ–‰ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ, ์—ด ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ์˜ˆ์™ธ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑ ๋ฐ ๋กœ์ง์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
- ํ–‰๊ณผ ์—ด ์ฐจ์ด ๊ณ„์‚ฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
- ์ƒ์ขŒ์šฐ๋งŒ ๊ฐ€๋Šฅ (ํ›„์ง„ ๊ตฌํ˜„x)
- ํ–‰๋งˆ๋ฒ• ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
- ๋ณด๋“œ ์ดˆ๊ธฐํ™” ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
- ์ดˆ๊ธฐํ™” ์ „๋žต ๊ตฌํ˜„
- ์ƒ์ฐจ๋ฆผ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
- ๊ธฐ์กด Piece ํ…Œ์ŠคํŠธ ์ œ๊ฑฐ
- ์ฐจ ํ–‰๋งˆ๋ฒ• ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
- Position ์œ„์น˜ 1์นธ ์ด๋™ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
- ๋งˆ ํ–‰๋งˆ๋ฒ• ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
- ์ƒ ํ–‰๋งˆ๋ฒ• ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
- DirectionInformation ๊ฐ’ ๊ฐ์ฒด ์ถ”๊ฐ€
- ๊ฒฝ๋กœ ์ƒ ๊ธฐ๋ฌผ ์—†๋Š” ์กฐ๊ฑด ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
- ๊ฒฝ๋กœ ์ƒ ๊ธฐ๋ฌผ์ด 1๊ฐœ ์žˆ๋Š” ์กฐ๊ฑด ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
- ๊ธฐ๋ฌผ ์ด๋™ ๊ฒ€์ฆ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
- ๊ธฐ๋ฌผ ์ด๋™ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
Comment on lines +7 to +14
public interface BoardChecker {

boolean hasPieceAt(Position position);

boolean isSameCampPieceAt(Position position, Camp camp);

boolean hasSamePieceRuleAt(Position position, PieceRule pieceRule);
}
Copy link
Copy Markdown
Author

@Jiihyun Jiihyun Mar 28, 2026

Choose a reason for hiding this comment

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

[๐Ÿ”ด Must] Board์™€ Piece ์˜์กด์„ฑ ๋ถ„๋ฆฌ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊ณ ๋ฏผ

Piece๊ฐ€ Board์— ์ง์ ‘ ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด BoardChecker ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

Board ๊ตฌํ˜„์ฒด๋Š” getter, move ๋“ฑ piece์™€ ์ง์ ‘์ ์ธ ์—ฐ๊ด€์ด ์—†๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Piece๊ฐ€ ์ด๋™์„ ์œ„ํ•ด ๋ณด๋“œ์—์„œ ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค๋งŒ ๋ชจ์•„ BoardChecker ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , Piece๋Š” ์ด ํƒ€์ž…์„ ํ†ตํ•ด์„œ๋งŒ ๋ณด๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

[์งˆ๋ฌธ ๐Ÿ™‹๐Ÿปโ€โ™€๏ธ]
Piece๊ฐ€ Board์˜ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์—๋งŒ ์˜์กดํ•˜๋„๋ก ์ œํ•œํ•˜๋ ค๋Š” ์˜๋„๋กœ ์„ค๊ณ„ํ•œ ํ˜„์žฌ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!
๊ฐ์ฒด ๊ฐ„ ์˜์กด์„ฑ์„ ์ค„์ด๊ธฐ ์œ„ํ•œ ์ ์ ˆํ•œ ์ถ”์ƒํ™”๋ผ๊ณ  ๋ณด์‹œ๋‚˜์š”? ์•„๋‹ˆ๋ฉด ๊ณผ๋„ํ•œ ๋ถ„๋ฆฌ๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋‚˜์š”?

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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

Comment on lines +51 to +61
public static Map<Position, Piece> init(ElephantSetting hanChoice, ElephantSetting choChoice) {
Map<Position, Piece> board = new HashMap<>();

for (InitialPiecePlacement piece : values()) {
board.put(new Position(piece.row, piece.column), new Piece(piece.pieceRule, piece.camp));
}

board.putAll(hanChoice.createElephantOrder(Camp.HAN));
board.putAll(choChoice.createElephantOrder(Camp.CHO));
return board;
}
Copy link
Copy Markdown
Author

@Jiihyun Jiihyun Mar 28, 2026

Choose a reason for hiding this comment

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

[๐ŸŸข Optional] ๋‚˜๋ผ์— ๋”ฐ๋ฅธ ์ƒ์ฐจ๋ฆผ ํƒ€์ž… ์•ˆ์ •์„ฑ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ

์žฅ๊ธฐ์—์„œ ์ƒ/๋งˆ ๋ฐฐ์น˜ ๋ฐฉ์‹์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด BoardInitializer์™€ InitialPiecePlacement์—์„œ ElephantSetting์„ enum์œผ๋กœ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ ์ด ๊ตฌ์กฐ์—์„œ๋Š” HAN๊ณผ CHO์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆœ์„œ๊ฐ€ ์ž˜๋ชป ์„ž์—ฌ ๋“ค์–ด๊ฐ€๋”๋ผ๋„, ํƒ€์ž…์ด ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ์ด ๊ณ ๋ฏผ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

[์งˆ๋ฌธ ๐Ÿ™‹๐Ÿปโ€โ™€๏ธ]
์ด์™€ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆœ์„œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ „์ œ๋ฅผ ๋‘๊ธฐ๋ณด๋‹ค, ํƒ€์ž… ์ˆ˜์ค€์—์„œ ๋” ๊ฐ•ํ•˜๊ฒŒ ์ œ์•ฝ์„ ๋‘๋Š” ์„ค๊ณ„๊ฐ€ ๋” ๋ฐ”๋žŒ์งํ•œ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
์•„๋‹ˆ๋ฉด ํ˜„์žฌ์ฒ˜๋Ÿผ ๊ตฌ์กฐ์˜ ๋‹จ์ˆœํ•จ์„ ์œ ์ง€ํ•˜๋ฉด์„œ, ๋‚ด๋ถ€ ๊ฒ€์ฆ ๋กœ์ง์ด๋‚˜ ํ…Œ์ŠคํŠธ๋กœ ๋ณด์™„ํ•˜๋Š” ์ ‘๊ทผ์ด ๋” ์‹ค์šฉ์ ์ธ์ง€์— ๋Œ€ํ•ด ๋ฒ ๋ฃจ์Šค์˜ ์˜๊ฒฌ์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์ €๋ผ๋ฉด ๊ตฌ์กฐ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋กœ ๋ณด์™„ํ•  ๊ฒƒ ๊ฐ™๋„ค์š”. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž˜ ์ž‘์„ฑํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฌธ๋ฒ•์  ์˜ค๋ฅ˜๋ฅผ ์ฐพ์•„๋‚ด๋“ฏ์ด ๋„๋ฉ”์ธ ๊ทœ์น™์˜ ์˜ค๋ฅ˜๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค~

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

์˜ค!! ํ…Œ์ŠคํŠธ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•˜์ง€ ๋ชปํ–ˆ๋„ค์š”.
์•ž์œผ๋กœ ๋น„์Šทํ•œ ์ƒํ™ฉ์ด ์ƒ๊ธด๋‹ค๋ฉด ๊ตฌ์กฐ๋ฅผ ๋” ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ๋ณด๋‹ค๋Š”, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋” ๊ผผ๊ผผํžˆ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉํ–ฅ์„ ๋จผ์ € ๊ณ ๋ฏผํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

Comment on lines +18 to +21
@Override
public Map<Position, Piece> initialize() {
return InitialPiecePlacement.init(hanElephantSetting, choElephantSetting);
}
Copy link
Copy Markdown
Author

@Jiihyun Jiihyun Mar 28, 2026

Choose a reason for hiding this comment

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

[โšช๏ธ Curious] BoardInitializer ์ถ”์ƒํ™”์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ

ํ˜„์žฌ Board ํด๋ž˜์Šค๋Š” BoardInitializer๋ฅผ ์ฃผ์ž…๋ฐ›์•„ ๋‚ด๋ถ€์—์„œ ์žฅ๊ธฐํŒ์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
BoardInitializer๋Š” ์žฅ๊ธฐํŒ ์ดˆ๊ธฐํ™”๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ํŠนํžˆ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ๊ธฐ๋ฌผ ์œ„์น˜ ์ด๋™ํ•˜๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์—†์ด ์›ํ•˜๋Š” ์žฅ๊ธฐํŒ ์ƒํƒœ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ดํ›„ ์‹ค์ œ ๊ฒŒ์ž„ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ์ดˆ๊ธฐ ๋ฐฐ์น˜ ๊ทœ์น™์„ ๊ด€๋ฆฌํ•˜๋Š” InitialPiecePlacement๋ฅผ ๋ณ„๋„๋กœ ๋งŒ๋“ค๊ฒŒ ๋˜์—ˆ๊ณ , StandardBoardInitializer๋Š” ์žฅ๊ธฐํŒ์˜ ์ดˆ๊ธฐ ๊ธฐ๋ฌผ ๋ฐฐ์น˜๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๊ธฐ๋ณด๋‹ค๋Š” InitialPiecePlacement๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋„๋ก ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด๋กœ ์ธํ•ด StandardBoardInitializer๊ฐ€ ์‹ค์งˆ์ ์ธ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋ณด๋‹ค๋Š” InitialPiecePlacement๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋‹จ์ˆœ ์œ„์ž„ ์—ญํ• ์— ๊ฐ€๊นŒ์šด ์ƒํƒœ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

[์งˆ๋ฌธ ๐Ÿ™‹๐Ÿปโ€โ™€๏ธ]

  • ํ˜„์žฌ์ฒ˜๋Ÿผ Board ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค(BoardInitializer)๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•œ ์„ค๊ณ„์ผ๊นŒ์š”?
    ์•„๋‹ˆ๋ฉดBoardInitializer๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  Board์˜ ์ƒ์„ฑ์ž ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Map์„ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์ด ๋” ๋‹จ์ˆœํ•˜๊ณ  ๋ช…ํ™•ํ•œ ๊ตฌ์กฐ์ผ๊นŒ์š”?

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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

Copy link
Copy Markdown
Author

@Jiihyun Jiihyun Apr 2, 2026

Choose a reason for hiding this comment

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

๋™์˜ํ•ฉ๋‹ˆ๋‹ค!
ํ˜„์žฌ BoardInitializer๋„ ํŠน๋ณ„ํ•œ ์—ญํ•  ์—†์ด Map์„ ๊ฐ์‹ธ๊ณ ๋งŒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  Board๋Š” Map์„ ์ „๋‹ฌ ๋ฐ›๋„๋ก ๋ฆฌํŒฉํ† ๋ง ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

[์งˆ๋ฌธ ๐Ÿ™‹๐Ÿปโ€โ™€๏ธ]
๋‹ค๋งŒ Map์„ Board ์ƒ์„ฑ ์‹œ์ ์— ์ง์ ‘ ์ฃผ์ž…๋ฐ›๊ฒŒ ๋˜๋ฉด, ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ์™ธ๋ถ€์— ๋“œ๋Ÿฌ๋‚˜ ์บก์Аํ™”๊ฐ€ ์•ฝํ•ด์ง€๋Š” ๊ฒƒ์€ ์•„๋‹Œ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!!

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


public interface MoveCondition {

void checkPath(List<Position> path, Camp camp, BoardChecker board, PieceRule pieceRule);
Copy link
Copy Markdown
Author

@Jiihyun Jiihyun Mar 28, 2026

Choose a reason for hiding this comment

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

[๐Ÿ”ด Must] ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค์™€ ํŠน์ • ๊ตฌํ˜„์ฒด ์ „์šฉ ์ธ์ž์— ๋Œ€ํ•œ ๊ณ ๋ฏผ (MoveCondition์˜ PieceRule ์ธ์ž)

MoveCondition ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๋Š” EmptyCondition, OnePieceExistsCondition ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • EmptyCondition์—์„œ๋Š” PieceRule์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • OnePieceExistsCondition์—์„œ๋Š” ๊ฐ™์€ ์ข…๋ฅ˜์˜ ๊ธฐ๋ฌผ์ธ์ง€ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด PieceRule์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋งŒ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์–ด, ํŠน์ • ๊ตฌํ˜„์ฒด์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์ธ์ž๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉํ–ฅ์„ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค.
PieceRule์„ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ์˜ ์ธ์ž์—์„œ ์ œ๊ฑฐํ•˜๊ณ , OnePieceExistsCondition์ด ๋‚ด๋ถ€ ํ•„๋“œ๋กœ PieceRule์„ ๊ฐ€์ง€๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๋‹ค๋งŒ ์ด ๊ฒฝ์šฐ OnePieceExistsCondition์„ ์ƒ์„ฑํ•  ๋•Œ PieceRule์„ ํ•จ๊ป˜ ์ฃผ์ž…ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ํ˜„์žฌ ๊ตฌ์กฐ์—์„œ๋Š” enum ์ดˆ๊ธฐํ™” ์‹œ์  ๋ฌธ์ œ๋กœ ์ž๊ธฐ ์ž์‹ ์„ ์ธ์ž๋กœ ๋„˜๊ธฐ๋Š” ํ˜•ํƒœ๋ฅผ ๋งŒ๋“ค๊ธฐ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค.

[์งˆ๋ฌธ ๐Ÿ™‹๐Ÿปโ€โ™€๏ธ]
๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ค๊ณ„ํ•˜๋‹ค ๋ณด๋ฉด ์ผ๋ถ€ ๊ตฌํ˜„์ฒด์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์ธ์ž๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋Ÿฐ ์ƒํ™ฉ์„ ์–ด๋–ป๊ฒŒ ํŒ๋‹จํ•˜๊ณ  ํ•ด๊ฒฐํ•˜์‹œ๋‚˜์š”?

๊ตฌ์กฐ ์ž์ฒด์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ํŒ๋‹จ๋˜๋”๋ผ๋„ ์ผ๋ถ€ ๊ตฌํ˜„์ฒด์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ผ๋ฉด ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๋งž๋Š”์ง€,
์ผ๋ถ€ ๊ตฌํ˜„์ฒด๋งŒ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋‘๋Š” ๊ฒƒ์ด ์ „์ฒด ๊ตฌ์กฐ์ƒ ์žฅ์ ์ด ๋” ํฌ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๊ธฐ์— ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋Š”๊ฒŒ ์ข‹์€์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

๊ฐ€๋” ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ์ƒ์œ„ ๊ฐœ๋…์„ ๋ฌถ๋‹ค๋ณด๋ฉด ์ง€๊ธˆ์ฒ˜๋Ÿผ ํŠน์ • ์ผ€์ด์Šค์—๋งŒ ํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ƒ๊ธฐ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์˜ ํŒ๋‹จ์— ๋”ฐ๋ผ ์œ ์ง€ํ• ์ง€ ๋ง์ง€๋ฅผ ์ •ํ• ํ…๋ฐ, ์ €๋Š” ์ตœ๋Œ€ํ•œ ๋ถˆํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ณ ๋ฏผํ•ด๋ณด๊ธด ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ํ˜„์žฌ๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•ด ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ณณ์— ํ”ผ๋“œ๋ฐฑ์„ ๋‚จ๊ฒจ๋’€์ง€๋งŒ MoveCondition๊ณผ MoveStrategy๋ฅผ ํ•ฉ์น˜๊ณ  PieceRule์ด๋ผ๋Š” enum์ด ์•„๋‹Œ Piece๋ฅผ ์ƒ์†๋ฐ›์€ ํ•˜์œ„ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ ์‹ถ์Šต๋‹ˆ๋‹ค.

Copy link
Copy Markdown
Author

@Jiihyun Jiihyun Apr 2, 2026

Choose a reason for hiding this comment

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

์ƒ์† ๊ตฌ์กฐ๋ฅผ ๋” ์ถ”์ฒœํ•˜์‹œ๋Š” ์ฃผ๋œ ์ด์œ ๋‚˜, ์ƒ์†์„ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์„ค๊ณ„์  ์ด์ ์— ๋Œ€ํ•ด์„œ ์กฐ๊ธˆ ๋” ์กฐ์–ธ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?
์ƒ์†์„ ์‚ฌ์šฉํ•˜๋ฉด piece ํด๋ž˜์Šค์— camp์™€ pieceRule๋ฅผ ๋†“๊ณ  ์“ธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ผ๊นŒ์š”??!

์ €๋Š” ์žฅ๊ธฐ๋Š” ๊ธฐ๋ฌผ์˜ ์ข…๋ฅ˜์™€ ๊ฐ ๊ธฐ๋ฌผ์˜ ํ–‰๋งˆ๋ฒ•์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ •์ ์ธ ๋„๋ฉ”์ธ์ด๊ธฐ ๋•Œ๋ฌธ์—, Enum์„ ํ™œ์šฉํ•˜์—ฌ "์–ด๋–ค ํƒ€์ž…์€ ์–ด๋–ค ์ „๋žต์„ ๊ฐ€์ง„๋‹ค"๋ฅผ ๋ฏธ๋ฆฌ ์„ธํŒ…ํ•ด ๋‘๋ฉด ๊ด€๋ฆฌ ํฌ์ธํŠธ๊ฐ€ ํ•œ ๊ณณ์œผ๋กœ ๋ชจ์•„์ ธ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค!

Comment on lines +6 to +10
public record CampDto(String camp) {

public static CampDto from(Camp camp) {
return new CampDto(CampFormatter.format(camp));
}
Copy link
Copy Markdown
Author

@Jiihyun Jiihyun Mar 28, 2026

Choose a reason for hiding this comment

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

[โšช๏ธ Curious] DTO์˜ ์—ญํ• ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ

DTO๊ฐ€ ๋‹จ์ˆœํžˆ ํ•˜๋‚˜์˜ ๊ฐ’์„ ๊ฐ์‹ธ๋Š” ๊ตฌ์กฐ๋ผ๋ฉด, ๊ณผ์—ฐ DTO๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์˜๋ฏธ ์žˆ๋Š” ์„ค๊ณ„์ธ์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

DTO๋Š” ๋ณดํ†ต Domain๊ณผ View ์‚ฌ์ด์—์„œ ์™„์ถฉ ์—ญํ• (์—ฐ๊ณจ ๊ฐ™์€ ์—ญํ• )์„ ํ•œ๋‹ค๊ณ  ์ดํ•ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
View์˜ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ DTO๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋˜์–ด Domain๊นŒ์ง€ ๋ณ€๊ฒฝ์˜ ์˜ํ–ฅ์ด ์ „ํŒŒ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์ค„ ์ˆ˜ ์žˆ๊ธฐ์—, ๋‘ ๊ณ„์ธต ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋А์Šจํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ ํ˜„์žฌ ์ƒํ™ฉ์—์„œ๋Š” View์—์„œ Camp ๋„๋ฉ”์ธ์˜ ๊ฐ’ ํ•˜๋‚˜๋งŒ ๊ทธ๋Œ€๋กœ ํ•„์š”๋กœ ํ•˜๋Š” ์ƒํƒœ๋ผ์„œ, DTO๊ฐ€ ์‹ค์งˆ์ ์ธ ์—ญํ• ์„ ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋‹จ์ˆœํžˆ ๊ฐ’์„ ํ•œ ๋ฒˆ ๋” ๊ฐ์‹ธ๋Š” ๊ตฌ์กฐ๊ฐ€ ๋˜์–ด ๋ถˆํ•„์š”ํ•œ ํด๋ž˜์Šค๋งŒ ์ถ”๊ฐ€๋˜๊ณ  ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•œ ๊ฒƒ์€ ์•„๋‹์ง€ ๊ณ ๋ฏผ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

[์งˆ๋ฌธ ๐Ÿ™‹๐Ÿปโ€โ™€๏ธ]

  • View์—์„œ Domain ๊ฐ’ ํ•˜๋‚˜๋งŒ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๊ณ„์ธต ๋ถ„๋ฆฌ๋ฅผ ์œ„ํ•ด DTO๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€์ง€,
    ์•„๋‹ˆ๋ฉด ํ˜„์žฌ ๋‹จ๊ณ„์—์„œ๋Š” DTO ์—†์ด Domain ๊ฐ’์„ ์ง์ ‘ ์ „๋‹ฌํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ๋” ๋‹จ์ˆœํ•˜๊ณ  ์ ์ ˆํ•œ ์„ ํƒ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
  • Piece์—์„œ๋„ DTO๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์ด๋ผ, ํ˜„์žฌ๋Š” CampDto์˜ ์—ญํ• ์ด ๋‹จ์ˆœํ•˜๋”๋ผ๋„ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด DTO๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋‚˜์€์ง€๋„ ๊ณ ๋ฏผ์ด ๋ฉ๋‹ˆ๋‹ค.
    ํ•œํŽธ์œผ๋กœ๋Š” ์ง€๊ธˆ์€ ๊ฐ’์ด ํ•˜๋‚˜๋ฟ์ด์ง€๋งŒ, ์ดํ›„ View์—์„œ ํ•„์š”ํ•œ ๊ฐ’์ด ๋Š˜์–ด๋‚˜ DTO๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ™•์žฅ๋  ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ์ง€ ์•Š์„๊นŒ๋ผ๋Š” ์ƒ๊ฐ๋„ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ ํ˜„์žฌ์˜ ๋‹จ์ˆœํ•จ๊ณผ ๋ฏธ๋ž˜ ํ™•์žฅ ๊ฐ€๋Šฅ์„ฑ ์‚ฌ์ด์—์„œ DTO๋ฅผ ์œ ์ง€ํ• ์ง€ ํŒ๋‹จํ•˜๋Š” ๊ธฐ์ค€์ด ์žˆ๋‹ค๋ฉด ์กฐ์–ธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

DTO๋Š” ๋ทฐ ๊ณ„์ธต์ธ๊ฐ€์š”? ๋„๋ฉ”์ธ ๊ณ„์ธต์ธ๊ฐ€์š”? ์•„๋‹ˆ๋ฉด ๋‘๊ฐœ์˜ ๊ณ„์ธต์— ํฌํ•จ๋˜์ง€ ์•Š์€ ํšŒ์ƒ‰์ง€๋Œ€์ธ๊ฐ€์š”? ๊ฐœ์ธ์ ์œผ๋กœ DTO ์ž์ฒด๋ฅผ ๋ ˆ๋ฒจ1์—์„œ๋Š” ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ธํ”„๋ผ๊ฐ€ ๋ณต์žกํ•˜์ง€ ์•Š์€ ์ฝ˜์†” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” DTO๋ฅผ ๋‘˜ ๋งŒํผ ๋ฐ์ดํ„ฐ ์ „์†ก์ด ๋ณต์žกํ•˜์ง€ ์•Š์•„์„œ์š”. ์‹ฌํ”Œํ•˜๊ฒŒ ๋„๋ฉ”์ธ์„ ์ „๋‹ฌํ•ด๋„ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”. GPT์—๊ฒŒ ํ•œ๋ฒˆ DTO๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ทธ๋ฆฌ๊ณ  ๊ฐ„๋‹จํ•œ ์ฝ˜์†” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•„์š”ํ• ์ง€๋ฅผ ๋ฌผ์–ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”~

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

DTO๋Š” ๋ทฐ์™€ ๋„๋ฉ”์ธ ์‚ฌ์ด์˜ ๊ฒฐํ•ฉ์„ ๋А์Šจํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ , ๋ทฐ ๋ณ€๊ฒฝ์ด ๋„๋ฉ”์ธ๊นŒ์ง€ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋„๋ก ๋ณดํ˜ธํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๋ณด๋“œ๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ๋„ ๋„๋ฉ”์ธ์˜ ๋ชจ๋“  ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ธฐ๋ณด๋‹ค๋Š” ํ•„์š”ํ•œ ๊ฐ’๋งŒ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด DTO๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ camp๋Š” ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ๋˜์–ด๋„ ๋˜์ง€๋งŒ, ๊ตฌ์กฐ์  ํ†ต์ผ์„ฑ์„ ์œ„ํ•ด DTO๋ฅผ ์‚ฌ์šฉํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‹จ์ˆœํžˆ ํ†ต์ผ์„ฑ์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด Camp โ†’ CampDto์™€ ๊ฐ™์€ ๋ถˆํ•„์š”ํ•œ ๋ณ€ํ™˜ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๋ฉด, ์ฝ”๋“œ๊ฐ€ ๋Š˜์–ด๋‚˜๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๋ณต์žกํ•ด์ ธ ์žฅ์ ๋ณด๋‹ค๋Š” ๋‹จ์ ์ด ๋” ํด ๊ฒƒ ๊ฐ™๋„ค์š”!!
๋”ฐ๋ผ์„œ CampDto๋ฅผ ์ œ๊ฑฐํ•˜์˜€์Šต๋‹ˆ๋‹ค!!

import janggi.domain.piece.PieceRule;
import java.util.HashMap;
import java.util.Map;

Copy link
Copy Markdown
Author

@Jiihyun Jiihyun Mar 28, 2026

Choose a reason for hiding this comment

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

[โšช๏ธ Curious] ์ดˆ๊ธฐ ์žฅ๊ธฐ ๊ธฐ๋ฌผ ๋ฐฐ์น˜ ๋ฐ์ดํ„ฐ ์ฃผ์ž… ๋ฐฉ์‹: enum vs CSV

ํ˜„์žฌ ์žฅ๊ธฐ์˜ ์ดˆ๊ธฐ ๊ธฐ๋ฌผ ๋ฐฐ์น˜๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด InitialPiecePlacement enum ๋‚ด๋ถ€์— ๊ฐ ๊ธฐ๋ฌผ์˜ ์ดˆ๊ธฐ ์œ„์น˜ ์ •๋ณด๋ฅผ ์ƒ์ˆ˜๋กœ ์ •์˜ํ•ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐ ๋ฐฐ์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ์™ธ๋ถ€ CSV ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฝ์–ด์˜ค๋Š” ๋ฐฉ์‹๋„ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋‘ ๋ฐฉ์‹์„ ๋น„๊ตํ•˜๋ฉด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ด€์ ์—์„œ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

1. ์˜ค๋ฅ˜ ๋ฐœ๊ฒฌ ์‹œ์ 
๋งŒ์•ฝ ๋ฐ์ดํ„ฐ์— SOLDIER๋ฅผ SOLDER๋กœ ์ž˜๋ชป ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ์ขŒํ‘œ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฐ’(99)์„ ์ž…๋ ฅํ•˜์—ฌ ์˜คํƒ€๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด, enum ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ ํƒ€์ž… ๊ธฐ๋ฐ˜์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ํƒ€์ž„์— ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.
๋ฐ˜๋ฉด CSV ๋ฐฉ์‹์€ ๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„์— ํŒŒ์‹ฑํ•˜๋Š” ๊ณผ์ •์—์„œ์•ผ ์˜ค๋ฅ˜๊ฐ€ ๋“œ๋Ÿฌ๋‚  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ์ฐจ์ด๊ฐ€ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ผ๋Š” ์ธก๋ฉด์—์„œ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

2. ์œ ์—ฐ์„ฑ๊ณผ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๋นˆ๋„
enum ๋ฐฉ์‹์€ ์ฝ”๋“œ์— ์ง์ ‘ ์ •์˜๋˜๋Š” ๋งŒํผ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‹œ ์ฝ”๋“œ ์ˆ˜์ •๊ณผ ์žฌ๋ฐฐํฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด CSV ๋ฐฉ์‹์€ ์™ธ๋ถ€ ํŒŒ์ผ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค๋งŒ ์žฅ๊ธฐ ๊ฒŒ์ž„์˜ ๊ทœ์น™์„ ๊ณ ๋ คํ–ˆ์„ ๋•Œ, ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋ฌผ ์ดˆ๊ธฐ ๋ฐฐ์น˜๋Š” ์ˆ˜๋ฐฑ ๋…„ ๋™์•ˆ ๊ฑฐ์˜ ๋ณ€ํ•˜์ง€ ์•Š์€ ๊ณ ์ •๋œ ๊ทœ์น™์— ๊ฐ€๊น๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์‹ค์ œ๋กœ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ž์ฃผ ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์€ ๋ฐ์ดํ„ฐ๋ผ๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ ๊ณ ๋ คํ–ˆ์„ ๋•Œ, ์œ ์—ฐ์„ฑ ์ธก๋ฉด์—์„œ๋Š” enum์ด ๋‹ค์†Œ ๋ถˆ๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ปดํŒŒ์ผ ํƒ€์ž„ ์•ˆ์ •์„ฑ, ํƒ€์ž… ์•ˆ์ „์„ฑ, IDE ์ง€์› ๋“ฑ์˜ ์žฅ์ ์ด ๋” ํฌ๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ enum ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

[์งˆ๋ฌธ ๐Ÿ™‹๐Ÿปโ€โ™€๏ธ]
์ดˆ๊ธฐ ๊ธฐ๋ฌผ ๋ฐฐ์น˜ ๋ฐ์ดํ„ฐ๋ฅผ enum์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ(CSV ๋“ฑ)๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ์‹, ํ˜น์€ ๊ทธ ์™ธ์˜ ๋ฐฉ์‹ ์ค‘ ์–ด๋–ค ๋ฐฉ์‹์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

๋Ÿฌํ‚ค์˜ ์ƒ๊ฐ๊ณผ ๋™์ผํ•˜๊ฒŒ CSV๋กœ ์ €์žฅํ•˜๋Š”๊ฑด ๊ณผํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. enum์œผ๋กœ ๊ด€๋ฆฌํ•ด๋„ ์ถฉ๋ถ„ํ•  ๊ฒƒ ๊ฐ™์•„์š”.

Copy link
Copy Markdown

@verus-j verus-j 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 +30 to +35
public static ElephantSetting findElephantSettingBy(String command) {
return Arrays.stream(values())
.filter(element -> element.command.equals(command))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.INVALID_ELEPHANT_SETTING.getMessage()));
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

ElephantSetting์„ ์ฐพ๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค~

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

๋ฐ˜์˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค!!
test: ElephantSetting ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

Comment on lines +26 to +31
public int calculateColDirection() {
if (colDifference == 0) {
return 0;
}
return colDifference / Math.abs(colDifference);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

colDifference๊ฐ€ 0์ธ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค~

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

difference ๊ฐ’์— ๋”ฐ๋ฅธ ๋ฉ”์„œ๋“œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฒ€์ฆํ•˜์˜€์Šต๋‹ˆ๋‹ค!

test: DirectionInformation ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

Comment on lines +56 to +59
if ((absRowDifference != MIN_ABS_DELTA || absColDifference != MAX_ABS_DELTA)
&& (absRowDifference != MAX_ABS_DELTA || absColDifference != MIN_ABS_DELTA)) {
throw new IllegalArgumentException(ExceptionMessage.INVALID_HORSE_MOVE.getMessage());
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

absColDifference != MIN_ABS_DELTA ๋งŒ true์ธ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค~

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

์˜ค ๊ทธ๋ ‡๋„ค์š”,,๋ฐ˜์˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค!

test: HorseStrategy ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

Comment on lines +29 to +34
public Camp next() {
if (this == CHO) {
return HAN;
}
return CHO;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Camp๋ฅผ ์ „ํ™˜ํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค~

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

๋ฐ˜์˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค!

test: Camp ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

Comment on lines +14 to +28
@Test
void ํ•œ_์ƒ๋งˆ์ƒ๋งˆ_์ดˆ_๋งˆ์ƒ๋งˆ์ƒ_์œผ๋กœ_๋ณด๋“œ๋ฅผ_์ดˆ๊ธฐํ™”ํ•œ๋‹ค() {
// given
BoardInitializer initializer = new StandardBoardInitializer(
ElephantSetting.LEFT_ELEPHANT, ElephantSetting.RIGHT_ELEPHANT);
Map<Position, Piece> expectedBoard = createExpectedBoard();
expectedBoard.putAll(createChoLeftHanRightBoard());
// when
Map<Position, Piece> board = initializer.initialize();
// then
SoftAssertions.assertSoftly(assertSoftly -> {
assertSoftly.assertThat(board).hasSize(32);
assertSoftly.assertThat(board).isEqualTo(expectedBoard);
});
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์ƒ๊ณผ ๋งˆ์˜ ์„ธํŒ…์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ์ผ€์ด์Šค์ธ๋ฐ ์ƒ/๋งˆ ์„ธํŒ…์„ ํ•˜๋Š” createChoLefHanRightBoard๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์•ˆ์—์„œ ๊ตฌํ˜„๋œ ๋กœ์ง์ด๋„ค์š”. StandardBoardInitializerTest๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์ผ๊นŒ์š”?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

ํ•ด๋‹น ํ…Œ์ŠคํŠธ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•œ ์ผ€์ด์Šค๋ผ๊ธฐ๋ณด๋‹ค๋Š”, ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์ธ initializer.initialize()์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ œ๊ฐ€ ๊ธฐ๋Œ€ํ•œ ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ์˜๋„๋กœ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ธฐ๋Œ€๊ฐ’์„ createChoLeftHanRightBoard()์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•˜๋„๋ก ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

[์งˆ๋ฌธ ๐Ÿ™‹๐Ÿปโ€โ™€๏ธ]
๊ธฐ๋Œ€๊ฐ’์„ ๋ณ„๋„์˜ ๋ฉ”์„œ๋“œ๋กœ ๊ตฌ์„ฑํ•˜๊ธฐ๋ณด๋‹ค๋Š”,
ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ์ง์ ‘ ํ•˜๋“œ์ฝ”๋”ฉ ํ˜•ํƒœ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ์ ˆํ•˜๋‹ค๋Š” ์˜๋ฏธ์—์„œ ๋‚จ๊ฒจ์ฃผ์‹  ๋ฆฌ๋ทฐ์ผ๊นŒ์š”?

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์•„ ๋น„๊ต๋ฅผ ์œ„ํ•ด์„œ expectedBoard์— ์ง์ ‘ ๋„ฃ์–ด์ค€๊ฑฐ๊ตฐ์š”. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž˜๋ชป ๋ดค๋„ค์š”~


@ParameterizedTest
@MethodSource("createPositionsAndPath")
void ์ฐจ์™€_ํฌ๋Š”_ํ•œ_๋ฐฉํ–ฅ์œผ๋กœ๋งŒ_1์นธ_์ด์ƒ_์ด๋™_ํ• _์ˆ˜_์žˆ๋‹ค(Position source, Position destination, int size, List<Position> expectedPath) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

MultiStepStraightStrategy๋Š” ๋ง๊ทธ๋Œ€๋กœ ์ง์„ ์œผ๋กœ ์—ฌ๋Ÿฌ์นธ ์ด๋™ํ•˜๋Š” ๊ฒƒ๊ณผ ์—ฐ๊ด€๋œ ๋กœ์šฐํ•œ ๋ ˆ๋ฒจ์˜ ํด๋ž˜์Šค ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฐจ์™€ ํฌ๋ผ๋Š” ์ถ”์ƒํ™”๋œ ๊ฐœ๋…์„ ์•Œ ํ•„์š”๊ฐ€ ์—†์„ ๊ฒƒ ๊ฐ™์•„์š”. ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋ช…์„ ํ…Œ์ŠคํŠธ ๋Œ€์ƒ์ž์™€ ๋™์ผํ•œ ์ถ”์ƒํ™” ์ˆ˜์ค€์œผ๋กœ ์ˆ˜์ •ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค~

Copy link
Copy Markdown
Author

@Jiihyun Jiihyun Mar 30, 2026

Choose a reason for hiding this comment

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

MultiStepStraightStrategy๋Š” ๋ง์”€ํ•ด์ฃผ์‹  ๊ฒƒ์ฒ˜๋Ÿผ ์ง์„ ์œผ๋กœ ์—ฌ๋Ÿฌ ์นธ ์ด๋™ํ•˜๋Š” ๊ทœ์น™๋งŒ์„ ๋‹ด๋‹นํ•˜๋„๋ก ์ถ”์ƒํ™”ํ•˜์˜€๊ธฐ์—, ํ…Œ์ŠคํŠธ ๋ช…์— ํฌ&์ฐจ์™€ ๊ฐ™์€ ๊ตฌ์ฒด์ ์ธ ๊ธฐ๋ฌผ ๋ช…์ด ๋“ค์–ด๊ฐ„๋‹ค๋ฉด ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ๋งž์ง€ ์•Š๊ฒŒ ๋˜๋Š”๊ตฐ์š”!!

MultiStepStraightStrategTest, ๊ทธ๋ฆฌ๊ณ  SingleStepStraightStrategyTest ๋„ ํ•จ๊ป˜ ๋™์ผํ•œ ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ๋˜๋„๋ก ๋ฉ”์„œ๋“œ๋ช… ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค!

refactor: MultiStepStraightStrategyTest, SingleStepStraightStrategyTeโ€ฆ


@ParameterizedTest
@MethodSource("successMovePositions")
void ๊ถ๊ณผ_์‚ฌ๋Š”_์ƒํ•˜์ขŒ์šฐ_1์นธ_์ด๋™ํ•œ๋‹ค(Position source, Position destination) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์—ฌ๊ธฐ๋„ ์ข€ ๋” ์ถ”์ƒํ™”๋œ ๊ฐœ๋…์ด ์•„๋‹Œ ๋กœ์šฐํ•œ ๋ ˆ๋ฒจ์˜ SingleStepStraightStrategy์—๋งŒ ์ง‘์ค‘ํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋ช…์œผ๋กœ ์ˆ˜์ •ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”~


class SoldierStrategyTest {

private final MoveStrategy strategy = new SoldierStrategy();
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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

Comment on lines +21 to +33
@Test
void ์ดˆ๋‚˜๋ผ_์ฐจ๋ก€๊ฐ€_๋๋‚˜๋ฉด_ํ•œ๋‚˜๋ผ_์ฐจ๋ก€๊ฐ€_๋œ๋‹ค() {
// given
Turn turn = new Turn();
Camp firstTurn = turn.currentTurn();
// when
turn.finishTurn();
// then
SoftAssertions.assertSoftly(assertSoftly -> {
assertSoftly.assertThat(firstTurn).isEqualTo(Camp.CHO);
assertSoftly.assertThat(turn.currentTurn()).isEqualTo(Camp.HAN);
});
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋ช…๊ณผ ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ ๊ฐ™๋„ค์š”~

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

ํ•ด๋‹น ํ…Œ์ŠคํŠธ์—์„œ finishTurn() ํ˜ธ์ถœ ํ›„ ์ฐจ๋ก€๊ฐ€ CHO โ†’ HAN์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ํ๋ฆ„์„ ๊ฒ€์ฆํ•˜๋ ค๋Š” ๋ชฉ์ ์ด์—ˆ๊ณ ,
์ด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ฒ˜์Œ turn ์ง„ํ–‰ ์‹œ์—๋Š” ํ˜„์žฌ ์ฐจ๋ก€๊ฐ€ CHO์ด๊ณ , ์ดํ›„ turn์ด ๋๋‚˜๋ฉด ํ˜„์žฌ ์ฐจ๋ก€๊ฐ€ HAN์ด ๋˜๋Š”์ง€ ํ•จ๊ป˜ ๊ฒ€์ฆํ•˜๋„๋ก ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ €๋Š” ํ…Œ์ŠคํŠธ๋ช…์ด ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์ž˜ ํ‘œํ˜„ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”๋ฐ,
์–ด๋А๋ถ€๋ถ„์—์„œ ํ…Œ์ŠคํŠธ๋ช…๊ณผ ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅด๋‹ค๊ณ  ๋А๋ผ์…จ๋Š”์ง€ ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ๋ง์”€ํ•ด ์ฃผ์‹ค ์ˆ˜ ์žˆ์„๊นŒ์š”?!

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์•„ ์ œ๊ฐ€ ์ž˜๋ชป ๋ดค์—ˆ๋„ค์š”! ํ…Œ์ŠคํŠธ ๋ช…์— ๋งž๊ฒŒ ์ž˜ ์ž‘์„ฑํ•˜์…จ์Šต๋‹ˆ๋‹ค.

class PieceTest {

@Test
void ๊ฐ™์€_๋ฃฐ์ด_์ ์šฉ๋˜๋Š”_๊ธฐ๋ฌผ์ธ์ง€_ํ™•์ธํ•œ๋‹ค() {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

๊ฐ™์€ ๋ฃฐ์ด๋ผ๋Š” ํ‘œํ˜„์ด ์• ๋งคํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํฌ์—๋งŒ ํ•ด๋‹นํ•˜๋Š” ๋‚ด์šฉ์ด๋‹ค๋ณด๋‹ˆ ์ข€ ๋” ํฌ์™€ ์—ฐ๊ด€๋œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋กœ ์ด๋ฆ„์„ ์ˆ˜์ •ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

ํ•ด๋‹น ํ…Œ์ŠคํŠธ๋Š” ํฌ(CANNON)์— ๋งž์ถฐ์ง„ ๋™์ž‘์„ ๊ฒ€์ฆํ•˜๊ธฐ๋ณด๋‹ค๋Š”, ๋™์ผํ•œ PieceRule์„ ๊ฐ€์ง€๋Š” ๊ธฐ๋ฌผ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ์˜ ๋™์ž‘์„ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ํฌ๋Š” ๋‹จ์ˆœํžˆ ์˜ˆ์‹œ๋กœ ์‚ฌ์šฉ๋œ ๊ฒƒ์ด๊ธฐ์—, ํŠน์ • ๊ธฐ๋ฌผ์— ์ข…์†๋œ ์˜๋ฏธ๋ณด๋‹ค๋Š” ๋ฉ”์„œ๋“œ์˜ ์—ญํ• ์ด ๋“œ๋Ÿฌ๋‚˜๋„๋ก ์กฐ๊ธˆ ๋” ์ถ”์ƒํ™”๋œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋ช…์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค! (๊ฐ™์€_์ „๋žต_๋ฐ_์ด๋™_์กฐ๊ฑด์ด_์ ์šฉ๋˜๋Š”_๊ธฐ๋ฌผ์ธ์ง€_ํ™•์ธํ•œ๋‹ค())

Copy link
Copy Markdown
Author

@Jiihyun Jiihyun left a comment

Choose a reason for hiding this comment

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

๋ฆฌ๋ทฐ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๋ฒ ๋ฃจ์Šค!!

TDD๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ถฉ๋ถ„ํžˆ ์ถ”๊ฐ€ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ๋†“์นœ ๋ถ€๋ถ„์ด ๊ฝค ์žˆ์—ˆ๋„ค์š”..
๋ง์”€ํ•ด์ฃผ์‹  ๋ถ€๋ถ„์€ ๋ณด์™„ํ•˜์—ฌ ๋ฐ˜์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

ํ–‰๋งˆ๋ฒ• ์ „๋žต๋งˆ๋‹ค ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ๋‹ค๋ฅธ ๋ถ€๋ถ„(๊ด€๋ จ ์ฝ”๋ฉ˜ํŠธ 2๊ฐœ)์€,,,์กฐ๊ธˆ ๋” ์ƒ๊ฐ์ด ํ•„์š”ํ•˜์—ฌ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๊ด€๋ จ ํ”ผ๋“œ๋ฐฑ ๋จผ์ € ๋ฐ˜์˜ ํ›„ ๋ฆฌ๋ทฐ ์š”์ฒญ ๋“œ๋ ธ์Šต๋‹ˆ๋‹ค!!

Comment on lines +14 to +28
@Test
void ํ•œ_์ƒ๋งˆ์ƒ๋งˆ_์ดˆ_๋งˆ์ƒ๋งˆ์ƒ_์œผ๋กœ_๋ณด๋“œ๋ฅผ_์ดˆ๊ธฐํ™”ํ•œ๋‹ค() {
// given
BoardInitializer initializer = new StandardBoardInitializer(
ElephantSetting.LEFT_ELEPHANT, ElephantSetting.RIGHT_ELEPHANT);
Map<Position, Piece> expectedBoard = createExpectedBoard();
expectedBoard.putAll(createChoLeftHanRightBoard());
// when
Map<Position, Piece> board = initializer.initialize();
// then
SoftAssertions.assertSoftly(assertSoftly -> {
assertSoftly.assertThat(board).hasSize(32);
assertSoftly.assertThat(board).isEqualTo(expectedBoard);
});
}
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

ํ•ด๋‹น ํ…Œ์ŠคํŠธ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•œ ์ผ€์ด์Šค๋ผ๊ธฐ๋ณด๋‹ค๋Š”, ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์ธ initializer.initialize()์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ œ๊ฐ€ ๊ธฐ๋Œ€ํ•œ ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ์˜๋„๋กœ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ธฐ๋Œ€๊ฐ’์„ createChoLeftHanRightBoard()์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•˜๋„๋ก ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

[์งˆ๋ฌธ ๐Ÿ™‹๐Ÿปโ€โ™€๏ธ]
๊ธฐ๋Œ€๊ฐ’์„ ๋ณ„๋„์˜ ๋ฉ”์„œ๋“œ๋กœ ๊ตฌ์„ฑํ•˜๊ธฐ๋ณด๋‹ค๋Š”,
ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ์ง์ ‘ ํ•˜๋“œ์ฝ”๋”ฉ ํ˜•ํƒœ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ์ ˆํ•˜๋‹ค๋Š” ์˜๋ฏธ์—์„œ ๋‚จ๊ฒจ์ฃผ์‹  ๋ฆฌ๋ทฐ์ผ๊นŒ์š”?

Comment on lines +19 to +38
@Test
void ์ด๋™ํ•˜๋ ค๋Š”_๊ฒฝ๋กœ์—_๊ธฐ๋ฌผ์ด_์กด์žฌํ•˜๋ฉด_์˜ˆ์™ธ๊ฐ€_๋ฐœ์ƒํ•œ๋‹ค() {
//given
List<Position> path = List.of(
new Position(0, 0),
new Position(0, 1),
new Position(0, 2),
new Position(0, 3),
new Position(0, 4),
new Position(0, 5)
);
Camp camp = Camp.HAN;

BoardInitializer boardInitializer = new EmptyConditionTestBoardInitializer();
Board board = new Board(boardInitializer);
//when & then
assertThatThrownBy(() -> condition.checkPath(path, camp, board, PieceRule.CHARIOT))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage(ExceptionMessage.PATH_NOT_EMPTY.getMessage());
}
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

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

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

Comment on lines +76 to +81
List<Position> path = strategy.findPath(source, destination, Camp.HAN);
// then
SoftAssertions.assertSoftly(assertSoftly -> {
assertSoftly.assertThat(path).hasSize(expectedPath.size());
assertSoftly.assertThat(path).containsExactlyElementsOf(expectedPath);
});
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

๊ทธ๋ ‡๋„ค์š”!

destination์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ expectedPath ๋งˆ์ง€๋ง‰์— ์œ„์น˜ํ•ด ์žˆ์œผ๋ฏ€๋กœ
destination์„ expectedPath์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์ด ์ค‘๋ณต ์ฝ”๋“œ๋„ ์ œ๊ฑฐํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

๊ด€๋ จํ•˜์—ฌ MultiStepStraightStrategyTest, HorseStrategyTest๋„ ์ค‘๋ณต๋œ ์ •๋ณด๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š๋„๋ก ์ˆ˜์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค!


@ParameterizedTest
@MethodSource("createPositionsAndPath")
void ์ฐจ์™€_ํฌ๋Š”_ํ•œ_๋ฐฉํ–ฅ์œผ๋กœ๋งŒ_1์นธ_์ด์ƒ_์ด๋™_ํ• _์ˆ˜_์žˆ๋‹ค(Position source, Position destination, int size, List<Position> expectedPath) {
Copy link
Copy Markdown
Author

@Jiihyun Jiihyun Mar 30, 2026

Choose a reason for hiding this comment

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

MultiStepStraightStrategy๋Š” ๋ง์”€ํ•ด์ฃผ์‹  ๊ฒƒ์ฒ˜๋Ÿผ ์ง์„ ์œผ๋กœ ์—ฌ๋Ÿฌ ์นธ ์ด๋™ํ•˜๋Š” ๊ทœ์น™๋งŒ์„ ๋‹ด๋‹นํ•˜๋„๋ก ์ถ”์ƒํ™”ํ•˜์˜€๊ธฐ์—, ํ…Œ์ŠคํŠธ ๋ช…์— ํฌ&์ฐจ์™€ ๊ฐ™์€ ๊ตฌ์ฒด์ ์ธ ๊ธฐ๋ฌผ ๋ช…์ด ๋“ค์–ด๊ฐ„๋‹ค๋ฉด ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ๋งž์ง€ ์•Š๊ฒŒ ๋˜๋Š”๊ตฐ์š”!!

MultiStepStraightStrategTest, ๊ทธ๋ฆฌ๊ณ  SingleStepStraightStrategyTest ๋„ ํ•จ๊ป˜ ๋™์ผํ•œ ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ๋˜๋„๋ก ๋ฉ”์„œ๋“œ๋ช… ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค!

refactor: MultiStepStraightStrategyTest, SingleStepStraightStrategyTeโ€ฆ

Comment on lines +21 to +33
@Test
void ์ดˆ๋‚˜๋ผ_์ฐจ๋ก€๊ฐ€_๋๋‚˜๋ฉด_ํ•œ๋‚˜๋ผ_์ฐจ๋ก€๊ฐ€_๋œ๋‹ค() {
// given
Turn turn = new Turn();
Camp firstTurn = turn.currentTurn();
// when
turn.finishTurn();
// then
SoftAssertions.assertSoftly(assertSoftly -> {
assertSoftly.assertThat(firstTurn).isEqualTo(Camp.CHO);
assertSoftly.assertThat(turn.currentTurn()).isEqualTo(Camp.HAN);
});
}
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

ํ•ด๋‹น ํ…Œ์ŠคํŠธ์—์„œ finishTurn() ํ˜ธ์ถœ ํ›„ ์ฐจ๋ก€๊ฐ€ CHO โ†’ HAN์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ํ๋ฆ„์„ ๊ฒ€์ฆํ•˜๋ ค๋Š” ๋ชฉ์ ์ด์—ˆ๊ณ ,
์ด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ฒ˜์Œ turn ์ง„ํ–‰ ์‹œ์—๋Š” ํ˜„์žฌ ์ฐจ๋ก€๊ฐ€ CHO์ด๊ณ , ์ดํ›„ turn์ด ๋๋‚˜๋ฉด ํ˜„์žฌ ์ฐจ๋ก€๊ฐ€ HAN์ด ๋˜๋Š”์ง€ ํ•จ๊ป˜ ๊ฒ€์ฆํ•˜๋„๋ก ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ €๋Š” ํ…Œ์ŠคํŠธ๋ช…์ด ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์ž˜ ํ‘œํ˜„ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”๋ฐ,
์–ด๋А๋ถ€๋ถ„์—์„œ ํ…Œ์ŠคํŠธ๋ช…๊ณผ ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅด๋‹ค๊ณ  ๋А๋ผ์…จ๋Š”์ง€ ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ๋ง์”€ํ•ด ์ฃผ์‹ค ์ˆ˜ ์žˆ์„๊นŒ์š”?!

class PieceTest {

@Test
void ๊ฐ™์€_๋ฃฐ์ด_์ ์šฉ๋˜๋Š”_๊ธฐ๋ฌผ์ธ์ง€_ํ™•์ธํ•œ๋‹ค() {
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

ํ•ด๋‹น ํ…Œ์ŠคํŠธ๋Š” ํฌ(CANNON)์— ๋งž์ถฐ์ง„ ๋™์ž‘์„ ๊ฒ€์ฆํ•˜๊ธฐ๋ณด๋‹ค๋Š”, ๋™์ผํ•œ PieceRule์„ ๊ฐ€์ง€๋Š” ๊ธฐ๋ฌผ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ์˜ ๋™์ž‘์„ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ํฌ๋Š” ๋‹จ์ˆœํžˆ ์˜ˆ์‹œ๋กœ ์‚ฌ์šฉ๋œ ๊ฒƒ์ด๊ธฐ์—, ํŠน์ • ๊ธฐ๋ฌผ์— ์ข…์†๋œ ์˜๋ฏธ๋ณด๋‹ค๋Š” ๋ฉ”์„œ๋“œ์˜ ์—ญํ• ์ด ๋“œ๋Ÿฌ๋‚˜๋„๋ก ์กฐ๊ธˆ ๋” ์ถ”์ƒํ™”๋œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋ช…์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค! (๊ฐ™์€_์ „๋žต_๋ฐ_์ด๋™_์กฐ๊ฑด์ด_์ ์šฉ๋˜๋Š”_๊ธฐ๋ฌผ์ธ์ง€_ํ™•์ธํ•œ๋‹ค())

Comment on lines +30 to +35
public static ElephantSetting findElephantSettingBy(String command) {
return Arrays.stream(values())
.filter(element -> element.command.equals(command))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.INVALID_ELEPHANT_SETTING.getMessage()));
}
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

๋ฐ˜์˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค!!
test: ElephantSetting ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

Comment on lines +26 to +31
public int calculateColDirection() {
if (colDifference == 0) {
return 0;
}
return colDifference / Math.abs(colDifference);
}
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

difference ๊ฐ’์— ๋”ฐ๋ฅธ ๋ฉ”์„œ๋“œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฒ€์ฆํ•˜์˜€์Šต๋‹ˆ๋‹ค!

test: DirectionInformation ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

Comment on lines +56 to +59
if ((absRowDifference != MIN_ABS_DELTA || absColDifference != MAX_ABS_DELTA)
&& (absRowDifference != MAX_ABS_DELTA || absColDifference != MIN_ABS_DELTA)) {
throw new IllegalArgumentException(ExceptionMessage.INVALID_HORSE_MOVE.getMessage());
}
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

์˜ค ๊ทธ๋ ‡๋„ค์š”,,๋ฐ˜์˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค!

test: HorseStrategy ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

Comment on lines +29 to +34
public Camp next() {
if (this == CHO) {
return HAN;
}
return CHO;
}
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

๋ฐ˜์˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค!

test: Camp ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

Copy link
Copy Markdown

@verus-j verus-j 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 +13 to +22
public static Position from(List<Integer> rawPosition) {
validatePositionSize(rawPosition);
return new Position(rawPosition.get(0), rawPosition.get(1));
}

private static void validatePositionSize(List<Integer> position) {
if (position.size() != POSITION_SIZE) {
throw new IllegalArgumentException(ExceptionMessage.INVALID_INPUT_FORMAT.getMessage());
}
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Position์„ ์ƒ์„ฑํ•  ๋•Œ size๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์—†๋„ค์š”~

Copy link
Copy Markdown
Author

@Jiihyun Jiihyun Apr 2, 2026

Choose a reason for hiding this comment

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

์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค!!
refactor: Position format ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

Copy link
Copy Markdown

@verus-j verus-j Apr 3, 2026

Choose a reason for hiding this comment

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

์ •์ƒ์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ์—†๋„ค์š”~


private void validateElephantMovement(DirectionInformation directionInfo) {
if ((directionInfo.calculateAbsRowDifference() != MIN_ABS_DELTA
|| directionInfo.calculateAbsColDifference() != MAX_ABS_DELTA)
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

directionInfo.calculateAbsColDiffernce() != MAX_ABS_DELTA๊ฐ€ false์ธ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์—†๋„ค์š”~

Comment on lines +45 to +47
public void placeOn(Map<Position, Piece> board) {
board.put(position, piece);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์ถœ๋ ฅ ์ธ์ž์— ๋Œ€ํ•ด ์•„์‹œ๋‚˜์š”? ํด๋ฆฐ ์ฝ”๋“œ ๊ด€์ ์—์„œ ์ถœ๋ ฅ ์ธ์ž๊ฐ€ ์–ด๋–ค ๋ฌธ์ œ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ•™์Šตํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค~

Copy link
Copy Markdown
Author

@Jiihyun Jiihyun Apr 1, 2026

Choose a reason for hiding this comment

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

[ ์งˆ๋ฌธ ๐Ÿ™‹๐Ÿปโ€โ™€๏ธ]
์ถœ๋ ฅ ์ธ์ž์˜ ๋ฌธ์ œ์ ์ด ํ˜„์žฌ board๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ board๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง๊ด€์ ์ด์ง€ ์•Š๊ณ  ์–ด์ƒ‰ํ•˜๊ฒŒ ๋А๊ปด์ง€๋Š” ๊ฒƒ์ผ๊นŒ์š”??


InitialPiecePlacement์˜ ๊ฐ’๋“ค์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๊ฒŒํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๊ณ  ์œ„์™€ ๊ฐ™์€ ํ˜•ํƒœ๊ฐ€ ๋˜์—ˆ๋Š”๋ฐ, ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฆฌํŒฉํ† ๋ง ํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค!

public static Board initialize(ElephantFormation hanFormation, ElephantFormation choFormation) {
        Map<Position, Piece> board = new HashMap<>();

        for (InitialPiecePlacement placement : values()) {
            board.put(placement.position, placement.piece);
        }
        board.putAll(hanFormation.placeElephantSetUpPieces());
        board.putAll(choFormation.placeElephantSetUpPieces());
        return new Board(board);
    }

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์ถœ๋ ฅ ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ์˜ ๋‚ด๋ถ€๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ํ™•์ธํ•˜๋ฉฐ ๋ณ€๊ฒฝ์ ์„ ์ฐพ์•„์•ผํ•˜๋‹ˆ ์ฝ”๋“œ ๋ถ„์„์ด ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž˜ ์ˆ˜์ •ํ•˜์…จ์–ด์š”~

import janggi.domain.piece.PieceRule;
import java.util.HashMap;
import java.util.Map;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

๋Ÿฌํ‚ค์˜ ์ƒ๊ฐ๊ณผ ๋™์ผํ•˜๊ฒŒ CSV๋กœ ์ €์žฅํ•˜๋Š”๊ฑด ๊ณผํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. enum์œผ๋กœ ๊ด€๋ฆฌํ•ด๋„ ์ถฉ๋ถ„ํ•  ๊ฒƒ ๊ฐ™์•„์š”.

Comment on lines +18 to +21
@Override
public Map<Position, Piece> initialize() {
return InitialPiecePlacement.init(hanElephantSetting, choElephantSetting);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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

Comment on lines +51 to +61
public static Map<Position, Piece> init(ElephantSetting hanChoice, ElephantSetting choChoice) {
Map<Position, Piece> board = new HashMap<>();

for (InitialPiecePlacement piece : values()) {
board.put(new Position(piece.row, piece.column), new Piece(piece.pieceRule, piece.camp));
}

board.putAll(hanChoice.createElephantOrder(Camp.HAN));
board.putAll(choChoice.createElephantOrder(Camp.CHO));
return board;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์ €๋ผ๋ฉด ๊ตฌ์กฐ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋กœ ๋ณด์™„ํ•  ๊ฒƒ ๊ฐ™๋„ค์š”. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž˜ ์ž‘์„ฑํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฌธ๋ฒ•์  ์˜ค๋ฅ˜๋ฅผ ์ฐพ์•„๋‚ด๋“ฏ์ด ๋„๋ฉ”์ธ ๊ทœ์น™์˜ ์˜ค๋ฅ˜๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค~

Comment on lines +21 to +33
@Test
void ์ดˆ๋‚˜๋ผ_์ฐจ๋ก€๊ฐ€_๋๋‚˜๋ฉด_ํ•œ๋‚˜๋ผ_์ฐจ๋ก€๊ฐ€_๋œ๋‹ค() {
// given
Turn turn = new Turn();
Camp firstTurn = turn.currentTurn();
// when
turn.finishTurn();
// then
SoftAssertions.assertSoftly(assertSoftly -> {
assertSoftly.assertThat(firstTurn).isEqualTo(Camp.CHO);
assertSoftly.assertThat(turn.currentTurn()).isEqualTo(Camp.HAN);
});
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์•„ ์ œ๊ฐ€ ์ž˜๋ชป ๋ดค์—ˆ๋„ค์š”! ํ…Œ์ŠคํŠธ ๋ช…์— ๋งž๊ฒŒ ์ž˜ ์ž‘์„ฑํ•˜์…จ์Šต๋‹ˆ๋‹ค.

Comment on lines +14 to +28
@Test
void ํ•œ_์ƒ๋งˆ์ƒ๋งˆ_์ดˆ_๋งˆ์ƒ๋งˆ์ƒ_์œผ๋กœ_๋ณด๋“œ๋ฅผ_์ดˆ๊ธฐํ™”ํ•œ๋‹ค() {
// given
BoardInitializer initializer = new StandardBoardInitializer(
ElephantSetting.LEFT_ELEPHANT, ElephantSetting.RIGHT_ELEPHANT);
Map<Position, Piece> expectedBoard = createExpectedBoard();
expectedBoard.putAll(createChoLeftHanRightBoard());
// when
Map<Position, Piece> board = initializer.initialize();
// then
SoftAssertions.assertSoftly(assertSoftly -> {
assertSoftly.assertThat(board).hasSize(32);
assertSoftly.assertThat(board).isEqualTo(expectedBoard);
});
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์•„ ๋น„๊ต๋ฅผ ์œ„ํ•ด์„œ expectedBoard์— ์ง์ ‘ ๋„ฃ์–ด์ค€๊ฑฐ๊ตฐ์š”. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž˜๋ชป ๋ดค๋„ค์š”~

Comment on lines +6 to +10
public record CampDto(String camp) {

public static CampDto from(Camp camp) {
return new CampDto(CampFormatter.format(camp));
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

DTO๋Š” ๋ทฐ ๊ณ„์ธต์ธ๊ฐ€์š”? ๋„๋ฉ”์ธ ๊ณ„์ธต์ธ๊ฐ€์š”? ์•„๋‹ˆ๋ฉด ๋‘๊ฐœ์˜ ๊ณ„์ธต์— ํฌํ•จ๋˜์ง€ ์•Š์€ ํšŒ์ƒ‰์ง€๋Œ€์ธ๊ฐ€์š”? ๊ฐœ์ธ์ ์œผ๋กœ DTO ์ž์ฒด๋ฅผ ๋ ˆ๋ฒจ1์—์„œ๋Š” ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ธํ”„๋ผ๊ฐ€ ๋ณต์žกํ•˜์ง€ ์•Š์€ ์ฝ˜์†” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” DTO๋ฅผ ๋‘˜ ๋งŒํผ ๋ฐ์ดํ„ฐ ์ „์†ก์ด ๋ณต์žกํ•˜์ง€ ์•Š์•„์„œ์š”. ์‹ฌํ”Œํ•˜๊ฒŒ ๋„๋ฉ”์ธ์„ ์ „๋‹ฌํ•ด๋„ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”. GPT์—๊ฒŒ ํ•œ๋ฒˆ DTO๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ทธ๋ฆฌ๊ณ  ๊ฐ„๋‹จํ•œ ์ฝ˜์†” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•„์š”ํ• ์ง€๋ฅผ ๋ฌผ์–ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”~


public interface MoveCondition {

void checkPath(List<Position> path, Camp camp, BoardChecker board, PieceRule pieceRule);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

๊ฐ€๋” ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ์ƒ์œ„ ๊ฐœ๋…์„ ๋ฌถ๋‹ค๋ณด๋ฉด ์ง€๊ธˆ์ฒ˜๋Ÿผ ํŠน์ • ์ผ€์ด์Šค์—๋งŒ ํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ƒ๊ธฐ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์˜ ํŒ๋‹จ์— ๋”ฐ๋ผ ์œ ์ง€ํ• ์ง€ ๋ง์ง€๋ฅผ ์ •ํ• ํ…๋ฐ, ์ €๋Š” ์ตœ๋Œ€ํ•œ ๋ถˆํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ณ ๋ฏผํ•ด๋ณด๊ธด ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ํ˜„์žฌ๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•ด ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ณณ์— ํ”ผ๋“œ๋ฐฑ์„ ๋‚จ๊ฒจ๋’€์ง€๋งŒ MoveCondition๊ณผ MoveStrategy๋ฅผ ํ•ฉ์น˜๊ณ  PieceRule์ด๋ผ๋Š” enum์ด ์•„๋‹Œ Piece๋ฅผ ์ƒ์†๋ฐ›์€ ํ•˜์œ„ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ ์‹ถ์Šต๋‹ˆ๋‹ค.

Copy link
Copy Markdown
Author

@Jiihyun Jiihyun left a comment

Choose a reason for hiding this comment

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

์•ˆ๋…•ํ•˜์„ธ์š” ๋ฒ ๋ฃจ์Šค!
๋ฐ”์˜์‹  ์™€์ค‘์—๋„ ๊ผผ๊ผผํ•˜๊ฒŒ ๋ฆฌ๋ทฐํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›๊ณ  ์ถ”์ƒํ™” ๊ตฌ์กฐ๋ฅผ ์—ฌ๋Ÿฌ ๋ฐฉ์‹์œผ๋กœ ์‹œ๋„ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.
๋ฆฌ๋ทฐ ๋•๋ถ„์— ๋กœ์ง์ด ์ด์ „๋ณด๋‹ค ๊น”๋”ํ•ด์กŒ์ง€๋งŒ, ์•ž์œผ๋กœ ์ƒˆ๋กœ์šด ๊ธฐ๋ฌผ์ด ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋  ๋•Œ OCP๊ฐ€ ์ž˜ ์ง€์ผœ์งˆ ์ˆ˜ ์žˆ์„์ง€๋Š” ์—ฌ์ „ํžˆ ๊ณ ๋ฏผ๋˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

์ถ”์ƒํ™” ์„ค๊ณ„ ๊ด€๋ จํ•ด์„œ ๋ฆฌ๋ทฐ ๋ฐ ์กฐ์–ธ ๋” ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด, ์ด๋ฒˆ์—๋„ ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ•˜์—ฌ ๋ฐ˜์˜ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!๐Ÿ™‡๐Ÿปโ€โ™€๏ธ

Comment on lines +13 to +22
public static Position from(List<Integer> rawPosition) {
validatePositionSize(rawPosition);
return new Position(rawPosition.get(0), rawPosition.get(1));
}

private static void validatePositionSize(List<Integer> position) {
if (position.size() != POSITION_SIZE) {
throw new IllegalArgumentException(ExceptionMessage.INVALID_INPUT_FORMAT.getMessage());
}
}
Copy link
Copy Markdown
Author

@Jiihyun Jiihyun Apr 2, 2026

Choose a reason for hiding this comment

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

์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค!!
refactor: Position format ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

Comment on lines +51 to +61
public static Map<Position, Piece> init(ElephantSetting hanChoice, ElephantSetting choChoice) {
Map<Position, Piece> board = new HashMap<>();

for (InitialPiecePlacement piece : values()) {
board.put(new Position(piece.row, piece.column), new Piece(piece.pieceRule, piece.camp));
}

board.putAll(hanChoice.createElephantOrder(Camp.HAN));
board.putAll(choChoice.createElephantOrder(Camp.CHO));
return board;
}
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

์˜ค!! ํ…Œ์ŠคํŠธ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•˜์ง€ ๋ชปํ–ˆ๋„ค์š”.
์•ž์œผ๋กœ ๋น„์Šทํ•œ ์ƒํ™ฉ์ด ์ƒ๊ธด๋‹ค๋ฉด ๊ตฌ์กฐ๋ฅผ ๋” ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ๋ณด๋‹ค๋Š”, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋” ๊ผผ๊ผผํžˆ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉํ–ฅ์„ ๋จผ์ € ๊ณ ๋ฏผํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!


public interface MoveCondition {

void checkPath(List<Position> path, Camp camp, BoardChecker board, PieceRule pieceRule);
Copy link
Copy Markdown
Author

@Jiihyun Jiihyun Apr 2, 2026

Choose a reason for hiding this comment

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

์ƒ์† ๊ตฌ์กฐ๋ฅผ ๋” ์ถ”์ฒœํ•˜์‹œ๋Š” ์ฃผ๋œ ์ด์œ ๋‚˜, ์ƒ์†์„ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์„ค๊ณ„์  ์ด์ ์— ๋Œ€ํ•ด์„œ ์กฐ๊ธˆ ๋” ์กฐ์–ธ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?
์ƒ์†์„ ์‚ฌ์šฉํ•˜๋ฉด piece ํด๋ž˜์Šค์— camp์™€ pieceRule๋ฅผ ๋†“๊ณ  ์“ธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ผ๊นŒ์š”??!

์ €๋Š” ์žฅ๊ธฐ๋Š” ๊ธฐ๋ฌผ์˜ ์ข…๋ฅ˜์™€ ๊ฐ ๊ธฐ๋ฌผ์˜ ํ–‰๋งˆ๋ฒ•์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ •์ ์ธ ๋„๋ฉ”์ธ์ด๊ธฐ ๋•Œ๋ฌธ์—, Enum์„ ํ™œ์šฉํ•˜์—ฌ "์–ด๋–ค ํƒ€์ž…์€ ์–ด๋–ค ์ „๋žต์„ ๊ฐ€์ง„๋‹ค"๋ฅผ ๋ฏธ๋ฆฌ ์„ธํŒ…ํ•ด ๋‘๋ฉด ๊ด€๋ฆฌ ํฌ์ธํŠธ๊ฐ€ ํ•œ ๊ณณ์œผ๋กœ ๋ชจ์•„์ ธ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค!

Comment on lines +6 to +10
public record CampDto(String camp) {

public static CampDto from(Camp camp) {
return new CampDto(CampFormatter.format(camp));
}
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

DTO๋Š” ๋ทฐ์™€ ๋„๋ฉ”์ธ ์‚ฌ์ด์˜ ๊ฒฐํ•ฉ์„ ๋А์Šจํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ , ๋ทฐ ๋ณ€๊ฒฝ์ด ๋„๋ฉ”์ธ๊นŒ์ง€ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋„๋ก ๋ณดํ˜ธํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๋ณด๋“œ๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ๋„ ๋„๋ฉ”์ธ์˜ ๋ชจ๋“  ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ธฐ๋ณด๋‹ค๋Š” ํ•„์š”ํ•œ ๊ฐ’๋งŒ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด DTO๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ camp๋Š” ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ๋˜์–ด๋„ ๋˜์ง€๋งŒ, ๊ตฌ์กฐ์  ํ†ต์ผ์„ฑ์„ ์œ„ํ•ด DTO๋ฅผ ์‚ฌ์šฉํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‹จ์ˆœํžˆ ํ†ต์ผ์„ฑ์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด Camp โ†’ CampDto์™€ ๊ฐ™์€ ๋ถˆํ•„์š”ํ•œ ๋ณ€ํ™˜ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๋ฉด, ์ฝ”๋“œ๊ฐ€ ๋Š˜์–ด๋‚˜๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๋ณต์žกํ•ด์ ธ ์žฅ์ ๋ณด๋‹ค๋Š” ๋‹จ์ ์ด ๋” ํด ๊ฒƒ ๊ฐ™๋„ค์š”!!
๋”ฐ๋ผ์„œ CampDto๋ฅผ ์ œ๊ฑฐํ•˜์˜€์Šต๋‹ˆ๋‹ค!!

Copy link
Copy Markdown

@verus-j verus-j left a comment

Choose a reason for hiding this comment

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

์•ˆ๋…•ํ•˜์„ธ์š” ๋Ÿฌํ‚ค~
ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜ํ•˜๋А๋ผ ๊ณ ์ƒํ•˜์…จ์Šต๋‹ˆ๋‹ค. ๋ช‡๊ฐ€์ง€ ์ถ”๊ฐ€ ํ”ผ๋“œ๋ฐฑ ๋‚จ๊ฒจ๋†จ์Šต๋‹ˆ๋‹ค. ํ™•์ธ๋ถ€ํƒ๋“œ๋ ค์š”~

import janggi.domain.piece.PieceRule;
import java.util.List;

public class EmptySlidingRule extends SlidingRule {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์ƒ์† ๊ตฌ์กฐ๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•ด์ง€๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ผ๋‹จ ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ๊ณ ๋ คํ•˜์ง€๋ง๊ณ  ์ค‘๊ฐ„ ๋‹จ๊ณ„์ธ SlidingRule์„ ์ œ๊ฑฐํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”.

Comment on lines +32 to +34
if (!board.hasPieceAt(position)) {
continue;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

continue๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์ˆ˜์ •ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”. ์ œ์–ด ํ๋ฆ„์ด ๋™์ผํ•˜์ง€ ์•Š์œผ๋ฉด ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์›์†Œ๊ฐ€ ๋™์ผํ•œ ํ๋ฆ„์„ ๊ฐ™๋„๋ก ํ†ต์ผํ•ด๋ณด์‹œ์ฃ .

}

private void validateDistance(DirectionInformation direction) {
if (!direction.hasAbsDifferences(diagonalDistance, STRAIGHT_DISTANCE + diagonalDistance)) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

distance์™€ difference๋ฅผ ํ†ต์ผํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋„ค์š”.

Comment on lines +15 to +18
HORSE(new DiagonalStepRule(1)),
CANNON(new JumpingSlidingRule()),
GUARD(new SingleStepRule(false)),
ELEPHANT(new DiagonalStepRule(2)),
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

๋งˆ์™€ ์ƒ์ด 1์นธ ์ „์ง„์ด๋ผ๋Š” ์กฐ๊ฑด์ด ํ˜„์žฌ๋Š” ๋™์ผํ•˜์ง€๋งŒ ํ•œ ์ข…๋ฅ˜๋งŒ 2์นธ ์ „์ง„์œผ๋กœ ๋ฐ”๋€Œ๋ฉด ์„œ๋กœ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๋ณ€๊ฒฝ์„ ํ•ด์•ผํ•˜๋Š” ๊ฒƒ ๊ฐ™๋„ค์š”. ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”~

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