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์ฃผ๋„ ํŒŒ์ดํŒ…!

 

 

Comments