DevLog ๐ถ
[์ฐ์ํํ ํฌ์ฝ์ค] 5๊ธฐ ๋ฐฑ์๋ 2์ฃผ์ฐจ ํ๋ฆฌ์ฝ์ค ํ๊ณ ๋ก ๋ณธ๋ฌธ
[์ฐ์ํํ ํฌ์ฝ์ค] 5๊ธฐ ๋ฐฑ์๋ 2์ฃผ์ฐจ ํ๋ฆฌ์ฝ์ค ํ๊ณ ๋ก
dolmeng2 2022. 11. 10. 00:20- ๋ฒ์จ 2์ฃผ์ฐจ ๋ง๋ฌด๋ฆฌ...? ์๊ฐ์ด ๋๋ฌด ๋นจ๋ผ์ ๋ฏฟ๊ธฐ์ง ์๋๋ค. ์ค๋ ํ๋ฃจ ํ๊ณ ๋ ํจ๊ป ์ฌ๋ฉด์ ๋ค์ 3์ฃผ์ฐจ ๋ฌ๋ฆด ์ค๋นํด์ผ์ง...๐ต๐ซ
| 1์ฃผ์ฐจ ํ๊ณ ๋ก
[์ฐ์ํํ ํฌ์ฝ์ค] 5๊ธฐ ๋ฐฑ์๋ 1์ฃผ์ฐจ ํ๋ฆฌ์ฝ์ค ํ๊ณ ๋ก
- 2์ฃผ์ฐจ๊ฐ ๋๋์์ผ ์์ฑํ๋ 1์ฃผ์ฐจ ํ๋ฆฌ์ฝ์ค ํ๊ณ ๋ก...(?) - 1์ฃผ์ฐจ์๋ ์ ์ ์์ด ๊ตฌํํ๊ณ ์ปค๋ฐํ๊ณ ๋ฆฌํฉํ ๋งํ๊ณ ๊ทธ๋ฌ๋๋ผ ํ ์ฃผ๊ฐ ๊ฐ๋์ง๋ ๋ชจ๋ฅด๊ฒ ๋๋ฌ๋ ๊ฒ ๊ฐ๋ค. ๋ค๋ฅธ ๋ถ๋ค์ด ๋งค์ฃผ ํ๊ณ ๋ก์
cl8d.tistory.com
| 2์ฃผ์ฐจ ์ฝ๋
GitHub - Cl8D/java-baseball: ์ซ์ ์ผ๊ตฌ ๊ฒ์ ๋ฏธ์ ์ ์งํํ๋ ์ ์ฅ์
์ซ์ ์ผ๊ตฌ ๊ฒ์ ๋ฏธ์ ์ ์งํํ๋ ์ ์ฅ์. Contribute to Cl8D/java-baseball development by creating an account on GitHub.
github.com
- ์๋ฌด๋ ์ฝ๋ ๋ฆฌ๋ทฐ... ํด์ฃผ์๋ฉด ์ข๊ฒ ๋ค... ๐
- ๋ค์ ์ง๋ฃจํ ์ ์๋ ํ๊ณ ๋ก์ ํ๊ธฐ์ํค๋ ์ฌ๋ฐ๋ ์ด๋ฏธ์ง.
| 2์ฃผ์ฐจ ์ปค๋ฐ ๊ธฐ๋ก ์ดํด๋ณด๊ธฐ
- 2์ฃผ์ฐจ๋ 1์ฃผ์ฐจ์ ๋นํด์ ์ปค๋ฐ์ ๊ฐ๋ณ๊ฒ ๊ฐ์ ธ๊ฐ๋ ค๊ณ ๋ ธ๋ ฅํ๋ค.
'๊ธฐ๋ฅ ๋จ์์ ์ปค๋ฐ'์ ํ๋ ค๊ณ ํ๋ค ๋ณด๋๊น ์คํ๋ ค ํ ๋ฒ ์ปค๋ฐํ ๋ ๋ ์ ์คํ๊ฒ ํด์ ๊ทธ๋ฐ์ง ๋ค๋ฆ๊ฒ ์์ ํ ์ผ์ด ๋ณ๋ก ์์๋ค.
- ์ฌ์ค ๊ณผ์ ์์ํ ๋๋ง๋ค ๋ ๊ณ ๋ฏผํ๋ค. ์... ์ด๊ฑฐ ๊ทธ๋ฅ ํ๊ธ๋ก ์ธ๊น?
๊ฐ๋ ํํ๊ณ ๋ฅผ ๋๋ฆฌ๋ฉด์๊น์ง ์์ด๋ก ์ปค๋ฐํ๋ ๋ด๊ฐ ๋๋ฌด ์ซ์ง๋ง... ์ญ์ ์์ด๋ก ์ฐ๋ ๊ฒ ๋ฉ์๋ค.
- ํ์ง๋ง ์์ฌ์ฐ๋๊น body์๋ ํ๊ธ๋ก ์ผ๋ค. ๋ถ์กฑํ ์์ด ์ปค๋ฐ์ ์ฑ์์ฃผ๋ ํ๊ธ ๋ฉ์์ง๋ผ๊ณ ์๊ฐํ๋ฉด์ ์ปค๋ฐ ์ค...
- ๋! ๋ค์ง๊ณ ์ง ํธ์ํ๋ ์ต๊ด์ ๋ฒ๋ ธ๋ค. ์ด๋ฒ ๊ณผ์ ๋๋ ๋ง๊ฐ ๋ ํ ๋ฒ์ ํธ์๋ฅผ ๋ ๋ ธ๋ค...
์๊ฒฉ ์ ์ฅ์์ ์ฌ๋ผ๊ฐ ๊ฑด ์์ ํ ์ ์๋ค๋ ๊ฑธ ๋ ๋ช ์ฌํ๊ณ ๋ช ์ฌํ ๊ฒ.
| ํจํค์ง ๊ตฌ์กฐ
- 2์ฃผ์ฐจ๋ ํ๋์ '์ซ์ ์ผ๊ตฌ ๊ฒ์' ์ด๋ผ๋ ํฐ ์ฃผ์ ์์์ ์์ฑํ ์ฝ๋์ฌ์ ํจํค์ง ๋ถ๋ฆฌ๋ถํฐ ๊ณ ๋ฏผ์ ์์ํ๋ค.
- ์ฌ์ค 4๊ธฐ ๋ฐฑ์๋ ์ง์์๋ถ๋ค์ ์ฝ๋ ํจํด๋ ๊ตฌ๊ฒฝํ์๋๋ฐ, MVC ๊ตฌ์กฐ๋ฅผ ์ฑํํ์ ๋ถ์ด ๋ง์์ ์ ๊น ๊ณ ๋ฏผํ๋ค.
ํ์ง๋ง...! MVC ๋ณด๋ค๋ ์กฐ๊ธ ๋ ์๋ฐ ํ๋ก๊ทธ๋๋ฐ๋ค์ด ์ฝ๋๋ฅผ ์ง๊ณ ์ถ์๊ณ , ๋ฌด์๋ณด๋ค ์ปจํธ๋กค๋ฌ์ ๋ชจ๋ธ ์ ์๊ฐ ์กฐ๊ธ ๊น๋ค๋ก์ธ ๊ฒ ๊ฐ์ ๊ทธ๋ฅ ํจ์ค.
- ๊ฒฐ๊ณผ์ ์ผ๋ก๋ ์์ ํจํค์ง, ์ ํธ ํจํค์ง, ๊ฒ์ฆ ํจํค์ง, ๋ฉ์ธ ํจํค์ง๋ก ๋๋์๋ค.
BaseballGame ํด๋์ค๋ ์ธ๋ถํ์์ผ์ ๋๋์ง ๋ง์ง ์์ฒญ ๊ณ ๋ฏผํ๋ค๊ฐ... '์ผ๊ตฌ ๊ฒ์'์ ์งํํ๋ ํ๋์ ํด๋์ค๋ผ๋ ์๊ฐ์ด ๋ค์ด์ ๊ทธ๋ฅ ๊ทธ๋๋ก ๋์๋ค.
์๋ง ์์ / ์ ํธ / ๊ฒ์ฆ์ ๋ค์ ๊ณผ์ ์์๋ ๊ทธ๋๋ก ์ฌ์ฉํ์ง ์์๊น ์ถ๋ค.
| ์ด๊ธฐ ์ค๊ณ ์ฝ๋
- ์ด๊ธฐ์ ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ๋ณ๋์ ๋ถ๋ฆฌ ์์ ์์ด ํ๋ฒ์ ์์ฑํ ์ฝ๋์ด๋ค.
package baseball;
import camp.nextstep.edu.missionutils.Console;
import camp.nextstep.edu.missionutils.Randoms;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class Application {
public static void main(String[] args) {
System.out.println("์ซ์ ์ผ๊ตฌ ๊ฒ์์ ์์ํฉ๋๋ค.");
String restart = "1";
// TODO ๋ณ์ ์ด๋ฆ ์ฒดํฌ
// TODO ๋ฉ์๋ ๋ถ๋ฆฌ
while (restart.equals("1")) {
// 1~9๊น์ง์ ์ซ์๋ก ์ด๋ฃจ์ด์ง 3๊ธ์ ๋ง๋ค๊ธฐ
// ์๋ก ๋ค๋ฅธ ์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค๋ ๊ฒ์ด ํน์ง
List<Integer> computer = new ArrayList<>();
while (computer.size() < 3) {
int randomNumber = Randoms.pickNumberInRange(1, 9);
if (!computer.contains(randomNumber)) {
computer.add(randomNumber);
}
}
// ๊ฐ์ ์๊ฐ ์์ ์์ = ๋ซ์ฑ
List<Integer> userNum;
while (true) {
userNum = new ArrayList<>();
int strike = 0, ball = 0;
System.out.print("์ซ์๋ฅผ ์
๋ ฅํด์ฃผ์ธ์ : ");
// TODO ์ฌ์ฉ์๊ฐ 3๊ธ์๊ฐ ์๋ ์๋ฅผ ์
๋ ฅํ์ ๋ ์ฒดํฌ -> ์์ธ ์ฌํญ ๋ฐ์
String[] input = Console.readLine().split("");
if (input.length != 3) {
throw new IllegalArgumentException("3๊ธ์ ์
๋ ฅํ์ธ์");
}
// TODO ๊ผญ ์ด๋ฐ ์์ผ๋ก ๋ฃ๋ ๊ฒ ๋ง๋...?
for (String s : input) {
if(!userNum.contains(Integer.parseInt(s))) {
userNum.add(Integer.parseInt(s));
}
}
if (userNum.size() != 3) {
throw new IllegalArgumentException("์๋ก ๋ค๋ฅธ 3๊ธ์๋ฅผ ์
๋ ฅํ์ธ์.");
}
// TODO ์ซ์๋ ์์ํ ํ์ (๊ตณ์ด ์ด๋ ๊ฒ ๋ฐ๋ณต๋ฌธ ๋์์ผ ๋๋์ง ์ฒดํฌ)
for (int i = 0; i < 3; i++) {
// ๊ฐ์ ์๊ฐ ๊ฐ์ ์๋ฆฌ = ์คํธ๋ผ์ดํฌ
if (Objects.equals(computer.get(i), userNum.get(i))) {
strike++;
continue;
}
// ๊ฐ์ ์๊ฐ ๋ค๋ฅธ ์๋ฆฌ = ๋ณผ
if (computer.contains(userNum.get(i))) {
ball++;
}
}
// ๊ฒฐ๊ณผ ์๋ดํ๋ ๋ฉ์๋
StringBuilder answer = new StringBuilder("");
if (ball == 0 && strike == 0) {
System.out.println("๋ซ์ฑ");
continue;
}
if (ball != 0) {
answer.append(ball).append("๋ณผ ");
}
if (strike != 0) {
answer.append(strike).append("์คํธ๋ผ์ดํฌ");
}
System.out.println(answer.toString().trim());
if (strike == 3) {
System.out.println("3๊ฐ์ ์ซ์๋ฅผ ๋ชจ๋ ๋งํ์
จ์ต๋๋ค! ๊ฒ์ ์ข
๋ฃ");
System.out.println("๊ฒ์์ ์๋ก ์์ํ๋ ค๋ฉด 1, ์ข
๋ฃํ๋ ค๋ฉด 2๋ฅผ ์
๋ ฅํ์ธ์.");
restart = Console.readLine();
break;
}
}
}
}
}
- ์ฌ์ค ๊ธฐ๋ฅ์ด ์ด๋ ค์ด ๊ฑด ์๋์ด์ ์ฝ๋ ์ง๋ ๊ฑด ์ ๋ง ์ผ๋ง ์ ๊ฑธ๋ ธ๋ค. 30๋ถ?
๋ค๋ง... ๋ง์ง๋ง์ ๋ฌดํ์ผ๋ก ์ฆ์ํ } << ์ด ์น๊ตฌ๋ฅผ ๋ณด๋ฉด ์ ๋ง ์ฐธ์ ์๊ฐ ์๋ค. ์ด ์ํ๋ก ์ฐํ ์ฝ ์ ์ถํ์ผ๋ฉด ์๋ง ๋์ฅ์ด๊ฒ ์ง...
๊ทธ๋๋ ์ด๋ ๊ฒ ์ด๊ธฐ ์ค๊ณ ์งํํ๋ฉด์ ์ฒดํฌํด์ผ ๋๋ ๋ถ๋ถ ์ฐพ๊ณ , ๊ทธ ๋ค๋ก ์กฐ๊ธ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋ฆฌํฉํ ๋ง์ ํ๋ค ๋ณด๋ฉด ๊ธฐ๋ฅ ๋ถ๋ฆฌ๊ฐ ์ฌ์์ง๋ค.
ํ์ง๋ง! ์ด์ ๋ ์ด๋ ๊ฒ ์ด๊ธฐ ์ฝ๋ ์์ด, 3์ฃผ์ฐจ๋ถํฐ๋ ๋ฐ๋ก ๊ธฐ๋ฅ ๋ช ์ธ ์์ฑ > ์ฝ๋ ๊ตฌํ ๊ตฌ์กฐ๋ก 5์๊ฐ ๋ด์ ๋๋ด๋ณผ ์์ ์ด๋ค. ํ์ด๋์ฒ๋ผ!
| MessageConst / NumberConst
- ๋ง ๊ทธ๋๋ก ์์๋ฅผ ๊ด๋ฆฌํ๋ ํด๋์ค์ด๋ค. ํ๋๋ ๋ฉ์์ง, ํ๋๋ ์ซ์ ๊ด๋ จ.
package baseball.constant;
/**
* ๋ฉ์์ง ๊ด๋ จ ์์ ๊ด๋ฆฌ ํด๋์ค
*/
public final class MessageConst {
public static final String START_GAME_MSG = "์ซ์ ์ผ๊ตฌ ๊ฒ์์ ์์ํฉ๋๋ค.";
public static final String INPUT_MSG = "์ซ์๋ฅผ ์
๋ ฅํด์ฃผ์ธ์ : ";
public static final String BALL = "๋ณผ";
public static final String STRIKE = "์คํธ๋ผ์ดํฌ";
public static final String NOTHING = "๋ซ์ฑ";
public static final String SUCCESS_MSG = NumberConst.INPUT_LENGTH + "๊ฐ์ ์ซ์๋ฅผ ๋ชจ๋ ๋งํ์
จ์ต๋๋ค! ๊ฒ์ ์ข
๋ฃ";
public static final String GAME_CONTROL_MSG = "๊ฒ์์ ์๋ก ์์ํ๋ ค๋ฉด " + NumberConst.RESTART_NUM +
", ์ข
๋ฃํ๋ ค๋ฉด " + NumberConst.EXIT_NUM + "๋ฅผ ์
๋ ฅํ์ธ์.";
public static final String INPUT_LENGTH_EXCEPTION_MSG = NumberConst.INPUT_LENGTH + "๊ธ์๋ฅผ ์
๋ ฅํด ์ฃผ์ธ์.";
public static final String INPUT_RANGE_EXCEPTION_MSG = NumberConst.FIRST_RANGE + "~" +
NumberConst.LAST_RANGE + " ์ฌ์ด์ ๊ฐ์ ์
๋ ฅํด ์ฃผ์ธ์.";
public static final String INPUT_DUPLICATE_EXCEPTION_MSG = "์ค๋ณต๋ ์ซ์๋ ์
๋ ฅํ ์ ์์ต๋๋ค.";
public static final String GAME_CONTROL_EXCEPTION_MSG = NumberConst.RESTART_NUM + "(์ฌ์์) ํน์ " +
NumberConst.EXIT_NUM + "(์ข
๋ฃ)๋ฅผ ์
๋ ฅํด ์ฃผ์ธ์.";
}
package baseball.constant;
/**
* ์ซ์ ๊ด๋ จ ์์ ๊ด๋ฆฌ ํด๋์ค
*/
public final class NumberConst {
public static final Integer RESTART_NUM = 1;
public static final Integer EXIT_NUM = 2;
public static final Integer INPUT_LENGTH = 3;
public static final Integer FIRST_RANGE = 1;
public static final Integer LAST_RANGE = 9;
public static final Integer MAX_STRIKE = 3;
}
- ์ฒ์ ๊ตฌํํ์ ๋๋ ๋ด๋ถ๋ง static final๋ก ์ง์ ํด๋๊ณ ํด๋์ค๊น์ง๋ ์ ํ๋๋ฐ, ์ด์ฐจํผ ์์ ๊ด๋ฆฌ ํด๋์ค๋ฉด final๋ก ๊ด๋ฆฌํ๋ ๊ฒ ์ข์ ๊ฒ ๊ฐ์์ ๋ณ๊ฒฝํ๋ค.
๋ค์์๋ enum์ ์ฌ์ฉํด๋ณผ๊น ์๊ฐ ์ค! ํ์คํ ์ซ์๋ ๋ฉ์์ง๋ ์์๋ก ๊ด๋ฆฌํด๋๋ ๊ฒ ๊น๋ํด์ ์ข์ ๊ฒ ๊ฐ๋ค.
| ComputerUtil
- ์ปดํจํฐ๊ฐ ํ๋ ์ผ์ ๊ด๋ฆฌํ๋ ํด๋์ค. ์ฌ์ค ์ด ๋ถ๋ถ์ ์์ ์ฝ๋๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค.
package baseball.util;
import camp.nextstep.edu.missionutils.Randoms;
import java.util.ArrayList;
import java.util.List;
/**
* ์ปดํจํฐ ์ธก์์ ์ฌ์ฉ๋๋ ์ ํธ ํด๋์ค
*/
public class ComputerUtil {
/**
* ์ปดํจํฐ๊ฐ ์ฌ์ฉํ 3์๋ฆฌ ์ซ์๋ฅผ ๋ง๋ค์ด๋ด๋ ๋ฉ์๋
*/
public List<Integer> generateNumber() {
List<Integer> computerNums = new ArrayList<>();
while (computerNums.size() < 3) {
int randomNum = Randoms.pickNumberInRange(1, 9);
if (!computerNums.contains(randomNum)) {
computerNums.add(randomNum);
}
}
return computerNums;
}
}
- ์ฌ๊ธฐ์ ์ฝ๋ ์ ํ์ ๊ฑด ์ด์ ๊ฐ ์ฌ์ค ๊ถ๊ธํ์๋๋ฐ, ํ ์คํธ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ๊ทธ๊ฒ ๋ง๋ํ ํด๊ฒฐ๋๋ค. ์ด๊ฑด ํ์ ํ ์์ !
| UserUtil
- ์ฌ์ฉ์๊ฐ ํ๋ ์ผ์ ๊ด๋ฆฌํ๋ ํด๋์ค. ์ฌ๊ธฐ๋ ๋ฏธ์ ์์ ์ฃผ์ด์ง๋๋ก ์ฌ์ฉํ๋ค.
package baseball.util;
import camp.nextstep.edu.missionutils.Console;
/**
* ์ฌ์ฉ์ ์ธก์์ ์ฌ์ฉ๋๋ ์ ํธ ํด๋์ค
*/
public class UserUtil {
/**
* ์ฌ์ฉ์๋ก๋ถํฐ ๊ฐ์ ์
๋ ฅ๋ฐ๋ ๋ฉ์๋
*/
public String getInputNumber() {
return Console.readLine();
}
}
- ์ฌ์ค ์ด์ฏค ์ค๋๊น ๊ตณ์ด ์ด๊ฑธ ๋ถ๋ฆฌํ์ด์ผ ๋๋? ์ถ์ ๋ถ๋ถ๋ ์์ง๋ง...! ์์ผ๋ก ๋ฏธ์ ์ด ๋ ์ปค์ง๋ค๋ฉด ๋ฌถ์ ๋ฒ์๋ ๋ ์ปค์ง์ง ์์๊น...
| MessageUtil
- ๋ฉ์์ง์ ๊ด๋ จ๋ ์ผ์ ๋ด๋นํ๋ ์ ํธ ํด๋์ค์ด๋ค. ๋ฉ์์ง ์ถ๋ ฅ์ ๊ดํ ๋ถ๋ถ์ ์ฌ๊ธฐ์ ๋ด์๋ค.
package baseball.util;
import static baseball.constant.MessageConst.*;
/**
* ๋ฉ์์ง ์ถ๋ ฅ์ ๊ด๋ฆฌํ๋ ์ ํธ ํด๋์ค
*/
public class MessageUtil {
public void printInitMsg() {
System.out.println(START_GAME_MSG);
}
public void printInputMsg() {
System.out.print(INPUT_MSG);
}
public void printResultMsg(int ball, int strike) {
StringBuilder result = new StringBuilder("");
if (ball == 0 && strike == 0) {
System.out.println(NOTHING);
return;
}
if (ball != 0) {
result.append(ball).append(BALL).append(" ");
}
if (strike != 0) {
result.append(strike).append(STRIKE);
}
System.out.println(result.toString().trim());
}
public void printSuccessMsg() {
System.out.println(SUCCESS_MSG);
System.out.println(GAME_CONTROL_MSG);
}
}
- ์ฌ๊ธฐ์ ์ ๊ฒฝ์ด ๋ถ๋ถ์ ๋ณผ, ์คํธ๋ผ์ดํฌ ๊ฐ์๋ฅผ ์ถ๋ ฅํด์ฃผ๋ ๋ถ๋ถ์ด๋ค.
๊ฐ์์ ๋ฐ๋ผ์ ์ ์ดํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฐ์ ๋ํด ๊ธฐ๋ฅ์ ๋๋๊น๋ ์ถ์์ง๋ง...
StringBuilder๋ฅผ ํตํด ์กฐ๊ฑด์ ํด๋นํ๋ ๊ฒฝ์ฐ์ ๋ํด์ ๊ฐ์ ์ถ๊ฐํด์ฃผ๊ณ , ํน์ ๋ชฐ๋ผ ๋ง์ง๋ง์ trim์ ๋ฃ์ด์ ์๋์ ๋ถ์ ๊ณต๋ฐฑ์ ์ ๊ฑฐํด์ฃผ์๋ค.
if๋ฌธ์ด ๋๋ฌด ๋ง์ ๊ฒ ์ข ๊ทธ๋ฐ๊ฐ ์ถ์ง๋ง...! ์คํ๋ ค '๊ฒฐ๊ณผ ์ถ๋ ฅ' ์ด๋ผ๋ ํ๋์ ๊ธฐ๋ฅ ๊ด์ ์์ ๋ดค์ ๋ ๋ ์ ํฉํ ๊ฒ ๊ฐ์์ ๋ง์์ ๋ ๋ค.
| InputValidation
- ๊ฒ์ฆ ๊ด๋ จ ๊ธฐ๋ฅ์ ๋ด์ ํด๋์ค์ด๋ค.
package baseball.validation;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import static baseball.constant.MessageConst.*;
import static baseball.constant.NumberConst.*;
/**
* ์
๋ ฅ๊ฐ์ ๋ํ ๊ฒ์ฆ์ ์งํํ๋ ํด๋์ค
*/
public class InputValidation {
/**
* ์ฌ์ฉ์์ ์ซ์ ์
๋ ฅ๊ฐ์ ๋ํ ๋ชจ๋ ๊ฒ์ฆ์ ์งํํ๋ค.
*/
public List<Integer> validateInputNum(String input) {
validateInputLength(input);
List<Integer> inputNums = changeStrToList(input);
validateInputRange(inputNums);
validateInputDuplicated(inputNums);
return inputNums;
}
private List<Integer> changeStrToList(String input) {
return Arrays.stream(input.split(""))
.map(Integer::parseInt)
.collect(Collectors.toList());
}
/**
* ์
๋ ฅ๊ฐ์ ๊ธธ์ด๊ฐ 3์ธ์ง ๊ฒ์ฆํ๋ค.
*
* @param input ์ฌ์ฉ์์ ์
๋ ฅ๊ฐ
*/
public void validateInputLength(String input) {
if (input.length() != INPUT_LENGTH) {
throw new IllegalArgumentException(INPUT_LENGTH_EXCEPTION_MSG);
}
}
/**
* ์
๋ ฅ๊ฐ์ด 1~9 ์ฌ์ด์ ์ซ์์ธ์ง ๊ฒ์ฆํ๋ค.
*
* @param inputNums ์ฌ์ฉ์์ ์
๋ ฅ๊ฐ์ ๊ฐ ์๋ฆฌ๋ฅผ ์ชผ๊ฐ ๋ฆฌ์คํธ
*/
public void validateInputRange(List<Integer> inputNums) {
boolean checkRange = inputNums.stream()
.allMatch(num -> FIRST_RANGE <= num && num <= LAST_RANGE);
if (!checkRange) {
throw new IllegalArgumentException(INPUT_RANGE_EXCEPTION_MSG);
}
}
/**
* ์
๋ ฅ๊ฐ์ ์ค๋ณต๋ ๊ฐ์ด ์กด์ฌํ๋์ง ๊ฒ์ฆํ๋ค.
*
* @param inputNums ์ฌ์ฉ์์ ์
๋ ฅ๊ฐ์ ๊ฐ ์๋ฆฌ๋ฅผ ์ชผ๊ฐ ๋ฆฌ์คํธ
*/
public void validateInputDuplicated(List<Integer> inputNums) {
if (inputNums.stream().distinct().count() != INPUT_LENGTH) {
throw new IllegalArgumentException(INPUT_DUPLICATE_EXCEPTION_MSG);
}
}
/**
* ๊ฒ์ ์งํ์ ์ ์ดํ๋ ์
๋ ฅ๊ฐ์ ๋ํด ๊ฒ์ฆํ๋ค.
*
* @param input ์ฌ์ฉ์์ ์
๋ ฅ๊ฐ
*/
public void validateGameControlInput(int input) {
if (input < RESTART_NUM || input > EXIT_NUM) {
throw new IllegalArgumentException(GAME_CONTROL_EXCEPTION_MSG);
}
}
}
- ์ด ๋ถ๋ถ๋ ๋ก์ง์์ ๊ฝค ์์ ์ ๊ฑฐ์น ๋ถ๋ถ๋ค์ด ์๋ค.
์ฐ์ ์ ๋ ฅ๊ฐ์ด 1~9 ์ฌ์ด์ธ์ง ๊ฒ์ฆํ๋ ๋ถ๋ถ.
-> ์ฌ์ค ์ด๊ธฐ์๋ '์ซ์ input' ์ค์์ 0์ด ์๋ ๊ฒฝ์ฐ๋ง ์ฒดํฌํ ์์ ์ด์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ๋ก ๋ฌธ์/์ซ์๋ฅผ ์ฒดํฌํ๋ ๋ฉ์๋๋ฅผ ๋ง๋ค๋ ค๊ณ ํ๋ค.
๋ฌผ๋ก ์ด ๋ถ๋ถ์ ์ ๊ท์์ ์ฐ๋ฉด ๊ฐ๋จํ๊ฒ ํด๊ฒฐ๋์ง๋ง, ์ค์ํ ๊ฑด ์ ๊ท์์ ๊ฒฐ๊ตญ ํ๋์ '๋ฌธ์'์ ๋ํด์ ์ฒดํฌ๋ฅผ ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ๋ฉ์๋ ๋ด๋ถ ํธ์ถ์ด๋ , ์ธ๋ถ ํธ์ถ์ด๋ ๋ฐ๋ณต๋ฌธ์ ๋์์ค์ผ ํ๋ ๋ถ๋ถ์ด ์๊ธฐ๋ ๊ฒ์ด์๋ค.
for-each ๊ตฌ๋ฌธ์ ์ฌ์ฉํด์ ์ฒ๋ฆฌํ ์ ์๋ ๋ถ๋ถ์ด์ง๋ง, ์กฐ๊ธ ๋ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ํ๊ณ ์ถ์ด์ stream์ ๋ฐ๋ก ์จ๋จน์๋ค.
stream().allMatch()๋ฅผ ํ์ฉํด์ ๊ฐ๊ฐ์ ๊ฐ๋ค์ ๋ํ ์กฐ๊ฑด์ด ์ผ์นํ๋์ง ๊ฒ์ฆ์ด ์ฝ๊ฒ ๊ฐ๋ฅํ๋ ๊ฒ!
๋๋ถ์ 1~9 ์ฌ์ด๋ผ๋ ๊ฒ๋ <=๋ฅผ ํ์ฉํด ๋น๊ตํ ์ ์์ผ๋ ์กฐ๊ธ ๋ ์ง๊ด์ ์ผ๋ก ๊ฐ์ ธ๊ฐ ์ ์์๊ณ , ๋ฌด์๋ณด๋ค ์ฝ๋๊ฐ ์ฌํํด์ ๋ง์์ ๋ ๋ค.
- ๋ค์์ผ๋ก๋ ์ค๋ณต๋ ๊ฐ ๊ฒ์ฆ ๋ถ๋ถ์ด๋ค.
์ฌ์ค ์ด ๋ถ๋ถ๋ ์๋๋ ์ปดํจํฐ๊ฐ ์์ฑํ๋ ๊ฒ์ฒ๋ผ contains๋ฅผ ํตํด ๋ฆฌ์คํธ์ ์ง์ด๋ฃ๊ณ , ๋ฆฌ์คํธ์ ์ฌ์ด์ฆ๊ฐ 3์ธ์ง ์ฒดํฌํ๋ ค๊ณ ํ๋ค.
ํ์ง๋ง, ๊ทธ๋ ๊ฒ ์ง๋ ์ฝ๋๋ ์ฌ์ค ๋ก์ง ์ดํด๋ ๋ณต์กํ๊ณ , ๋ฌด์๋ณด๋ค ์ฝ๋๊ฐ ๊ธธ์ด์ง๋ฉด์ ๋๋ฌด ๋ง์์ ์ ๋ค๊ธฐ ๋๋ฌธ์ ๋ ๋ค์ Stream์ ์ฐพ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐ๊ฒฌํ stream().distinct().count()! ๊ฐ ์์๋ค ์ค์ ์ค๋ณต๋์ง ์์ ๊ฐ๋ค์ ์นด์ดํธํ๊ธฐ ๋๋ฌธ์ ์ฒ์์ ๋ก์ง์ ๊ทธ๋๋ก ๋ฐ๋ผ๊ฐ๋ฉด์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๋ ๊ฒ ๋๋ฌด ๋ง์์ ๋ค์๋ค.
์์ผ๋ก๋ stream... ์ ์ฉํด์ค๊ฒ ๐
| BaseballGame
- ํต์ฌ ๋ก์ง์ด ๋ด๊ธด ๊ฒ์ ํด๋์ค!
package baseball;
import baseball.util.ComputerUtil;
import baseball.util.MessageUtil;
import baseball.util.UserUtil;
import baseball.validation.InputValidation;
import java.util.List;
import static baseball.constant.NumberConst.*;
/**
* ๊ฒ์์ ์ ์ดํ๋ ๋ฉ์ธ ํด๋์ค
*/
public class BaseballGame {
private final UserUtil userUtil = new UserUtil();
private final MessageUtil messageUtil = new MessageUtil();
private final ComputerUtil computerUtil = new ComputerUtil();
private final InputValidation validator = new InputValidation();
private List<Integer> computerNums;
public BaseballGame() {
messageUtil.printInitMsg();
}
public void startGame() {
int gameControlNum = RESTART_NUM;
computerNums = computerUtil.generateNumber();
while (gameControlNum == RESTART_NUM) {
messageUtil.printInputMsg();
String userInput = userUtil.getInputNumber();
List<Integer> userNums = validator.validateInputNum(userInput);
ResultCount result = compareNumber(computerNums, userNums);
int ball = result.ballCount;
int strike = result.strikeCount;
messageUtil.printResultMsg(ball, strike);
gameControlNum = checkStrikeCount(strike);
}
}
private ResultCount compareNumber(List<Integer> computerNums, List<Integer> userNums) {
int ball = 0, strike = 0;
for (int i = 0; i < INPUT_LENGTH; i++) {
int computerNum = computerNums.get(i);
int userNum = userNums.get(i);
if (computerNum == userNum) {
strike++;
continue;
}
if (computerNums.contains(userNum)) {
ball++;
}
}
return new ResultCount(ball, strike);
}
private static class ResultCount {
int ballCount;
int strikeCount;
public ResultCount(int ballCount, int strikeCount) {
this.ballCount = ballCount;
this.strikeCount = strikeCount;
}
}
private int checkStrikeCount(int strike) {
int gameControlInput = RESTART_NUM;
if (strike == MAX_STRIKE) {
messageUtil.printSuccessMsg();
gameControlInput = Integer.parseInt(userUtil.getInputNumber());
validator.validateGameControlInput(gameControlInput);
checkRestartNumAndMakeComputerNum(gameControlInput);
}
return gameControlInput;
}
private void checkRestartNumAndMakeComputerNum(int gameControlInput) {
if (gameControlInput == RESTART_NUM) {
computerNums = computerUtil.generateNumber();
}
}
}
- ๋ฉ์ธ ํด๋์ค์ด๋ค. ์ง๊ธ ์์ ์์ฌ์ด ๊ฑด ๋ฉ์๋๋ฅผ ๋ ๋๋ด์ด์ผ ํ๋๋ฐ ๋ ๋๋ ๊ฑฐ. ํน์ ํด๋์ค๋ผ๊ฑฐ๋?
๊ทธ๋๋ ์์ฑ์๋ฅผ ํตํด์ ์ด๊ธฐ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํด์ฃผ๋ ๋ถ๋ถ์ ์ค๊ณ์ ์ ๋ง์๋จ์ด์ง๋ ๊ฒ ๊ฐ์์ ์ข์๋ค.
- ์ดํ ๋ก์ง์ '์ฌ์ฉ์์ ์ธํ ๊ฒ์ฆ > ๋น๊ต > ์นด์ดํธ > ์คํธ๋ผ์ดํฌ ๊ฐ์ ์ฒดํฌ > ๋ฐ๋ณต' ์ด๊ฒ๋ฟ์ด์ด์ ๊ฐ๋จํ๋ค.
์ ๊ฒฝ์ผ๋ ๋ถ๋ถ์ด๋ผ๊ณ ํ๋ฉด... ์นด์ดํธ ์ ๊ฐ์ ๋ฆฌํดํ์ ๋ ๋ฆฌ์คํธ๋ก ํ ๊ฒ์ธ์ง, ์๋๋ฉด ๋ด๋ถ ํด๋์ค๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง.
์ฒ์์๋ ๊ทธ๋ฅ List.of๋ก ๋ฐํํ๋ ค๊ณ ํ์์ผ๋, ๊ทธ๋ฌ๋ฉด ๊ฐ๊ฐ์ ๊ฐ์ ๋ํ ์ ๋ฌ์ด ๋๋ฌด ๋ถ์กฑํ ๊ฒ ๊ฐ์ ํด๋์ค๋ก ์ฌ์ฉํ์๋ค.
๋ค๋ง... private static inner class๋ฅผ ํ ์คํธ ์ฝ๋์์ ์ด๋ป๊ฒ ์ ๊ทผํด์ผ ๋ ์ง ๋ต์ ๋ชป ๊ตฌํด์ ์ด ๋ถ๋ถ์ ๋ํ ํ ์ฝ๋ฅผ ๋ชป ์ง ๊ฑด ์์ฝ๋ค ใ _ใ
๊ทธ๋ ๋ค๊ณ ์ ๊ทผ ์ง์ ์๋ฅผ ์ด์ด๋ฒ๋ฆฌ๊ธฐ์๋ ์ซ๊ณ ... ์๋ง ๋ฆฌํ๋ ์ ์ผ๋ก ์ด์ผ ํ๋ฉด ๋ ํ ๋ฐ ์ด๊ฑด ์ข ๋ ๊ณ ๋ฏผํด๋ด์ผ ํ ๊ฒ ๊ฐ๋ค.
- ๋ค์์ผ๋ก๋ ์คํธ๋ผ์ดํฌ ํ์ ์ฒดํฌ ๋ถ๋ถ์ด๋ค. ์ฌ์์์ ๋๋ ์ ๋ ์ปดํจํฐ๊ฐ '1ํ ํ์ ์ผ๋ก ์๋ก์ด ์'๋ฅผ ์์ฑํด์ผ ํ๊ธฐ ๋๋ฌธ์,
์ด ๋ถ๋ถ์ ์ด๊ธฐ while๋ฌธ ๋ด์ ์ง์ด๋ฃ๊ธฐ์๋ ๋ฃจํ๊ฐ ๋ ๋๋ง๋ค ์๋ฅผ ์์ฑํ๊ฒ ๋๊ณ , ๊ทธ๋ ๋ค๊ธฐ์๋ ์คํธ๋ผ์ดํฌ = 3์ผ ๋ + ์ฌ์์์ ๋๋ ์ ๋ ์๋ฅผ ์์ฑํด์ผ ํ๋๊น ๋ค๋ฅธ ๊ณณ์์ ๋ฃ์ด์ฃผ๊ธฐ๋ ์ ๋งคํด์ ์ ๊ธฐ์ ๋ฃ์๋ค.
๋ค๋ง ๊ทธ๊ฒ๋ณด๋ค ๋ ์ข์ ๋ฐฉํฅ์ด ์์ง ์์์๊น... ๋ผ๋ ์์ฌ์์ด ๋จ๋ ๊ฑด ์ด์ฉ ์ ์๋ค. ์ด๊ฑด ์ค๊ณ์ ์๋ชป์ด์๊ฒ ์ง ใ
๊ทธ๋๋ if๋ฌธ ๋ด์ if๋ฌธ ๋ฃ๋ ๊ฑด ๋๋ฌด ๋ณด๊ธฐ ์ซ์ด์ ๋ฐ๋ก ๋ฉ์๋๋ก ์ถ์ถํ๋ค. ํ์ผ์์ด ๊ธด ๋ฉ์๋๋ช ์ด์ง๋ง ๊ฐ์ฅ ์ ๋ํ๋๋๊ฑธ....
| ๋๋ฌด๋๋ ์ด๋ ค์ ๋ ํ ์คํธ ์ฝ๋
- ์ฝ์ง์ ์ด๋ง๋ฌด์ํ๊ฒ ํ๋ ํ ์คํธ ์ฝ๋... ๐ ํ์ง๋ง ๊ทธ๋งํผ ์ด๋ฒ ์ฃผ์ฐจ ๊ณผ์ ์์ ๋ฐฐ์ด ์ ์ด ๊ฐ์ฅ ๋ง๋ค.
- ์ฒ์ ํ ์ฝ๋ฅผ ๋ฐ๊ณ ๋๋ ๊ฑด, '์ปดํจํฐ๋ ๋๋คํ๊ฒ ๊ฐ์ ์์ฑํ ํ ๋ฐ, ์ด๋ป๊ฒ ๊ณ ์ ๋ ๊ฒฐ๊ณผ๊ฐ ๋์ค์ง?' ์ด๊ฑฐ์๋ค.
๋ด๋ถ์ ์ธ์๋ ๋ ๋ฌด์์ด๊ณ , run์ ๋ฌด์์ด๋ฉฐ, contains ๋ด๋ถ์ ๊ฐ์ ๋ญ๊ณ , value๋... values๋....?
์ง์ง ๋ญ ์๋ฆฌ์ผ...? ๋ผ๋ ์๊ฐ๋ฟ์ด์๋ค. ๋น์ฐํ๋ค. ํ ์คํธ ์ฝ๋ ์ ๋๋ก ์ง๋ณธ ์ ์ด ์์ผ๋๊น.
๊ทธ๋์ ๋ฐ๋ก ์ฝ๋๋ฅผ ๊น๋ณด๊ธฐ ์์ํ๋ค.
- ์ฐ์ run์ ์ดํด๋ณด๋ฉด ๋ด๋ถ์์ command๋ฅผ ํธ์ถํ๋๋ฐ, ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ๋ ๊ฒ์ฒ๋ผ ์ฝ์์ ๊ฐ์ ๋ฃ์ด์ฃผ๋ ๊ฒ์ด์๋ค. (System.setIn)
- ๊ทธ๋ผ, ์ฒซ ๋ฒ์งธ๋ ์ฌ์ฉ์๊ฐ ์์ฐจ์ ์ผ๋ก ์ ๋ ฅํ ๊ฐ์ด๋ผ๋ ๊ฑฐ๋ผ๋ ๊ฑด ์์๊ณ , ๊ทธ ๋ค์์...?
- ์ฌ๊ธฐ์ output ๋ฉ์๋์ ๋ด๋ถ์์ ์ฐ์ธ captor๋ outputStream์ด๋ค. ์ฆ, ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์จ ๊ฒ!
- ๊ทธ๋ผ ์ฌ๊ธฐ๊น์ง ๋ดค์ ๋ ์๋ฏธํ๋ ๊ฒ ๊ฒฐ๊ตญ, ์ฌ์ฉ์๊ฐ 246 > 135 > 1 > 597 > 589 > 2๋ฅผ ์์ฐจ์ ์ผ๋ก ๋๋ฅธ ๊ฒ์ด๊ณ , ์ถ๋ ฅ์ ๊ฒฐ๊ณผ ๊ฐ์ผ๋ก ๋ซ์ฑ, 3์คํธ๋ผ์ดํฌ, 1๋ณผ 1์คํธ๋ผ์ดํฌ, 3์คํธ๋ผ์ดํฌ, ๊ฒ์ ์ข ๋ฃ๊ฐ ํฌํจ๋์ด ์์์ ์ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด, ๊ทธ ๋ค์ ์ธ์์ธ 1, 3, 5, 5, 8, 9๋...?
- ์ฐ์ ๊น๊ณ ๋ค์ด๊ฐ๋ณด๊ธฐ. ๋ด๋ถ์์ ๋ ๋ค๋ฅธ ํจ์๋ฅผ ํธ์ถํ๋ ๊ฑธ ๋ณผ ์ ์๋ค.
์ด๋, ์ฐ๋ฆฌ๊ฐ ์ปดํจํฐ๊ฐ ๊ฐ์ ์์ฑํ ๋ ์ฌ์ฉํ pickNumberInRange๋ ์ฌ์ฉํ ๊ฒ์ ๋ณผ ์ ์๋ค!
๊ทธ๋์ ๋ค์ ๋ค์ด๊ฐ๋ณด๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ์ธ๋ฐ...
์ฐ์ 1์ฐจ์ ์ผ๋ก ํ์์์์ ๊ฑธ์๋ค๋ ์ ์ ์ ์ ์๊ณ (์ค์ ๋ก ์คํ ๊ฒฐ๊ณผ๊ฐ 10์ด ์ด์์ด๋ฉด ํ ์คํธ๊ฐ ์ข ๋ฃ๋๋ค.)
MockStatic์ ํตํด mocking์ ์งํํ ๊ฒ์ ์ ์ ์๋ค! ๋ฐ๋ก, Randoms.class์ ๋ํด์!
mock.when.thenReturn ๊ตฌ์กฐ๋ when์ผ๋ก ์ฃผ์ด์ก์ ๋ ๋ฆฌํด์ ํ๋ ๊ฑด๋ฐ, ์ด๋ value๋ฅผ ์์์ผ๋ก ์ฌ๋ฌ ๊ฐ์ ๋ฆฌํด๊ฐ์ ์ฃผ๊ณ ์ถ๋ค๋ฉด values์ ๊ฐ์ ํ๋์ฉ ๊บผ๋ด์ ์ฌ์ฉํ๊ฒ ๋๋ค.
์ด๊ฒ ๋ฌด์จ ๋ง์ด๋๋ฉด!
๋์ ์ด๊ธฐ ์๋ฌธ์ '์ปดํจํฐ๋ ๋๋คํ๊ฒ ๊ฐ์ ์์ฑํ ํ ๋ฐ ์ด๋ป๊ฒ ํญ์ ๊ฐ์ ๊ฐ์ด ๋์ถ๋๋๊ฐ?' ์ด์๋ค.
๊ทผ๋ฐ, ์ปดํจํฐ๊ฐ ๋๋คํ๊ฒ ๊ฐ์ ์์ฑํ ๋ ๋ฌด์์ ์ฌ์ฉํ์ง?
- ๋ฐ๋ก, Randoms์ pickNumberInRange๋ฅผ ์ฌ์ฉํ๋ค!
์ฐ๋ฆฌ๋ ์์ mocking ์์ Randoms.class๋ฅผ ํ์ผ์ผ๋ก ์ก์๊ธฐ ๋๋ฌธ์ ํด๋น ํด๋์ค์ static method์ธ pickNumberInRange๋ ํ๊ฒ ๋์์ด๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ์ ๋ฉ์๋๊ฐ ์คํ์ด ๋ ๋ ๋ฆฌํด ๊ฐ์ผ๋ก value ~ values ๋ด๋ถ์ ๊ฐ์ ์ฃผ๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ค์ ํ ์คํธ ์ฝ๋๋ฅผ ๋ณด์.
- ์ฌ๊ธฐ์ ์ฌ์ฉ์๋ 6๋ฒ์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ , ์ค๊ฐ์ 1, 2๊ฐ ๋ผ๋ ๊ฒ์ ๋ณด์์ 1(์ฌ์์), 2(์ข ๋ฃ)๋ฅผ ํธ์ถํ ๊ฒ์ ๋ณผ ์ ์๊ณ ,
์ด๋ ๊ณง 2๋ฒ์ ๊ฒ์์ด ์งํ๋์์ ์ ์ ์๋ ๊ฒฐ๊ณผ์ด๋ค.
2๋ฒ์ ๊ฒ์์ด ์งํ๋๋ค๋ฉด ์ปดํจํฐ๋ ๊ฐ์ ๋ช ๋ฒ ์์ฑํ์๊น? ๋ฐ๋ก 2๋ฒ ์์ฑํ์ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฉด ์ ๋ด๋ถ์ pickNumberInRange ๋ฉ์๋๋ ๋ช ๋ฒ ํธ์ถ๋์๊น? ์ค๋ณต๋ ๊ฐ์ด ๋ค์ด์ค์ง ์์๊ธฐ์ 3๋ฒ์ฉ ์ด 6๋ฒ์ด ํธ์ถ๋์์ ๊ฒ์ด๊ณ , ๋ฆฌํด ๊ฐ์ผ๋ก 1, 3, 5 || 5, 8, 9๋ฅผ ๋ฐ์ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ปดํจํฐ๊ฐ ์์ฑํ ๊ธ์๊ฐ ๋ 135, 589๊ฐ ๋์๋ ๊ฒ์ด๋ค!
์ด๊ฑธ ์๊ณ ๋๋ฌด ๋๋ฌ๋ค. ์, ์ด๋์ ์ฌ์ฉํ๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ๋ผ๊ณ ํ์ ๊ฑฐ๊ตฌ๋... ใ ใ
๋ฌด์๋ณด๋ค ๋๋ ์ ๋ถ๋ถ์ ๊ฐ๊ณผํ๊ณ ๋์ด๊ฐ์ ๋ก์ง ์์ ์ค๋ฅ๋ก ์ธํด ๋ฌดํ๋ฃจํ์ ๊ฑธ๋ ธ์๋ค.
(์ฌ์ : ์ปดํจํฐ๊ฐ ์๋ก์ด ์ซ์ ์์ฑ์ ์ฌ์์ ์์๋ง ํ์ด์ผ ํ๋๋ฐ ์ข ๋ฃ ๋๋ ํด์ค์ - if๋ฌธ์ ๋๋ฝ...
์ข ๋ฃ๊ฐ ๋๋๋ฐ๋ ๊ณ์ ๋ง์ง๋ง ๋ฆฌํด๊ฐ์ธ 9๋ฅผ ๊ฐ์ ธ์ค๋ฉด์ contains ์กฐ๊ฑด์ ์ํด ๋ฆฌ์คํธ์ ๊ฐ์ด ์ฑ์์ง์ง ์์ size๊ฐ ์ฆ๊ฐํ์ง ์์ผ๋ฉด์ ๋ฌดํ๋ฃจํ ๋ฐ์!)
์ด๋์... ์ฝ๋๋ฅผ ๊น๋ณด๋ ์ต๊ด์ด ๋งค์ฐ ์ค์ํ๋ค๋ ๊ฑธ ์์๋ค.
๊ทธ๋ฆฌ๊ณ ํ ์คํธ ์ฝ๋์ ๋๋ฌด ํฅ๋ฏธ๊ฐ ๊ฐ๋ ์๊ฐ์ด์๋ค... ใ _ใ
@Test
@DisplayName("๋ฌธ์์ด์์ ์ ์ ๋ฆฌ์คํธ๋ก ๋ณํ ํ
์คํธ")
void ๋ฌธ์์ด_๋ฆฌ์คํธ_๋ณํ_ํ
์คํธ() throws Exception {
// given
InputValidation inputValidation = new InputValidation();
Method method = inputValidation.getClass().getDeclaredMethod("changeStrToList", String.class);
method.setAccessible(true);
// when
String input = "123";
List<Integer> inputNums = (List<Integer>) method.invoke(inputValidation, input);
// then
List<Integer> correct = new ArrayList<>();
correct.add(1);
correct.add(2);
correct.add(3);
assertThat(inputNums).isEqualTo(correct);
}
- ์๋ฌดํผ, ๋ง์ ๋ค์ก๊ณ ํ ์คํธ ์ฝ๋๋ฅผ ์งฐ๋ค. ์ ์ ํ ์ฝํก์์ ๋ฆฌํ๋ ์ ๊ฐ์ข ๋ดค๋ ๊ฒ ์๊ฐ๋์ private๋ก ์ ์ธ๋ ๋ฉ์๋ ๊ฐ์ ธ์ค๋ ๊ฑด ํค๋งค์ง ์์๋ค...!
.getClass().getDeclaredMethod(method_name, parameter_type) ๊ธฐ์ตํด๋์.
@Test
@DisplayName("์ฌ์ฉ์์ ์
๋ ฅ๊ฐ ๊ธธ์ด ํ
์คํธ")
void ์ฌ์ฉ์_์
๋ ฅ_๊ธธ์ด_ํ
์คํธ() {
// given
InputValidation inputValidation = new InputValidation();
// when
String userCorrectInput = "123";
String userLessInput = "12";
String userMoreInput = "1234";
// then
assertThatCode(() ->
inputValidation.validateInputLength(userCorrectInput))
.doesNotThrowAnyException();
assertThatThrownBy(() ->
inputValidation.validateInputLength(userLessInput))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining(MessageConst.INPUT_LENGTH_EXCEPTION_MSG);
assertThatThrownBy(() ->
inputValidation.validateInputLength(userMoreInput))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining(MessageConst.INPUT_LENGTH_EXCEPTION_MSG);
}
- ์ฌ๊ธฐ์๋ ๊ทธ๋ฅ ์์ธ ํ ์คํธ๋ง ์งํํ๋ค. ์ฌ์ค ํ ์คํธ ์ฝ๋ ๊น๋๋ผ ์๊ฐ์ ๋ง์ด ์ก์๋จน์ด์ ์์ธ๋ฐ์ ๋ชป ํ ๊ฒ ๋ง๋ค....
๊ทธ๋๋ .hasMessageContaining์ ํตํด ๋ฉ์์ง๊น์ง ํจ๊ป ๊ฒ์ฆํด๋ณผ ์ ์์๋ค.
๋๋จธ์ง๋ ๋น์ทํ๋๊น ๋๊ธฐ๊ณ , ๋ค๋ฅธ ํ ์ฝ๋ฅผ ๋ง์ง๋ง์ผ๋ก ์๊ฐํด๋ณด์๋ฉด!
@Test
@DisplayName("์ฌ์์/์ข
๋ฃ ์ ์ฌ์ฉ์์ ์
๋ ฅ๊ฐ ๊ฒ์ฆ ํ
์คํธ")
void ์ฌ์์_์ข
๋ฃ_์_์ฌ์ฉ์_์
๋ ฅ๊ฐ_ํ
์คํธ() throws Exception {
// given
BaseballGame baseballGame = new BaseballGame();
Method method = baseballGame.getClass().getDeclaredMethod("checkStrikeCount", int.class);
method.setAccessible(true);
// when, then
try {
command("3");
method.invoke(baseballGame, NumberConst.MAX_STRIKE);
} catch (InvocationTargetException e) {
assertThat(e.getTargetException())
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining(MessageConst.GAME_CONTROL_EXCEPTION_MSG);
}
}
- ์ฌ๊ธฐ์๋ command๊น์ง ์ฌ์ฉํ๋ค. ์ฌ์ค ๋ด ๋ก์ง ์์ฒด๊ฐ ์คํธ๋ผ์ดํฌ ์นด์ดํธ๊ฐ 3์ผ ๋ ์ฌ์์, ์ข ๋ฃ ๊ฒ์ฆ์ ์ํด์๋ผ๋ฉด ์ฌ์ฉ์๋ก๋ถํฐ ๊ฐ์ ์ ๋ ฅ๋ฐ์์ผ ํ๊ธฐ ๋๋ฌธ์... ์ฐํ ์ฝ ๋ด๋ถ์ ๊ตฌํ๋์ด ์๋ command๋ฅผ ์ฌ์ฉ ๊ฐ์ ธ์๋ค. (์ฌ์ค ์ด ํ ์คํธ ์ฝ๋๋ ๋ง๊ฒ ์ง ์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค...)
์คํํด์ ์ฌ์ฉ์๊ฐ 3์ ์ ๋ ฅํ๋ฉด ์์ธ ๋ฐ์์ํค๊ณ ๋ฉ์์ง ์ ํฐํธ๋ฆฌ๋์ง ํ์ธํ๋ ๊ฑด๋ฐ ์ฌ์ค ์ ๊ฑฐ ๋ช ์ค ์ง๋ ๊ฒ๋ ํผ์ ํท๊ฐ๋ ค ํ๋ค.
์์ง ํ ์คํธ ์ฝ๋๋ ๋๋ฌด ์ด๋ณด์ผ... ๐
| ์๊ฐ
- ๋ง์ฐฌ๊ฐ์ง๋ก ์บก์ณ๋ก ๋์ ํ ์์ .
์๋ฌดํผ ์ด๋ฒ ์ฃผ์ฐจ๋ ๋๋ฌด ๋ฐฐ์ด ๊ฒ๋ ๋ง๊ณ , ์ฝ์งํ ๊ฒ๋ ๋ง์์ ์๊ฐ์ด ํ๋ฑ ๊ฐ๋ค.
๋งค์๊ฐ ์ํ๋ ๋ถ๋ค๋ ๋ง๊ณ , ๊ทธ ๋ชจ์ต์ ์ง์น ์ ๋ ๋๋ฌด๋๋ฌด ๋ง์ ๋์ฌ์ ์ฐํ ์ฝ ๋์ ๋ ์ฌ์ค ๋๋ ค์์ด ๋ ๋ง์์ง๋ง...
์ด์ฐ์ ์ฐ ํด๋ด๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์๋ ๋ชจ์ต์๋ง ์กฐ๊ธ ๋ ์ง์คํ๊ณ ์ ํ๋ค.
์ฒ์ ํ๋ ๊ฑด๋ฐ ๋ชป ํ๋ ๊ฒ ๋น์ฐํ ๊ฑฐ๋๊น!!!!!!! ๊ธฐ์ฃฝ์ง ๋ง์ ์์์์
๊ทธ๋๋! 3์ฃผ์ฐจ์๋ ์กฐ๊ธ ๋ ๋์์ง ๋ด ๋ชจ์ต์ ๊ธฐ๋ํ๋ฉด์... ใ ใ ๋จ์ 2์ฃผ๋ ํ์ดํ !