[๐ ์ฌ์ดํด1 - ๋ฏธ์ (๋ณด๋ ์ด๊ธฐํ + ๊ธฐ๋ฌผ ์ด๋)] ์์ฌ ๋ฏธ์ ์ ์ถํฉ๋๋ค.#254
[๐ ์ฌ์ดํด1 - ๋ฏธ์
(๋ณด๋ ์ด๊ธฐํ + ๊ธฐ๋ฌผ ์ด๋)] ์์ฌ ๋ฏธ์
์ ์ถํฉ๋๋ค.#254yeo-li wants to merge 34 commits intowoowacourse:yeo-lifrom
Conversation
yeo-li
left a comment
There was a problem hiding this comment.
์ฝ๋์ ๊ด๋ จ๋ ์ง๋ฌธ ๋จ๊ฒจ๋์์ต๋๋ค
| @Override | ||
| public void checkRoute(List<Piece> pieces) { | ||
| int count = 0; | ||
| for (Piece piece : pieces) { | ||
| if (piece instanceof Cannon) { | ||
| throw new IllegalArgumentException(CANNOT_JUMP_WITH_CANNON); | ||
| } | ||
| if (!(piece instanceof Empty)) { | ||
| count++; | ||
| } | ||
| } | ||
| if (count != 1) { | ||
| throw new IllegalArgumentException(INVALID_TARGET_POSITION); | ||
| } | ||
| } | ||
|
|
||
| @Override | ||
| public void checkTarget(Piece piece) { | ||
| if (piece.getSide().equals(side)) { | ||
| throw new IllegalArgumentException(CANNOT_CAPTURE_OWN_PIECE); | ||
| } | ||
|
|
||
| if (piece instanceof Cannon) { | ||
| throw new IllegalArgumentException(CANNOT_CAPTURE_CANNON_WITH_CANNON); | ||
| } | ||
| } |
There was a problem hiding this comment.
ํฌ๋ฅผ ์ ์ธํ checkRoute, checkTarget์ ๊ตฌํ์ด ๋์ผํ์ฌ, ๋ถ๋ชจ ํด๋์ค Piece์ ๊ณตํต ๋ก์ง์ ๊ตฌํํ๊ณ ํฌ๋ง ์ค๋ฒ๋ผ์ด๋ํ๋๋ก ์ค๊ณํ์ต๋๋ค.
์ด ๋ฐฉ์์ ์ค๋ณต ์ ๊ฑฐ์ ์ง๊ด์ฑ ์ธก๋ฉด์์๋ ์ฅ์ ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ง๋ง Piece์ ๊ตฌํ๋ ๋ฉ์๋๋ ๋ชจ๋ ์์ ํด๋์ค๊ฐ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์์ด์ผ ์ข์ ์ค๊ณ๋ผ๊ณ ์๊ฐํ๋๋ฐ, ํ์ฌ์ฒ๋ผ ํน์ ์์(ํฌ)๋ง ์ค๋ฒ๋ผ์ด๋๊ฐ ํ์ํ ๊ตฌ์กฐ๋ ๊ด์ฐฎ์ ์ค๊ณ์ธ์ง ๊ถ๊ธํฉ๋๋ค:)
์ด๋ฐ ์ํฉ์์ ๋ถ๋ชจ์ ๊ธฐ๋ณธ ๊ตฌํ์ ๋๊ณ ์ผ๋ถ๋ง override ํ๋ ๋ฐฉ์์ด ์ ์ ํ์ง ํน์ ์ฒ์๋ถํฐ ์ถ์ ๋ฉ์๋๋ก ๊ฐ์ ํ๋ ๊ฒ์ด ๋ ์ข์์ง ์๊ฒฌ ๋จ๊ฒจ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค
There was a problem hiding this comment.
PieceType enum์ ๊ฐ ๊ธฐ๋ฌผ์ ์์ฑ ์ฑ ์์ ๋ด๋นํ๋๋ก ์ฌ์ฉํ์ต๋๋ค. ๊ฐ ๊ธฐ๋ฌผ๋ง๋ค ์์ฑ ์ ํ์ํ ์ ๋ต(LinearMovement, PathMovement)์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์, enum ๋ด๋ถ์์ create ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ์ฌ ๊ธฐ๋ฌผ ์์ฑ ๋ก์ง๊ณผ ์ ๋ต์ ํจ๊ป ๋ฌถ์์ต๋๋ค!
์ด๋ ๊ฒ ํ๋ฉด Board๋ Formation์์๋ PieceType๋ง ์๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๊ตฌ์ฒด์ ์ธ ์์ฑ ๋ฐฉ์์ด๋ ์ ๋ต์ ์์กดํ์ง ์์๋ ๋๋ค๊ณ ์๊ฐํ์ต๋๋ค. ๋ฐ๋ฉด, enum์ ์์ฑ ๋ก์ง๊น์ง ํฌํจ๋๋ฉด์ ์ฑ ์์ด ์ปค์ง๊ณ enum์ด ๋น๋ํด์ง๋ ๊ตฌ์กฐ๊ฐ ๋๋ ๊ฒ ๊ฐ๋ค๋ ๊ณ ๋ฏผ๋ ์์ต๋๋ค.
ํฌ๋ฃจ๋ค๊ณผ ์ด์ผ๊ธฐํ์ ๋๋ ์ด ๊ตฌ์กฐ๊ฐ ์ค๋ฒ ์์ง๋์ด๋ง์ด๊ณ , ๋ณ๋์ Factory ํด๋์ค๋ฅผ ๋๊ณ Map์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ ๋จ์ํ๋ค๋ ์๊ฒฌ๋ ์์ด ๊ฐ๊ฐ์ ์ฅ๋จ์ ์ด ์๋ ๊ฒ ๊ฐ๋จ ์๊ฐ์ด ๋ค์์ด์.
์ ๋ enum์ ์์ฑ ์ฑ ์๊น์ง ํฌํจ์ํค๋ ๋ฐฉ์์ด ์ ์ ํ ์ค๊ณ์ธ์ง, ์์ฑ ์ฑ ์์ ๋ถ๋ฆฌํด์ ๋ณ๋์ Factory๋ก ๋๋ ๊ฒ์ด ๋ ์ข์์ง ํน์ ํ์ฌ ๊ตฌ์กฐ๊ฐ ์ ์ง๋ณด์๋ ํ์ฅ์ฑ ์ธก๋ฉด์์ ์ค์ ๋ก ์๋ฏธ ์๋ ์ถ์ํ์ธ์ง ๊ถ๊ธํฉ๋๋ค!
There was a problem hiding this comment.
PieceType์ด ๊ธฐ๋ฌผ ์์ฑ ์ฑ
์๊น์ง ๊ฐ์ง๋ ํ์ฌ ๊ตฌ์กฐ๋, ์ด๋ฒ ๋ฏธ์
๊ท๋ชจ์์๋ ์ถฉ๋ถํ ์์ฐ์ค๋ฌ์ด ์ ํ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๐๐
์ฌ์ฉํ๋ ์ชฝ์์ ๊ตฌ์ฒด์ ์ธ ์์ฑ ๋ฐฉ์๊ณผ ์ ๋ต์ ๋ชฐ๋ผ๋ ๋๋ค๋ ์ฅ์ ์ด ๋ถ๋ช
ํด์, ์ง๊ธ ๋จ๊ณ์์ ๋ณ๋ Factory๋ฅผ ๋๋ ๊ฒ์ด ๊ผญ ๋ ๋จ์ํ๋ค๊ณ ๋ณด์ด์ง๋ ์์์. ๋ค๋ง ์์ฑ ์ ์ฑ
์ด ๋ ๋ณต์กํด์ง๋ค๋ฉด enum์ด ๋น๋ํด์ง ์ ์์ผ๋, ๊ทธ ์์ ์๋ ์ฑ
์ ๋ถ๋ฆฌ๋ฅผ ๋ค์ ๊ณ ๋ฏผํด๋ณผ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
There was a problem hiding this comment.
ํผ๋๋ฐฑ ๊ฐ์ฌํด์!
| public static Position of(int x, int y) { | ||
| validateOutOfRange(x, y); | ||
| return CACHE.computeIfAbsent(x * 100 + y, k -> new Position(x, y)); | ||
| } |
There was a problem hiding this comment.
Position์ ์์ฑํ ๋, ์ ๋ ฅ๊ฐ์ ์ด๋์ ํ์ฑํ๋ ๊ฒ์ด ์ ์ ํ์ง์ ๋ํด ๊ณ ๋ฏผ์ด ์์ต๋๋ค. ํ์ฌ ๊ตฌ์กฐ์์๋ InputView์์ scanner.nextInt()๋ฅผ ์ฌ์ฉํด ์ขํ๋ฅผ int๋ก ํ์ฑํ ๋ค Position์ผ๋ก ์ ๋ฌํ๊ณ ์์ต๋๋ค.
์ด๋ int ๋ฒ์๋ฅผ ์ด๊ณผํ๋ ๊ฐ์ด ๋ค์ด์ค๋ฉด, InputView ๋จ๊ณ์์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด์ "์ซ์๋ฅผ ์ ๋ ฅํด ์ฃผ์ธ์"์ ๊ฐ์ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ ์ ์๋๋ฐ, ์ฌ์ฉ์ ์ ์ฅ์์๋ ์ซ์๋ฅผ ์ ๋ ฅํ๊ธฐ ๋๋ฌธ์ ๋ถ์ ํํ ๋ฉ์์ง๋ผ๊ณ ๋๋ ์ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๊ทธ๋์ String์ ๊ทธ๋๋ก Position๊น์ง ๋๊ฒจ์ ํ๋ณํ๊ณผ ๋ฒ์ ๊ฒ์ฆ์ Position ๋ด๋ถ์์ ํจ๊ป ์ฒ๋ฆฌํ๋ ๋ฐฉ์๋ ํ์ด์ ๋ ผ์๋ฅผ ํด๋ณด์์ต๋๋ค. ์ ํฌ๊ฐ ๋ด๋ฆฐ ๊ฒฐ๋ก ์ of() ๋ฉ์๋ ์์์ ํ๋ณํ์ ํด์ฃผ๋ ๊ฒ์ ๊ณผ๋ํ ์ฑ ์์ด๊ธฐ ๋๋ฌธ์, ์ธ๋ถ์์ ํ๋ณํ์ ํ ๋ค์ ๊ทธ ๊ฐ์ ๋ํ ์ ํจ์ฑ ๊ฒ์ฆ์ ํ๋๊ฒ ๋ ์ข์ ์ค๊ณ๋ผ๊ณ ๊ฒฐ๋ก ๋ด๋ ธ์ต๋๋ค.
ํ์ง๋ง ๊ฐ์ธ์ ์ผ๋ก๋ ์ขํ ์ ๋ ฅ๊ฐ์ ๋ํ ํ๋ณํ ์์ฒด๋ Position์ ์์ฑํ๋ ๊ณผ์ ์ ์ผ๋ถ๋ผ๋ฉด ํ๋ณํ ์ญ์ Position.of()์ ์ฑ ์์ผ๋ก ๋ณด๋ ๊ฒ์ด ๋ง์ง ์์๊น ํ๋ ์๊ฐ๋ ๋ค์์ต๋๋ค.
์ด ์ํฉ์์ ์ ๋ ฅ๊ฐ์ ํ์ฑ์ InputView์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ ์ ํ์ง, ์๋๋ฉด Position ๋ด๋ถ์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋ ๋์ ์ค๊ณ์ธ์ง ๊ณ ๋ฏผ์ด ๋ฉ๋๋ค. ์ด์ ๋ํด ํผ๋๋ฐฑ ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค:)
There was a problem hiding this comment.
์ด ์ํฉ์์ ์ ๋ ฅ๊ฐ์ ํ์ฑ์ InputView์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ ์ ํ์ง, ์๋๋ฉด Position ๋ด๋ถ์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋ ๋์ ์ค๊ณ์ธ์ง ๊ณ ๋ฏผ์ด ๋ฉ๋๋ค. ์ด์ ๋ํด ํผ๋๋ฐฑ ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค:)
Position์ ์ขํ ๊ฐ ๊ฐ์ฒด์ธ ๋งํผ, ๋ฌธ์์ด ํ์ฑ๋ณด๋ค๋ ํ์ฑ๋ ๊ฐ์ ์ ํจ์ฑ ๊ฒ์ฆ์ ์ง์คํ๋ ํธ์ด ์ญํ ์ด ๋ ์ ๋ช ํ๋ค๊ณ ์๊ฐํด์. ๐
๋ค๋ง ํ์ฌ์ฒ๋ผ InputView์์ ๋ฐ๋ก nextInt()๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ์ ๋ ฅ ์์ธ ๋ฉ์์ง๋ฅผ ์ธ๋ฐํ๊ฒ ๋ค๋ฃจ๊ธฐ ์ด๋ ค์ ๋ณด์ฌ, ๋ฌธ์์ด ์ ๋ ฅ์ View์์ ๋ฐ๊ณ ํ๋ณํ๊ณผ ์ฌ์ ๋ ฅ ํ๋ฆ์ Controller์์ ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ๋ ๊ณ ๋ คํ ์ ์์ ๊ฒ ๊ฐ์์. ๐ค
There was a problem hiding this comment.
์๊ฒฌ ๊ฐ์ฌํฉ๋๋ค
Rok93
left a comment
There was a problem hiding this comment.
์์ฌ ์๋
ํ์ธ์~
์ฅ๊ธฐ ๋ฏธ์
์ ํจ๊ปํ๊ฒ๋ ๋กํค์
๋๋ค.
๊ฝค ์ด๋ ค์ด ๋ฏธ์ ์ธ๋ฐ ์ ์ฒด์ ์ผ๋ก ์ ์งํํด์ฃผ์ จ๋ค์. ๐๐
๋จ๊ฒจ์ฃผ์ ์ง๋ฌธ์๋ํด์ ์ ์๊ฐ๋ค ๋จ๊ฒจ๋์๊ณ ์ถ๊ฐ๋ก ๋ช๋ช ์ฝ๋ฉํธ๋ ๋จ๊ฒจ๋์์ผ๋ ํ์ธ ๋ถํ๋๋ฆด๊ฒ์ ๐
| import org.junit.jupiter.params.ParameterizedTest; | ||
| import org.junit.jupiter.params.provider.CsvSource; | ||
|
|
||
| class ElephantTest { |
There was a problem hiding this comment.
์ ์ฃ์กํฉ๋๋ค..!ใ ๋ค์์ ๊ด๋ จํด์ ๊ผญ ํ์ธํ ๋ค ์ ์ถํ๊ฒ ์ต๋๋ค๐ฅฒ
| public void checkRoute(List<Piece> pieces) { | ||
| for(Piece piece : pieces) { | ||
| if(!(piece instanceof Empty)) { | ||
| throw new IllegalArgumentException(CANNOT_CAPTURE_OWN_PIECE); |
There was a problem hiding this comment.
"์๊ตฐ ๊ธฐ๋ฌผ์ ์ก์ ์ ์์ต๋๋ค." ๋ผ๋ ์๋ฌ ๋ฉ์์ง๋ฅผ ๋์ง๊ณ ์๋๋ฐ์.
์ค์ ์ํฉ์ ๊ฒฝ๋ก๊ฐ ์ค๊ฐ์ ๋งํ์ ์์ธ๋ฅผ ๋์ง ๊ฒ์ผ๋ก ๋ณด์ฌ์. ๐ค
There was a problem hiding this comment.
๊ฒฝ๋ก๊ฐ ๋งํ๊ธฐ ๋๋ฌธ์ "์ด๋ํ ์ ์๋ค"๋ ๋ฉ์ธ์ง๋ฅผ ์ถ๋ ฅํด์ผ๊ฒ ๋ค์! ๋ฐ๋ก ์์ ํ๊ฒ ์ต๋๋ค๐ฅฒ ๊ฐ์ฌํฉ๋๋ค!
src/main/java/view/InputView.java
Outdated
| public int readTargetXPosition() { | ||
| System.out.println(); | ||
| System.out.println("๋ชฉ์ ์ง x ์ขํ๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์. (x ๋ฒ์ 1 ~ 9)"); | ||
| return scanner.nextInt(); |
There was a problem hiding this comment.
ํ์ฌ ์ขํ ์ ๋ ฅ์ Scanner.nextInt()๋ฅผ ์ฌ์ฉํ๊ณ ์์ด, ๋ฌธ์ ์ ๋ ฅ ์ InputMismatchException์ผ๋ก ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ฉ๋๋ค.
์ค์๋ก ๋ฌธ์๋ฅผ ์
๋ ฅํ ๊ฒฝ์ฐ์๋ํด์ ํ๋ก๊ทธ๋จ์ ๋ฐ๋ก ์ข
๋ฃํ๊ธฐ๋ณด๋ค๋ ์ฌ์
๋ ฅ์ ๋ฐ๋๋กํด์ฃผ๋ฉด ์ด๋จ๊น์?
์ง๊ธ๊ณผ ๊ฐ์ ์ฝ์ ๊ฒ์์ ์ค์๋ก ์๋ชป๋ ๊ฐ์ ์
๋ ฅํ๊ธฐ๊ฐ ๋งค์ฐ ์ฌ์ด ํ๊ฒฝ์ด๋ผ ์๊ฐํด์. ๐ฅน
There was a problem hiding this comment.
InputView์์ Scanner.nextInt()๋ฅผ ์ด์ฉํด ๋ฐํํ๋ ๊ธฐ์กด์ ๊ตฌ์กฐ์์ InputView์์ String์ ๋ฐํํ๊ณ ์ค๊ฐ์ Parser.parseInput()์ด๋ผ๋ ์ ํธ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด String์ int๋ก ๋ฐํํ๋๋ก ๋ณ๊ฒฝํ์ต๋๋ค! ํผ๋๋ฐฑ ๊ฐ์ฌํฉ๋๋ค
|
|
||
| import java.util.List; | ||
|
|
||
| public abstract class MovementStrategy { |
There was a problem hiding this comment.
- ์ด๋ ๊ท์น ๊ฒ์ฆ ์ฑ
์ ๋ถ๋ฆฌ ๊ตฌ์กฐ์ ์ ์ ์ฑ
Board.movePiece์์ ํด/์์ ๊ถ/๊ฒฝ๋ก/๋ชฉ์ ์ง ๊ฒ์ฆ์ ์ํํ๊ณ , ์ค์ ์ด๋ ๊ฐ๋ฅ ๊ฒฝ๋ก ๊ณ์ฐ์ MovementStrategy(PathMovement, LinearMovement)๋ก ๋ถ๋ฆฌํ์ต๋๋ค.
์ด ์ฑ ์ ๋ถ๋ฆฌ๊ฐ ์ ์ง๋ณด์/ํ์ฅ ์ธก๋ฉด์์ ์ ์ ํ์ง ํผ๋๋ฐฑ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค:)
์ง๊ธ ๊ตฌ์กฐ ๋ฐฉํฅ์ ๋์์ง ์์ต๋๋ค. ํนํ Board๊ฐ "์ด๋ ์์ฒญ์ ์กฐ์จํ๋ ๊ฐ์ฒด"๋ก์ ํด, ์์ ๊ถ, ๋ชฉ์ ์ง ์ ์ ์ํ๋ฅผ ํ์ธํ๊ณ , ๊ฐ ๊ธฐ๋ฌผ์ด MovementStrategy๋ฅผ ํตํด ์์ ์ ์ด๋ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ๊ฒ ํ ์ ์ ์ฑ ์์ ๋ถ๋ฆฌํ๋ ค๋ ์๋๊ฐ ๋ถ๋ช ํด์ ์ข์์ด์. ๐ ๐
์ ๊ฐ ๋๋ผ๊ธฐ์๋
- Board๋ ๊ฒฝ๊ธฐ ์งํ ๋ด๋น์
- Piece์ MovementStrategy๋ ๊ฐ ๊ธฐ๋ฌผ์ ์์ง์ ๊ท์น ๋ด๋น
์ ์ญํ ์ ๊ฐ์ง๋ ๊ฒ์ผ๋ก ์ดํดํ์ด์.
๋ค๋ง ํ์ฌ Board๊ฐ ์ด๋ ๊ท์น๊น์ง ํจ๊ป ํ๋จํ๊ณ ์์ด ์ญํ ๋ฒ์๊ฐ ๋ค์ ๋์ด ๋ณด์ฌ์.
๊ฐ์ธ์ ์ธ ์๊ฐ์ผ๋ก๋ ์ด๋ ๊ท์น ํ๋จ์ ๊ธฐ๋ฌผ ์ชฝ์ ๋ ๋ชจ์ผ๋ฉด ์ด๋ ๊ท์น์ ์์ง๋๋ฅผ ๋ ๋์ผ ์ ์์ง ์์๊น ์ถ์ด์. ๐ค
There was a problem hiding this comment.
ํผ๋๋ฐฑ ๊ฐ์ฌํฉ๋๋ค! ๐
๋ง์ํด์ฃผ์ ๋ฐฉํฅ๋๋ก Board์์ ์ด๋ ๊ท์น ํ๋จ ์ฑ
์์ ๋ถ๋ฆฌํด๋ณด๋ ค ํ๊ณ , ์ฒ์์๋ Piece์ ๊ท์น์ ๋ชจ์ผ๋ ๋ฐฉ์์ ๊ณ ๋ฏผํ์ต๋๋ค.
๋ค๋ง ์ค์ ๊ฒ์ฆ ๊ณผ์ ์์ Board๊ฐ Piece์ ์ด๋ ๊ฒ์ฆ ์์๋ฅผ ๊ฐํ๊ฒ ์กฐํฉํ๊ณ ์์ด, ์์ ํ ๋ถ๋ฆฌํ๊ธฐ๊ฐ ์ฝ์ง ์๋ค๊ณ ๋๊ผ์ต๋๋ค.
๊ทธ๋์ Board๋ ๊ธฐ๋ฌผ ์ด๋๊ณผ ์ํ ์กฐํ๋ง ๋ด๋นํ๋๋ก ๋จ์ํํ๊ณ , Game ํด๋์ค๋ฅผ ๋์
ํด ์ด๋ ๊ท์น ๊ฒ์ฆ๊ณผ ํด ๊ด๋ฆฌ๋ฅผ ๋งก๊ธฐ๋๋ก ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด Board๋ ๊ท์น ํ๋จ ์ฑ
์์์ ๋ฒ์ด๋๊ณ , Piece๋ ๊ฐ ๊ธฐ๋ฌผ์ ๊ตฌ์ฒด์ ์ธ ์ด๋ ๊ท์น์ ์ง์คํ ์ ์์ผ๋ฉฐ, Game์ ๊ท์น ์คํ ํ๋ฆ๊ณผ ํด ์ ํ์ ๋ด๋นํ๊ฒ ๋ฉ๋๋ค.
์ญํ ๊ฒฝ๊ณ๋ฅผ ๋ช
ํํ ํด์ ์์ง๋๋ฅผ ๋์ด๋ ๋ฐฉํฅ์ผ๋ก ๋ฆฌํฉํฐ๋งํด๋ดค์ต๋๋ค.
ํน์ ์ฌ์ ํ ๋ถ์กฑํ ๋ถ๋ถ์ด ์๋ค๋ฉด ํธํ๊ฒ ํผ๋๋ฐฑ ๋ถํ๋๋ฆฝ๋๋ค!
| import view.InputView; | ||
| import view.OutputView; | ||
|
|
||
| public class JanggiController { |
There was a problem hiding this comment.
- ์์ธ ๋ฉ์์ง ์ผ๊ด์ฑ๊ณผ ์
๋ ฅ ์์ ์ฑ
๋๋ฉ์ธ ์์ธ ๋ฉ์์ง๋ฅผ ์ค์ฌ์ผ๋ก ์ฌ์ฉ์์๊ฒ ์ถ๋ ฅ์ ํ๊ณ ์๋๋ฐ, ๋ฉ์์ง์ ์๋ฏธ/์ ํ์ฑ์ด ์ถฉ๋ถํ์ง์
์ ๋ ฅ ํ์ฑ(nextInt) ์์ธ ์ฒ๋ฆฌ๋ฅผ View/Controller/Domain ์ด๋์์ ๋ด๋นํ๋ ๊ฒ ์ข์์ง ์๊ฒฌ ๋ถํ๋๋ฆฝ๋๋ค!
์์ฌ๋ ์๋ง๋ ์ ์ฒด๋ฅผ ํตํ์ด์ ์ง๋ฌธ์ ํ์ ๊ฒ ๊ฐ์๋ฐ์..!
์ํฉ์ ๋ฐ๋ผ ์กฐ๊ธ ๋ค๋ฅธ ๊ฒ ๊ฐ์์.
๋จ์ํ ์
๋ ฅ๊ฐ์๋ํ ์
๋ ฅ ํ์ ๋ฌธ์ ๋ View๋ Controller ์ชฝ์์ ์ฒ๋ฆฌํ๋๊ฒ ์์ฐ์ค๋ฝ์ง๋ง
์กธ๋ณ์ ๋ ์นธ ์ ์ง์์ผฐ๋ค๊ฑฐ๋ํ๋ ์ผ์ด์ค๋ ๋๋ฉ์ธ ๊ท์น์ ์๋ฐฐ๋๋ ๊ฒฝ์ฐ์ด๋ฏ๋ก ์ด๋ฐ ๊ฒฝ์ฐ์๋ Domain์์ ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ผํ๋ค๊ณ ์๊ฐํด์. ๐
There was a problem hiding this comment.
๋ฉ์์ง์ ์๋ฏธ/์ ํ์ฑ์ ๊ผผ๊ผผํ๊ฒ ๋ค ์ดํด๋ณด์ง๋ ๋ชปํ์ง๋ง, ๋จ๊ธด ์ฝ๋ฉํธ์ค์์ ์ํฉ์ ๋ง์ง์๋ ์์ธ ์ฒ๋ฆฌ๊ฐ ์์๋ ๊ฒ ๊ฐ์๋ฐ์. ์์ธ ๋ฉ์์ง์ ์๋ฏธ/์ ํ์ฑ์ด๋๊ฒ ๋ฑ ์ ์๋ ๊ฒ์ ์์ง๋ง, ๊ฒฐ๊ตญ ์์ธ ๋ฉ์์ง๋ฅผ ์ ๋จ๊ธฐ๋์ง?์ ๋ํด์ ๊ณ ๋ฏผํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์์.
๊ฒฐ๊ตญ์๋ ์์ธ ์ํฉ์ ํ์ํ๊ณ ์ ์ ํ ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ์ํจ์ด๋ผ๊ณ ์๊ฐํ๋๋ฐ์.
๊ทธ๋ ๋ค๋ฉด ํด๋น ์์ธ ์ํฉ์ด ์ ๋ฐ์ํ๋์ง๋ฅผ ์ ๋๋ฌ๋ด์ผํ๋ค๊ณ ์๊ฐํด์.
๋ ๋ ๋์๊ฐ์ ์ค์ ์ด์ํ๊ฒฝ์์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ์ฌ ์ฅ์ ๋์์ ํ๋ค๊ณ ์๊ฐํด๋ณด๋ฉด ๊ฒฐ๊ตญ ๋๋ฒ๊น
์ ์์์ ์ด ์ด ์์ธ๋ฉ์์ง๋ผ๊ณ ์๊ฐํด์.
์ด ์์ธ๋ฉ์์ง๊ฐ ๋๋ฒ๊น ์ ์์ ํฌ์ธํธ๋ผ๊ณ ์๊ฐํ๋ฉด....! ์ ๋ง ์ค์ํ๋ค๊ณ ์๊ฐํ์์ง ์๋์? ๐
There was a problem hiding this comment.
์์ธ ๋ฉ์ธ์ง์ ์ ๊ฒฝ์ ์ ์ฐ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ ์์๋๋ฐ, ์์ผ๋ก ๋ ๋ฉด๋ฐํ ์์ฑํ๋๋ก ํ๊ฒ ์ต๋๋ค
| public static Position of(int x, int y) { | ||
| validateOutOfRange(x, y); | ||
| return CACHE.computeIfAbsent(x * 100 + y, k -> new Position(x, y)); | ||
| } |
There was a problem hiding this comment.
์ด ์ํฉ์์ ์ ๋ ฅ๊ฐ์ ํ์ฑ์ InputView์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ ์ ํ์ง, ์๋๋ฉด Position ๋ด๋ถ์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋ ๋์ ์ค๊ณ์ธ์ง ๊ณ ๋ฏผ์ด ๋ฉ๋๋ค. ์ด์ ๋ํด ํผ๋๋ฐฑ ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค:)
Position์ ์ขํ ๊ฐ ๊ฐ์ฒด์ธ ๋งํผ, ๋ฌธ์์ด ํ์ฑ๋ณด๋ค๋ ํ์ฑ๋ ๊ฐ์ ์ ํจ์ฑ ๊ฒ์ฆ์ ์ง์คํ๋ ํธ์ด ์ญํ ์ด ๋ ์ ๋ช ํ๋ค๊ณ ์๊ฐํด์. ๐
๋ค๋ง ํ์ฌ์ฒ๋ผ InputView์์ ๋ฐ๋ก nextInt()๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ์ ๋ ฅ ์์ธ ๋ฉ์์ง๋ฅผ ์ธ๋ฐํ๊ฒ ๋ค๋ฃจ๊ธฐ ์ด๋ ค์ ๋ณด์ฌ, ๋ฌธ์์ด ์ ๋ ฅ์ View์์ ๋ฐ๊ณ ํ๋ณํ๊ณผ ์ฌ์ ๋ ฅ ํ๋ฆ์ Controller์์ ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ๋ ๊ณ ๋ คํ ์ ์์ ๊ฒ ๊ฐ์์. ๐ค
src/main/java/domain/Board.java
Outdated
| public Board(Formation choFormation, Formation hanFormation) { | ||
| createBoard(choFormation, hanFormation); | ||
| } |
There was a problem hiding this comment.
Board ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ์๊ฐ์ ๋ฐ๋ก piece๋ฅผ ๋ฐฐ์นํ๊ธฐ๋ณด๋ค๋, Board ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ญํ ์ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ์์ํด๋ณด๋ฉด ์ด๋จ๊น์?
์ฃผ์์ฑ์๋ ์์ฑ์ ํ๋ผ๋ฏธํฐ๋ก Map<Position, Piece>๋ฅผ ๋ฐ์์ ๋จ์ํ ์ด๊ธฐํํด์ฃผ๋ ์ญํ ์ ํด๋ณด๋ฉด ์ด๋จ๊น์?
| public Board(Formation choFormation, Formation hanFormation) { | |
| createBoard(choFormation, hanFormation); | |
| } | |
| public Board(Map<Position, Piece> board) { | |
| this.board = board; | |
| } |
There was a problem hiding this comment.
๊ธฐ์กด์๋ ๊ธฐ๋ฌผ ์ด๋/์ํ ์กฐํ๋ฟ ์๋๋ผ ์ด๊ธฐ ๋ฐฐ์น(์ด๊ธฐํ)๊น์ง ํจ๊ป ๋ด๋นํ๊ณ ์์๊ณ ,
ํนํ ์ด๊ธฐํ ๋ก์ง์ด ์ปค์ง๋ฉด์ Board์ ์ฑ
์์ด ๋ค์ ๋ฌด๊ฑฐ์์ ธ ๋ณด์ฌ, ํด๋น ๋ถ๋ถ์ BoardFactory๋ก ๋ถ๋ฆฌํ์ต๋๋ค:)
์ด์ Board๋ ์์ฑ์๋ก Map<Position, Piece>๋ฅผ ๋ฐ์ ์ํ๋ฅผ ์ด๊ธฐํํ๊ณ , ์ดํ์๋ ๋ณธ๋ ์ฑ
์์ธ ์ํ ๊ด๋ฆฌ์ ์ด๋์ ์ง์คํ๋๋ก ์ ๋ฆฌํ์ด์
์ด๋ ๊ฒ ๋ถ๋ฆฌํ๋ Board์ ์์ง๋๊ฐ ๋์์ก์ต๋๋ค:)
์ข์ ํผ๋๋ฐฑ ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!
src/main/java/domain/Position.java
Outdated
|
|
||
| public static Position of(int x, int y) { | ||
| validateOutOfRange(x, y); | ||
| return CACHE.computeIfAbsent(x * 100 + y, k -> new Position(x, y)); |
There was a problem hiding this comment.
ํ์ฌ ๋ฒ์์์๋ ๋์์ ๋ฌธ์ ๋ ์์ด ๋ณด์ด์ง๋ง, ์บ์ ํค๋ฅผ x * 100 + y๋ก ๋ง๋๋ ๋ฐฉ์์ ์ฒ์ ์ฝ๋ ์ ์ฅ์์ ์กฐ๊ธ ์ถ๋ก ์ด ํ์ํ ํํ์ฒ๋ผ ๋๊ปด์ก์ต๋๋ค. ์ขํ ๋ฒ์์ ๊ธฐ๋๋ ๊ท์น์ด ์จ์ด ์์ด์, ์๋๊ฐ ๋ ์ ๋๋ฌ๋๋ ํํ๋ฉด ๊ฐ๋ ์ฑ์ด ๋ ์ข์์ง ๊ฒ ๊ฐ์์. ๐ค
์๋ฅผ๋ค๋ฉด ๊ทธ๋ฅ ๋จ์ํ Map<Integer, Map<Integer, Point>>๋ก CACHE๋ฅผ ๊ด๋ฆฌํ๋๊ฒ ๋ ์ง๊ด์ ์ด์ง ์๋ ์ถ์์ด์. ๐
There was a problem hiding this comment.
๋จ์ํ key์ฌ๋ ์๋ฏธ ์ถ๋ก ์ด ์ฝ๊ฒ ์ง๊ด์ ์ผ๋ก ์ ์ด์ผํ๋ ๊ฑธ ์ฒ์ ์๊ฐํด๋ณธ ๊ฒ ๊ฐ์์! ๋ฐ๋ก ์ ์ฉํด๋ณด๊ฒ ์ต๋๋ค! ํผ๋๋ฐฑ ๊ฐ์ฌํฉ๋๋ค๐
src/main/java/domain/Side.java
Outdated
| public enum Side { | ||
| CHO, | ||
| HAN, | ||
| NONE; |
There was a problem hiding this comment.
NONE์ ๊ฒฝ์ฐ ์ด๋ค ๊ฒฝ์ฐ์ ๋ฐ์ํ ์ ์๋๊ฑธ๊น์? ๐ค
There was a problem hiding this comment.
ํผ๋๋ฐฑ ๊ฐ์ฌํฉ๋๋ค! ๐
์ฒ์์ Side.NONE์ ๋ ์ด์ ๋ Empty ์นธ์ ์ง์์ ๋ช ์ํด์, getSide() ํธ์ถ์ด๋ ์ง์ ๋น๊ต ์ NullPointerException์ ์๋ฐฉํ๋ ค๋ ๋ชฉ์ ์ด์์ต๋๋ค.
๋ค๋ง ํฌ๋ฃจ๋ค๊ณผ ๋ ผ์ํด๋ณด๋, Empty๋ ๋ณธ์ง์ ์ผ๋ก ๊ธฐ๋ฌผ์ด ์๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ ์์์ ์ง์ ๊ฐ์ ๊ฐ๋ ๊ฒ๋ณด๋ค side = null์ด ๋๋ฉ์ธ ์๋ฏธ์ ๋ ์์ฐ์ค๋ฝ๋ค๋ ๊ฒฐ๋ก ์ ๋ด๋ ธ์ต๋๋ค. ๊ทธ๋์ ํ์ฌ๋ Side.NONE์ ์ ๊ฑฐํ๊ณ isSameSide() ์ค์ฌ์ผ๋ก ๋น๊ตํ๋๋ก ์์ ํ์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ๋ง์ํด์ฃผ์ ๊ฒ์ฒ๋ผ ์ฌ์ ํ side.equals()๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ง์ ์ด ๋จ์ ์์ด null ์์ ์ฑ ๋ฆฌ์คํฌ๊ฐ ์์ ํ ์ฌ๋ผ์ง ๊ฒ์ ์๋๋๋ค.
๋๋ฉ์ธ ์๋ฏธ(Empty์ null)์ ์์ ์ฑ(null ๋ฐฉ์ง) ์ฌ์ด์์, ๋กํค๋ผ๋ฉด Side.NONE์ผ๋ก ์์ ์ฑ์ ์ฐ์ ํ์ค์ง, ์๋๋ฉด null์ ํ์ฉํ๋ ์ํ์ ์ถ๊ฐ์ ์ผ๋ก ํต์ ํ์ค์ง ํผ๋๋ฐฑ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค! ๐๐ป
There was a problem hiding this comment.
PieceType์ด ๊ธฐ๋ฌผ ์์ฑ ์ฑ
์๊น์ง ๊ฐ์ง๋ ํ์ฌ ๊ตฌ์กฐ๋, ์ด๋ฒ ๋ฏธ์
๊ท๋ชจ์์๋ ์ถฉ๋ถํ ์์ฐ์ค๋ฌ์ด ์ ํ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๐๐
์ฌ์ฉํ๋ ์ชฝ์์ ๊ตฌ์ฒด์ ์ธ ์์ฑ ๋ฐฉ์๊ณผ ์ ๋ต์ ๋ชฐ๋ผ๋ ๋๋ค๋ ์ฅ์ ์ด ๋ถ๋ช
ํด์, ์ง๊ธ ๋จ๊ณ์์ ๋ณ๋ Factory๋ฅผ ๋๋ ๊ฒ์ด ๊ผญ ๋ ๋จ์ํ๋ค๊ณ ๋ณด์ด์ง๋ ์์์. ๋ค๋ง ์์ฑ ์ ์ฑ
์ด ๋ ๋ณต์กํด์ง๋ค๋ฉด enum์ด ๋น๋ํด์ง ์ ์์ผ๋, ๊ทธ ์์ ์๋ ์ฑ
์ ๋ถ๋ฆฌ๋ฅผ ๋ค์ ๊ณ ๋ฏผํด๋ณผ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.

์ฒดํฌ ๋ฆฌ์คํธ
test๋ฅผ ์คํํ์ ๋, ๋ชจ๋ ํ ์คํธ๊ฐ ์ ์์ ์ผ๋ก ํต๊ณผํ๋์?์คํ ์ ์ ์ ์ฌํญ
1. ์ฝ์์ ํฐํธ๋ฅผ D2Coding์ผ๋ก ์ค์ ํด์ฃผ์ธ์.
D2Coding ํฐํธ๊ฐ ์๋๋ผ๋ฉด, ์ฅ๊ธฐํ๊ณผ ์ฅ๊ธฐํ ์ขํ์ ์์น๊ฐ ์ด๊ธ๋๊ฒ ์ถ๋ ฅ๋ ์ ์์ต๋๋ค.
2. ์ฅ๊ธฐํ์ ์๋จ์ด ํ, ํ๋จ์ด ์ด์์.
์ ๋ ฅ ์ขํ ๊ธฐ์ค์ ์ถ๋ ฅ๋ ๋ณด๋ ๊ธฐ์ค ๊ทธ๋๋ก์ด๋ฉฐ,
y=1์ด ํ,y=10์ด ์ด์ ๋๋ค.3. ์ขํ ์ ๋ ฅ์ ๋ฐ๋์ ์ซ์๋ก ์ ๋ ฅํด์ฃผ์ธ์.
ํ์ฌ ์ขํ ์ ๋ ฅ์
Scanner.nextInt()๋ฅผ ์ฌ์ฉํ๊ณ ์์ด, ๋ฌธ์ ์ ๋ ฅ ์InputMismatchException์ผ๋ก ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ฉ๋๋ค.์ด๋ค ๋ถ๋ถ์ ์ง์คํ์ฌ ๋ฆฌ๋ทฐํด์ผ ํ ๊น์?
1. ์ด๋ ๊ท์น ๊ฒ์ฆ ์ฑ ์ ๋ถ๋ฆฌ ๊ตฌ์กฐ์ ์ ์ ์ฑ
Board.movePiece์์ ํด/์์ ๊ถ/๊ฒฝ๋ก/๋ชฉ์ ์ง ๊ฒ์ฆ์ ์ํํ๊ณ , ์ค์ ์ด๋ ๊ฐ๋ฅ ๊ฒฝ๋ก ๊ณ์ฐ์MovementStrategy(PathMovement, LinearMovement)๋ก ๋ถ๋ฆฌํ์ต๋๋ค.์ด ์ฑ ์ ๋ถ๋ฆฌ๊ฐ ์ ์ง๋ณด์/ํ์ฅ ์ธก๋ฉด์์ ์ ์ ํ์ง ํผ๋๋ฐฑ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค:)
2. ์์ธ ๋ฉ์์ง ์ผ๊ด์ฑ๊ณผ ์ ๋ ฅ ์์ ์ฑ
๋๋ฉ์ธ ์์ธ ๋ฉ์์ง๋ฅผ ์ค์ฌ์ผ๋ก ์ฌ์ฉ์์๊ฒ ์ถ๋ ฅ์ ํ๊ณ ์๋๋ฐ, ๋ฉ์์ง์ ์๋ฏธ/์ ํ์ฑ์ด ์ถฉ๋ถํ์ง์
์ ๋ ฅ ํ์ฑ(
nextInt) ์์ธ ์ฒ๋ฆฌ๋ฅผ View/Controller/Domain ์ด๋์์ ๋ด๋นํ๋ ๊ฒ ์ข์์ง ์๊ฒฌ ๋ถํ๋๋ฆฝ๋๋ค!3. ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง์ ์ ์ ์ฑ
๊ธฐ๋ฌผ๋ณ ์ด๋ ๊ท์น๊ณผ ๋ณด๋ ์ด๋ ์ผ์ด์ค๋ ํ ์คํธํ์ง๋ง, ์ฝ์ ์ ๋ ฅ(๋ฌธ์ ์ ๋ ฅ ๋ฑ)๊ณผ ์ฅ๊ธฐ ์งํ ํตํฉ ์๋๋ฆฌ์ค๋ ๋ถ์กฑํฉ๋๋ค.
ํ ์คํธ ๋ณด๊ฐ์ด ํ์ํ ์์ญ์ ์ง์ด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค!
๋ฆฌ๋ทฐ์ด์๊ฒ
์๋ ํ์ธ์ ๋กํค!
์ด๋ฒ ๋ฆฌ๋ทฐ์ด๋ก ์ฐธ์ฌํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค :)
ํธํ์ค๋ ๋ฆฌ๋ทฐ ํด์ฃผ์๋ฉด ์ ๋ ๋น ๋ฅด๊ฒ ํผ๋๋ฐฑ ๋ฐ์ํ๊ฒ ์ต๋๋ค!
์ข์ ํ๋ฃจ ๋์ธ์๐