ํ”„๋ฆฌ์ฝ”์Šค 2์ฃผ์ฐจ ํ›„๊ธฐ: ๋žœ๋ค๊ฐ’ ํ…Œ์ŠคํŠธ ๊ทธ๊ฑฐ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”๊ฑด๋ฐ

2024. 11. 3. 16:30ยท ๐‘๐ž๐ฏ๐ข๐ž๐ฐ
๋ชฉ์ฐจ
  1. 1. ๋žœ๋ค๊ฐ’ ํ…Œ์ŠคํŠธ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?
  2. 2. ์ž…๋ ฅ๊ฐ’ ๊ฒ€์ฆ ์ฑ…์ž„์€ ์–ด๋””์— ๋‘ฌ์•ผ ํ• ๊นŒ?
  3. 3. ์ถœ๋ ฅ์€ ๋ฐ˜๋“œ์‹œ OutputHandler์— ๋„ฃ์–ด์•ผ ํ• ๊นŒ?
  4. 4. ์ฝ”๋“œ๋ฆฌ๋ทฐ ๋ฐ˜์˜ํ•˜๊ธฐ
  5. (1) Rounds์—์„œ ์ถœ๋ ฅ๊นŒ์ง€ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ์–ด์š”.
  6. (2) Game.start() ๋ฉ”์„œ๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์ฑ…์ž„์„ ์ง€๊ณ  ์žˆ์–ด์š”.
  7. (3) ์ •์  ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค์ธ๋ฐ ์ƒ์„ฑ์ž ๋ณดํ˜ธ๊ฐ€ ๋˜์–ด์žˆ์ง€ ์•Š์•„์š”.
  8. (4) ๋„๋ฉ”์ธ ๊ฐ์ฒด ํด๋ž˜์Šค์˜ ์ฑ…์ž„์ด ๋„ˆ๋ฌด ๋งŽ์•„์š”. ๊ฒ€์ฆ์€ ๋ณ„๋„ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒŒ ์ข‹์•„๋ณด์—ฌ์š”.
  9. 5. ๋ฐ˜์˜ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฆฌ๋ทฐ
  10. InputHandler์™€ OutputHandler๋ฅผ staticํ™” ํ•˜์ง€ ์•Š๊ณ  ์ธ์Šคํ„ด์Šคํ™”ํ•œ ์ด์œ ๊ฐ€ ์žˆ๋‚˜์š”?
  11. 6. ๋ฌด์—‡์„ ๋ฐฐ์› ๋‚˜์š”?
  12. (1) ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ๋ฒ•
  13. (2) ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ ์‚ฌ์šฉ๋ฒ•
  14. (3) ์–ธ์ œ static์œผ๋กœ ์„ ์–ธํ•ด์•ผ ํ• ๊นŒ?

ํ”„๋ฆฌ์ฝ”์Šค 2์ฃผ์ฐจ๊ฐ€ ์ง€๋‚˜๊ฐ”๋‹ค. ์ด๋ฒˆ ์ฃผ์ฐจ์—๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊นŒ์ง€ ์ž‘์„ฑํ•ด์•ผ ํ•ด์„œ ์กฐ๊ธˆ ํž˜๋“ค์—ˆ์ง€๋งŒ ๊ทธ๋งŒํผ ์ข‹์€ ๊ฒฝํ—˜์ด์—ˆ๋‹ค. 

๋ฆฌํŒฉํ† ๋ง๊นŒ์ง€ ๋๋งˆ์นœ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ์ง€๋‚œ ์ฃผ์ฐจ์— ๋น„ํ•ด ํด๋ž˜์Šค์˜ ์ˆ˜๊ฐ€ ๋งŽ์•„์ง„๊ฒŒ ๋ˆˆ์— ๋ˆ๋‹ค๐Ÿ˜‚

 

๊ทธ๋Ÿผ ์ด๋ฒˆ ์ฃผ์ฐจ ํšŒ๊ณ ๋„ ์‹œ์ž‘~! แ••( แ› )แ•— 

 

1. ๋žœ๋ค๊ฐ’ ํ…Œ์ŠคํŠธ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

2์ฃผ์ฐจ ๋ฏธ์…˜์—์„œ ๊ฐ€์žฅ ์–ด๋ ค์› ๋˜ ์ ์ด์—ˆ๋‹ค. 0~9 ์‚ฌ์ด์˜ ์ˆ˜๋ฅผ ๋ฌด์ž‘์œ„๋กœ ๋ฝ‘์•„ 4 ์ด์ƒ์ด๋ฉด ์ฐจ๊ฐ€ ์ „์ง„ํ•˜๋Š” ๋ฐฉ์‹์ด์—ˆ๋Š”๋ฐ, ์š”๊ตฌ์‚ฌํ•ญ์— ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๊ตฌํ˜„๊นŒ์ง€ ์žˆ์—ˆ๋‹ค๐Ÿฅน ๋žœ๋ค๊ฐ’์€ ์ปจํŠธ๋กคํ•  ์ˆ˜ ์—†๋Š” ๋ถ€๋ถ„์ด๋ผ ํ…Œ์ŠคํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋‚˜ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ, ๊ฒฐ๊ตญ Car.move() ๋ฉ”์„œ๋“œ์—์„œ ๋žœ๋ค ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ฐ’์„ ์ „๋‹ฌ๋ฐ›๋Š” ํ˜•์‹์œผ๋กœ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.

public Car {
    public void move(int power) {
        if (power >= POWER_THRESHOLD) {
            this.distance++;
        }
    }
}

public CarTest {
	
    @ParameterizedTest
    @ValueSource(ints = {4, 6, 9})
    void ๋ฌด์ž‘์œ„๋กœ_๋ฝ‘์€_๊ฐ’์ด_4_์ด์ƒ์ด๋ฉด_์ „์ง„ํ•œ๋‹ค(int value) {
        car.move(value);
        assertThat(car.getDistance()).isEqualTo(3);
    }
}

 

 

๊ทธ๋Ÿฐ๋ฐ ๋‚˜์ค‘์— ์ฐพ์•„๋ณด๋‹ˆ NumberUtil ์•„์˜ˆ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์„ ์–ธํ•˜๊ณ , ๊ตฌํ˜„์ฒด๋ฅผ ๊ฐˆ์•„๋ผ์šฐ๋Š” ๋ฐฉ์‹์œผ๋กœ๋„ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

public interface NumberUtil {
    public int getNumber();
}

public class Car {
    // ์ค‘๋žต

    private final String name;
    private int distance;
    private final NumberUtil numberUtil;

    // ์ค‘๋žต

    public void move() {
        int power = numberUtil.getNumber();

        if (power >= POWER_THRESHOLD) {
            this.distance++;
        }
    }
}

class CarTest {

    @ParameterizedTest
    @ValueSource(ints = {4, 6, 9})
    void ๋ฌด์ž‘์œ„๋กœ_๋ฝ‘์€_๊ฐ’์ด_4_์ด์ƒ์ด๋ฉด_์ „์ง„ํ•œ๋‹ค(int value) {
        Car car = new Car("pobi", () -> value);
        car.move();
        assertThat(car.getDistance()).isEqualTo(3);
    }
}

 

 

๊ธฐ์กด ๋ฐฉ์‹์€ ์™ธ๋ถ€์—์„œ ๋งค๋ฒˆ RandomUtil์„ ์ด์šฉํ•ด Car์—๊ฒŒ ํ•„์š”ํ•œ ์ˆซ์ž๋ฅผ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„์ฒด๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์€ Car ๊ฐ์ฒด๊ฐ€ ์ง์ ‘ ์ˆซ์ž๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ž์‹ ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค๋Š” ์ ์—์„œ ์ข€ ๋” ์‘์ง‘๋„๊ฐ€ ๋†’์•„์กŒ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์ค‘์— ๋žœ๋ค๊ฐ’์„ ๋ฝ‘๋Š” ๋ฐฉ์‹์ด ๋ณ€๊ฒฝ๋˜์–ด๋„, ๊ตฌํ˜„์ฒด๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฐฉ๋ฒ•์ด ์œ ์—ฐ์„ฑ ์ธก๋ฉด์—์„œ ๋” ๋‚˜์€๊ฒƒ๊ฐ™๋‹ค๐Ÿ‘€

 


2. ์ž…๋ ฅ๊ฐ’ ๊ฒ€์ฆ ์ฑ…์ž„์€ ์–ด๋””์— ๋‘ฌ์•ผ ํ• ๊นŒ?

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

public Car(String name) {
    this.name = validateCarName(name);
    this.distance = 0;
}

private static String validateCarName(String name) {
    validateNotNull(name);
    validateNotBlank(name);
    name = name.strip();
    validateNameLength(name);

    return name;
}

private static void validateNameLength(String name) {
    if (name.length() < MIN_CAR_NAME_LENGTH || name.length() > MAX_CAR_NAME_LENGTH) {
        throw new IllegalArgumentException(
                String.format(INVALID_LENGTH_RANGE_CAR_NAME.getMessage(),
                        MIN_CAR_NAME_LENGTH, MAX_CAR_NAME_LENGTH, name));
    }
}

private static void validateNotBlank(String name) {
    if (name.isBlank()) {
        throw new IllegalArgumentException(BLANK_CAR_NAME.getMessage());
    }
}

private static void validateNotNull(String name) {
    if (name == null) {
        throw new IllegalArgumentException(NULL_CAR_NAME.getMessage());
    }
}

 

๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ๋˜๋ฉด Car ๊ฐ์ฒด๋ฅผ ์ƒ์†ํ–ˆ์„ ๋•Œ ๊ฒ€์ฆ ๋กœ์ง๊นŒ์ง€ ํ•จ๊ป˜ ์ƒ์†๋œ๋‹ค๊ณ  ํ•œ๋‹ค๐Ÿ˜ฑ ๋‹น์—ฐํ•œ ๊ฑด๋ฐ ์™œ ์ƒ๊ฐ์„ ๋ชปํ–ˆ์„๊นŒ...๐Ÿฅน

์‹ฌ์ง€์–ด static ๋ฉ”์„œ๋“œ๋กœ ์„ ์–ธํ•˜๋Š” ๋ฐ”๋žŒ์— ์˜ค๋ฒ„๋ผ์ด๋”ฉ๋„ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋Œ€์ชฝ๊ฐ™์€ ๋ฉ”์„œ๋“œ๊ฐ€ ๋˜์–ด๋ฒ„๋ ธ๋‹ค ^_ใ… 

 

Car ๊ฐ์ฒด์—์„œ๋Š” ์กธ์ง€์— ์ž…๋ ฅ๊ฐ’ ๊ฒ€์ฆ์ด๋ผ๋Š” ์ฑ…์ž„๊นŒ์ง€ ์ง€๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฆฌํŒฉํ† ๋ง ๋•Œ ์ด ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ–ˆ๋Š”๋ฐ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ›„์ˆ ..!

 


3. ์ถœ๋ ฅ์€ ๋ฐ˜๋“œ์‹œ OutputHandler์— ๋„ฃ์–ด์•ผ ํ• ๊นŒ?

public class InputHandler {

    public List<String> getCarNames() {
        System.out.println(CAR_NAME_INPUT_MESSAGE.getMessage());

        String input = Console.readLine();
        return Arrays.stream(input.split(DELIMITER)).toList();
    }

    public Integer getRoundSize() {
        System.out.println(ROUND_SIZE_INPUT_MESSAGE.getMessage());
        String input = Console.readLine();

        validateRoundSize(input);
        return Integer.parseInt(input);
    }
}

 

์ง€๋‚œ ์ฃผ์ฐจ์™€์˜ ์ฐจ์ด์ ! ์ง€๋‚œ ์ฃผ์—๋Š” ์ถœ๋ ฅ์€ ์ „๋ถ€ OutputHandler์—์„œ ๊ด€๋ฆฌํ–ˆ๋Š”๋ฐ, ์ด๋ฒˆ์—” ์ž…๋ ฅ์„ ๋„ฃ์–ด๋‹ฌ๋ผ๋Š” ๋ฉ”์„ธ์ง€๋Š” InputHandler์—์„œ ํ˜ธ์ถœํ–ˆ๋‹คโœจ

 

์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•œ ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” INPUT_MESSAGE ์ถœ๋ ฅ์„ OutputHandler์˜ ๋ฉ”์„œ๋“œ๋กœ ๋ถ„๋ฆฌํ•  ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ฉ”์„ธ์ง€๊ฐ€ ๋‹จ๋…์œผ๋กœ ์ถœ๋ ฅ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด์—ˆ๋‹ค. INPUT_MESSAGE๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์ž…๋ ฅ์€ ์•ˆ๋ฐ›๋Š”๋‹ค๋ฉด? ์ง€๊ธˆ์ด์•ผ ๋‚˜ ํ˜ผ์ž ๊ฐœ๋ฐœํ•˜๋‹ˆ๊นŒ ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š๊ฒ ์ง€๋งŒ ๊ฐœ๋ฐœ ๋‹ด๋‹น ์ธ์›์ด ๋Š˜์–ด๋‚˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ์ง€ ๋ชจ๋ฅด๋Š” ์ผ์ด๋‹ค.

๋˜ ๋…ผ๋ฆฌ์ ์ธ ํ๋ฆ„ ์ƒ InputHandler์—์„œ๋„ ์ด ์ •๋„์˜ ๋ฉ”์„ธ์ง€๋ฅผ ๋„์šฐ๋Š” ๊ฑด ์–ด์ƒ‰ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒˆ์—๋Š” ์ž…๋ ฅ๊ฐ’์„ ๋„ฃ์–ด๋‹ฌ๋ผ๋Š” ์ถœ๋ ฅ์€ InputHandler์— ์œ„์น˜์‹œ์ผฐ๋‹ค.

 


4. ์ฝ”๋“œ๋ฆฌ๋ทฐ ๋ฐ˜์˜ํ•˜๊ธฐ

์ด๋ฒˆ ์ฃผ์ฐจ์—๋Š” ์šฉ๊ธฐ๋‚ด์„œ ๊ธ€์„ ์˜ฌ๋ ค๋ดค๋Š”๋ฐ, ๋ˆˆ ๊นœ๋นกํ•˜๋Š” ์‚ฌ์ด์— ์—„์ฒญ ๋งŽ์€ ๋ถ„๋“ค์ด ์™€์ฃผ์…”์„œ ๊นœ์ง ๋†€๋ž๋‹ค. ๋ˆ„์ถ”ํ•œ ๊ณณ์— ๊ท€ํ•œ ๋ถ„๋“ค์ด...๐Ÿฅน ๊ท€ํ•œ ๋ถ„๋“ค์˜ ํ”ผ๋“œ๋ฐฑ์„ ๋ชจ์•„ ๋ฐ˜์˜ํ•ด๋ณด๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๋‹ค.

๋จผ์ € ๋ฆฌ๋ทฐ์–ด๋ถ„๋“ค๊ป˜์„œ ๋‚จ๊ฒจ์ฃผ์‹  ๊ธ์ •์ ์ธ ํ”ผ๋“œ๋ฐฑ์€ ์•„๋ž˜์™€ ๊ฐ™์•˜๋‹ค. ๋‚˜๋ฆ„ ์‹ ๊ฒฝ์ผ๋˜ ๋ถ€๋ถ„์ธ๋ฐ ๊ท€์‹ ๊ฐ™์ด ์•Œ์•„๋ด ์ฃผ์‹œ๋‹ˆ ๊ธฐ๋ถ„์€ ์ข‹๋„ค์šฉ๐Ÿ€

  • ์ฐธ์—ฌ ์ž๋™์ฐจ ๊ฐœ์ˆ˜์™€, ์ตœ๋Œ€ ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์ œํ•œํ•œ ์ ์ด ์ข‹๋‹ค.
  • @BeforeEach, @ParameterizedTest ๋“ฑ ์ ์ ˆํ•œ ํ…Œ์ŠคํŠธ ์–ด๋…ธํ…Œ์ด์…˜์„ ํ™œ์šฉํ•œ ์ ์ด ์ข‹๋‹ค.
  • ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ ์‚ฌ์šฉ ์‹œ, ๋ฆฌํ„ดํ•  ๋•Œ ๋ฆฌ์ŠคํŠธ ์›๋ณธ์ด ์•„๋‹Œ unmodifiableList()๋กœ ํ•œ๋ฒˆ ๊ฐ์‹ธ์„œ ๋ฐ˜ํ™˜ํ•œ ๊ฒƒ์ด ์ข‹๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณผ๋งŒํ•œ ํ”ผ๋“œ๋ฐฑ์€ ์•„๋ž˜์™€ ๊ฐ™์•˜๋‹ค.

 

(1) Rounds์—์„œ ์ถœ๋ ฅ๊นŒ์ง€ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ์–ด์š”.

public class Rounds {

	private final Integer roundSize;
    
	public void proceedRounds(List<Car> cars, OutputHandler outputHandler) {
        for (int i = 0; i < roundSize; i++) {
            List<String> roundResult = processRound(cars);
            outputHandler.printRoundResult(roundResult);
        }
    }
}

 

Rounds ๊ฐ์ฒด๋Š” ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ์‹œ๋„ ํšŸ์ˆ˜๋งŒํผ ๋ผ์šด๋“œ๋ฅผ ์ง„ํ–‰์‹œํ‚ค๋Š” ํด๋ž˜์Šค์ด๋‹ค. ๋งค ๋ผ์šด๋“œ๊ฐ€ ๋๋‚ ๋•Œ๋ฉด OutputHandler๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ–ˆ๋Š”๋ฐ, ๋„๋ฉ”์ธ ๋ชจ๋ธ์—์„œ ์ถœ๋ ฅ๊นŒ์ง€ ๋‹ด๋‹นํ•œ๊ณ  ์žˆ๋Š”๊ฒƒ๊ฐ™๋‹ค๋Š” ์˜๊ฒฌ์„ ๋ฐ›์•˜๋‹ค.

์ƒ๊ฐํ•ด๋ณด๋‹ˆ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ง‘์ค‘ํ•ด์•ผ ํ•˜๋Š” Rounds ๊ฐ์ฒด์—์„œ OutputHandler๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ์ข‹์•„๋ณด์ด์ง€ ์•Š์•˜๋‹ค. ๋„๋ฉ”์ธ ๋ชจ๋ธ์€ ์—ฌ๋Ÿฌ ๊ตฐ๋ฐ์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ ์ถœ๋ ฅ์„ ์ง์ ‘ ๋‹ด๋‹นํ•˜๋‹ค ๋ณด๋‹ˆ ๊ทธ๊ฒŒ ์–ด๋ ค์›Œ์ง€๊ณ , OutputHandler๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ Rounds๋„ ์˜ํ–ฅ์„ ๋ฐ›์„ ์œ„ํ—˜์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

public List<List<String>> proceedRounds(List<Car> cars) {
    List<List<String>> result = new ArrayList<>();

    for (int i = 0; i < roundSize; i++) {
        List<String> roundResult = processRound(cars);
        result.add(roundResult);
    }

    return result;
}

 

๊ทธ๋ž˜์„œ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์ถœ๋ ฅ์€ Rounds.proceedRounds()๋ฅผ ํ˜ธ์ถœํ•˜๋Š” Game์—์„œ ์™„์ „ํžˆ ๋‹ด๋‹นํ•˜๊ธฐ๋กœ ๊ฒฐ์ •!

 

(2) Game.start() ๋ฉ”์„œ๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์ฑ…์ž„์„ ์ง€๊ณ  ์žˆ์–ด์š”.

public void start() {
    List<String> carNames = inputHandler.getCarNames();
    cars = new Cars(carNames);

    String roundSizeInput = inputHandler.getRoundSize();
    rounds = new Rounds(roundSizeInput);

    outputHandler.printResultMessage();
    rounds.proceedRounds(cars.getCars(), outputHandler);

    List<String> winners = cars.getWinners();
    outputHandler.printWinner(winners);
}

 

Game.start()๊ฐ€ ์กฐ๊ธˆ ๋šฑ๋šฑํ•˜๋‹ค ์‹ถ๊ธด ํ–ˆ๋Š”๋ฐ ์—ญ์‹œ๋‚˜ ์ฝ”๋“œ๋ฆฌ๋ทฐ์—์„œ ๋น„์Šทํ•œ ์˜๊ฒฌ์„ ๋ฐ›์•˜๋‹ค๐Ÿ˜‚ ๋ณ„๋„ ๋ฉ”์„œ๋“œ๋กœ ๋ถ„๋ฆฌํ•ด๋ดค์ž ํ˜ธ์ถœ ๋ށ์Šค๋งŒ ๊นŠ์–ด์งˆ ๊ฒƒ ๊ฐ™์•„์„œ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•˜์ง€๋Š” ์•Š์•˜๋Š”๋ฐ... ์ด์ œ๋ณด๋‹ˆ ๋ถ„๋ฆฌํ•˜๋Š”๊ฒŒ ๋‚˜์„ ๊ฒƒ ๊ฐ™์•„์„œ ๋ถ„๋ฆฌ ๊ฒฐ์ •.

 

 

public void start(NumberUtil numberUtil) {
    getUserInputs(numberUtil);
    processRounds();
    announceWinner();
}

private void getUserInputs(NumberUtil numberUtil) {
    List<String> carNames = inputHandler.getCarNames();
    cars = new Cars(carNames, numberUtil);

    Integer roundSize = inputHandler.getRoundSize();
    rounds = new Rounds(roundSize);
}

private void processRounds() {
    outputHandler.printResultMessage();
    List<List<String>> roundResult = rounds.proceedRounds(cars.getCars());
    roundResult.stream().forEach(result -> outputHandler.printRoundResult(result));
}

private void announceWinner() {
    List<String> winners = cars.pickWinners();
    outputHandler.printWinner(winners);
}

 

๊ทธ๋Ÿฐ๋ฐ ์ด๋Ÿฐ๋‹ค๊ณ  start() ๋ฉ”์„œ๋“œ์˜ ์ฑ…์ž„์ด ์ค„์–ด๋“œ๋Š” ๊ฑธ๊นŒ? ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค. ๋‹จ์ˆœํžˆ ๋ฉ”์„œ๋“œ๋งŒ ๋ถ„๋ฆฌํ–ˆ์„ ๋ฟ์ธ๋ฐ? ์—ฌ์ „ํžˆ start() ๋ฉ”์„œ๋“œ๋Š” ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๋ผ์šด๋“œ ์ง„ํ–‰ ๋ฉ”์„œ๋“œ๋„ ํ˜ธ์ถœํ•˜๊ณ , ์šฐ์Šน์ž ๋ฐœํ‘œ ๋ฉ”์„œ๋“œ๊นŒ์ง€ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๋‹ค. ์ด๊ฑธ ์ฑ…์ž„์ด ์ค„์–ด๋“ค์—ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์„๊นŒ..?๐Ÿค”

 

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

 

 

(3) ์ •์  ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค์ธ๋ฐ ์ƒ์„ฑ์ž ๋ณดํ˜ธ๊ฐ€ ๋˜์–ด์žˆ์ง€ ์•Š์•„์š”.

public class RandomUtil {
    private static final int MIN_VALUE = 0;
    private static final int MAX_VALUE = 10;

    public static int getRandomNumber() {
        return Randoms.pickNumberInRange(MIN_VALUE, MAX_VALUE);
    }
}

 

์™„์ „ํžˆ ๋†“์นœ ๋ถ€๋ถ„ โ€งโบโ—Ÿ( แต’ฬดฬถฬทฬฅฬ ยทฬซ แต’ฬดฬถฬทฬฃฬฅฬ€ ) ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์—์„œ  RandomUtil ํด๋ž˜์Šค๋Š” ์ •์  ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค์—์„œ ๋ฒ—์–ด๋‚˜ RandomNumberUtil์ด๋ผ๋Š” ๊ตฌํ˜„์ฒด๊ฐ€ ๋˜์—ˆ์ง€๋งŒ ์˜๋ฏธ์žˆ๋Š” ํ”ผ๋“œ๋ฐฑ์ด์—ˆ๋‹ค... ๋‹ค์Œ์—๋Š” ๊นŒ๋จน์ง€ ๋ง์ž.

 

(4) ๋„๋ฉ”์ธ ๊ฐ์ฒด ํด๋ž˜์Šค์˜ ์ฑ…์ž„์ด ๋„ˆ๋ฌด ๋งŽ์•„์š”. ๊ฒ€์ฆ์€ ๋ณ„๋„ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒŒ ์ข‹์•„๋ณด์—ฌ์š”.

public class InputHandler {
    private static final String DELIMITER = ",";


    public List<String> getCarNames() {
        System.out.println(CAR_NAME_INPUT_MESSAGE.getMessage());

        String input = Console.readLine();
        List<String> names = Arrays.stream(input.split(DELIMITER)).toList();

        CarsValidator.validateCars(names);
        names.stream().forEach(CarNameValidator::validateCarNames);

        return names.stream()
                .map(String::strip)
                .toList();
    }
}

 

๋ฏธ์…˜์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๊ณ ๋ฏผํ–ˆ๋˜ ๋ถ€๋ถ„๊ณผ ์ด์–ด์ง€๋Š” ํ”ผ๋“œ๋ฐฑ์ด์—ˆ๋‹ค. ๋‹ค๋ฅธ ๋ถ„๋“ค ์ฝ”๋“œ๋ฅผ ๋ฆฌ๋ทฐํ•˜๋‹ค ๋ณด๋‹ˆ ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ณ„๋กœ Validator ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ์‹  ๋ถ„๋“ค์ด ๊ณ„์…”์„œ ๋‚˜๋„ ๊ฐ ๋„๋ฉ”์ธ๋ณ„๋กœ ๊ฒ€์ฆ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ด๋™์‹œ์ผฐ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋‹ˆ ๊ฐ ํด๋ž˜์Šค๋ณ„๋กœ ์ฑ…์ž„์ด ๋ช…ํ™•ํ•ด์„œ ๋งŒ์กฑ์ค‘๐Ÿ˜†

 


5. ๋ฐ˜์˜ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฆฌ๋ทฐ

InputHandler์™€ OutputHandler๋ฅผ staticํ™” ํ•˜์ง€ ์•Š๊ณ  ์ธ์Šคํ„ด์Šคํ™”ํ•œ ์ด์œ ๊ฐ€ ์žˆ๋‚˜์š”?

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

 

static ํ•จ์ˆ˜๋Š” ํด๋ž˜์Šค ๋ ˆ๋ฒจ์— ์„ ์–ธ๋œ๋‹ค. ์ด ๋ง์ธ ์ฆ‰์Šจ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ์ „๋ถ€ํ„ฐ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๊ณ„์† ์กด์žฌํ•˜๊ณ , ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ์—์„œ ๋ฒ—์–ด๋‚˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์—†์ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. (์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ˜ธ์ถœํ•  ๋ฉ”์„œ๋“œ๊ฐ€ ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ๊ฒฐ์ •๋˜๋Š”๋ฐ, static ํ•จ์ˆ˜๋Š” ์ปดํŒŒ์ผ ์‹œ์ ์— ํ˜ธ์ถœ์ด ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)

 

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ๋‚˜๋Š” ์•„๋ž˜์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์—๋งŒ static์„ ์‚ฌ์šฉํ•œ๋‹ค.

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

์ž…์ถœ๋ ฅ๊ฐ’ ํ•ธ๋“ค๋Ÿฌ์˜ ๊ฒฝ์šฐ (1)์˜ ์กฐ๊ฑด์€ ๋งŒ์กฑํ•˜์ง€๋งŒ (2) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ์ด ์•„๋‹Œ Game์—์„œ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค. (3)์˜ ๊ฒฝ์šฐ๋„ ์ง€๊ธˆ์€ ์ฝ˜์†”์—์„œ ์ž…๋ ฅ์„ ๋ฐ›๊ณ  ์žˆ์ง€๋งŒ, ์š”๊ตฌ์‚ฌํ•ญ์ด ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ๋ ์ง€ ๋ชจ๋ฅธ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ–ˆ์„๋•Œ ์กฐ๊ฑด์„ ์ถฉ์กฑ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ฃผ์ž…ํ•ด์ฃผ์—ˆ๋‹ค. ๋ฐ˜์˜ํ•˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ ์ƒ๊ฐํ•ด ๋ณผ ๊ฑฐ๋ฆฌ๊ฐ€ ๋งŽ์€, ์ข‹์€ ํ”ผ๋“œ๋ฐฑ์ด์—ˆ๋‹ค๐Ÿ‘

 


6. ๋ฌด์—‡์„ ๋ฐฐ์› ๋‚˜์š”?

(1) ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ๋ฒ•

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

 

(2) ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ ์‚ฌ์šฉ๋ฒ•

์ž๋™์ฐจ ๋ชฉ๋ก์„ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ• ๊นŒ..! ํ•˜๋‹ค๊ฐ€ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด๋ดค๋‹ค. ์‚ฌ์šฉ ์†Œ๊ฐ์€ ๋Œ€๋งŒ์กฑ~! Game์—์„œ ์ง์ ‘ ์ž๋™์ฐจ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ๋Š” ์šฐ์Šน์ž๋„ Game์—์„œ ๋ฝ‘์•„์•ผ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ๋‚˜๋‹ˆ, ์ž๋™์ฐจ ๋ชฉ๋ก๊ณผ ๊ด€๋ จ๋œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ „๋ถ€ Cars์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์„œ Game ํด๋ž˜์Šค๊ฐ€ ํ•œ๊ฒฐ ๊ฐ€๋ฒผ์›Œ์กŒ๋‹ค. ๋˜ ๋ฐ˜ํ™˜ ์‹œ์—๋Š” ๋ถˆ๋ณ€ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜ํ•ด์„œ ์™ธ๋ถ€์—์„œ ๋ฆฌ์ŠคํŠธ์— ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๊ฑธ ๋ฐฉ์ง€ํ•  ์ˆ˜๋„ ์žˆ์–ด์„œ ์•„์ฃผ ์œ ์šฉํ–ˆ๋‹ค. unmodifiableList์— ๋Œ€ํ•ด์„œ๋Š” ์กฐ๊ธˆ ๋” ์ƒ๊ฐํ•ด๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ...๐Ÿฅน

 

(3) ์–ธ์ œ static์œผ๋กœ ์„ ์–ธํ•ด์•ผ ํ• ๊นŒ?

์‚ฌ์‹ค ์ง€๊ธˆ๊นŒ์ง€๋Š” static์„ ๋А๋‚Œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ์ด๋ฒˆ ๊ธฐํšŒ์— static ์‚ฌ์šฉ์— ๋Œ€ํ•ด ๋ช…ํ™•ํ•œ ๊ธฐ์ค€์„ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด ๊ธฐ์ค€์ด ์˜ณ์€์ง€ ๊ทธ๋ฅธ์ง€์™€๋Š” ๋ณ„๊ฐœ๋กœ ๋‚˜์˜ ์ƒ๊ฐ๊ณผ ๊ธฐ์ค€์ด ์ƒ๊ฒผ๋‹ค๋Š” ์ ์€ ๊ธ์ •์ ์ธ ๋ณ€ํ™”๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๐Ÿ‘€ static์˜ ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ๋„ ๋Œ์•„๋ณผ ์ˆ˜ ์žˆ์—ˆ๋˜ ์ข‹์€ ๊ธฐํšŒ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 


 

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

์•„๋ฌด๋ฆฌ ์ƒ๊ฐํ•ด๋„ ์šฐํ…Œ์ฝ” ๋ฏธ์…˜์€ ์ œ์ถœ์ด ์‹œ์ž‘์ด๊ณ  ๋ฆฌํŒฉํ† ๋ง๊ณผ ํšŒ๊ณ  ์ž‘์„ฑ๊นŒ์ง€๊ฐ€ ์ง„์งœ ๋์ธ๊ฒƒ๊ฐ™๋‹ค๐Ÿ˜‚ ํž˜๋“ค์ง€๋งŒ ์ด์ œ ์ ˆ๋ฐ˜ ์ง€๋‚ฌ์œผ๋‹ˆ๊นŒ ๋‹ค์Œ์ฃผ ๋ฏธ์…˜๋„ ํ™”์ดํŒ…...๐Ÿซ 

 

'๐‘๐ž๐ฏ๐ข๐ž๐ฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

ํ”„๋ฆฌ์ฝ”์Šค 3์ฃผ์ฐจ ํ›„๊ธฐ: getter ์ง€์–‘ํ•ด์•ผ ํ•˜๋Š”๊ฑฐ ์•Œ์ง€๋งŒ ๋„ˆ๋ฌด ํŽธ๋ฆฌํ•ด์š”  (0) 2024.11.11
ํ”„๋ฆฌ์ฝ”์Šค 1์ฃผ์ฐจ ํ›„๊ธฐ: ์˜์กด์„ฑ ์ฃผ์ž…ํ•ด์ฃผ์‹ค ์Šคํ”„๋ง ๊ตฌํ•จ  (1) 2024.10.25
์ž‡์ธ  ์Šคํ„ฐ๋”” ํฌ๋ฃจ ๋ฐœํ‘œํšŒ ํ›„๊ธฐ  (3) 2024.09.21
[์ฑ…] ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด ๋ฆฌ๋ทฐ  (2) 2024.09.14
[์ฑ…] Clean Code(ํด๋ฆฐ ์ฝ”๋“œ) ๋ฆฌ๋ทฐ  (0) 2024.07.10
  1. 1. ๋žœ๋ค๊ฐ’ ํ…Œ์ŠคํŠธ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?
  2. 2. ์ž…๋ ฅ๊ฐ’ ๊ฒ€์ฆ ์ฑ…์ž„์€ ์–ด๋””์— ๋‘ฌ์•ผ ํ• ๊นŒ?
  3. 3. ์ถœ๋ ฅ์€ ๋ฐ˜๋“œ์‹œ OutputHandler์— ๋„ฃ์–ด์•ผ ํ• ๊นŒ?
  4. 4. ์ฝ”๋“œ๋ฆฌ๋ทฐ ๋ฐ˜์˜ํ•˜๊ธฐ
  5. (1) Rounds์—์„œ ์ถœ๋ ฅ๊นŒ์ง€ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ์–ด์š”.
  6. (2) Game.start() ๋ฉ”์„œ๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์ฑ…์ž„์„ ์ง€๊ณ  ์žˆ์–ด์š”.
  7. (3) ์ •์  ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค์ธ๋ฐ ์ƒ์„ฑ์ž ๋ณดํ˜ธ๊ฐ€ ๋˜์–ด์žˆ์ง€ ์•Š์•„์š”.
  8. (4) ๋„๋ฉ”์ธ ๊ฐ์ฒด ํด๋ž˜์Šค์˜ ์ฑ…์ž„์ด ๋„ˆ๋ฌด ๋งŽ์•„์š”. ๊ฒ€์ฆ์€ ๋ณ„๋„ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒŒ ์ข‹์•„๋ณด์—ฌ์š”.
  9. 5. ๋ฐ˜์˜ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฆฌ๋ทฐ
  10. InputHandler์™€ OutputHandler๋ฅผ staticํ™” ํ•˜์ง€ ์•Š๊ณ  ์ธ์Šคํ„ด์Šคํ™”ํ•œ ์ด์œ ๊ฐ€ ์žˆ๋‚˜์š”?
  11. 6. ๋ฌด์—‡์„ ๋ฐฐ์› ๋‚˜์š”?
  12. (1) ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ๋ฒ•
  13. (2) ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ ์‚ฌ์šฉ๋ฒ•
  14. (3) ์–ธ์ œ static์œผ๋กœ ์„ ์–ธํ•ด์•ผ ํ• ๊นŒ?
'๐‘๐ž๐ฏ๐ข๐ž๐ฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • ํ”„๋ฆฌ์ฝ”์Šค 3์ฃผ์ฐจ ํ›„๊ธฐ: getter ์ง€์–‘ํ•ด์•ผ ํ•˜๋Š”๊ฑฐ ์•Œ์ง€๋งŒ ๋„ˆ๋ฌด ํŽธ๋ฆฌํ•ด์š”
  • ํ”„๋ฆฌ์ฝ”์Šค 1์ฃผ์ฐจ ํ›„๊ธฐ: ์˜์กด์„ฑ ์ฃผ์ž…ํ•ด์ฃผ์‹ค ์Šคํ”„๋ง ๊ตฌํ•จ
  • ์ž‡์ธ  ์Šคํ„ฐ๋”” ํฌ๋ฃจ ๋ฐœํ‘œํšŒ ํ›„๊ธฐ
  • [์ฑ…] ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด ๋ฆฌ๋ทฐ
gorapaduckoo
gorapaduckoo
gorapaduckoo
์ง„ํ™”์˜ ๋Œ
gorapaduckoo
์ „์ฒด
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
    • ๐€๐ฅ๐ ๐จ๐ซ๐ข๐ญ๐ก๐ฆ
    • ๐‚๐’
      • ๐‰๐š๐ฏ๐š
      • ๐ƒ๐š๐ญ๐š๐›๐š๐ฌ๐ž
      • ๐๐ž๐ญ๐ฐ๐จ๐ซ๐ค
      • ๐„๐ญ๐œ.
    • ๐’๐ฉ๐ซ๐ข๐ง๐ 
      • ๐๐š๐ฌ๐ข๐œ
      • ๐Œ๐•๐‚ (๐Ÿ)
      • ๐’๐ž๐œ๐ฎ๐ซ๐ข๐ญ๐ฒ
    • ๐๐ซ๐จ๐ฃ๐ž๐œ๐ญ๐ฌ
      • ๐‘๐ž๐œ๐จ๐ฎ๐ซ๐ญ๐š
      • ๐’๐ข๐ฅ๐ญ๐š๐ซ๐š๐ž
    • ๐†๐ข๐ญ
    • ๐‘๐ž๐ฏ๐ข๐ž๐ฐ
    • ๐’๐ญ๐ฎ๐๐ฒ

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
  • aop
  • ๋ฐฑ์ค€
  • DFS
  • spring mvc
  • OOP
  • Union-FInd
  • DI
  • spring
  • ๋น„ํŠธ๋งˆ์Šคํ‚น
  • ๊ตฌํ˜„
  • ํŠธ๋ฆฌ
  • mvc ํŒจํ„ด
  • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
  • dp
  • ๋ฝ
  • ์—๋“œ๋ชฌ๋“œ-์นดํ”„
  • ๋„คํŠธ์›Œํฌ
  • Spring ๊ธฐ๋ณธํŽธ
  • IOC
  • web
  • BOJ
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๋ธŒ๋ฃจํŠธํฌ์Šค
  • http
  • CS

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

hELLO ยท Designed By ์ •์ƒ์šฐ.v4.2.2
gorapaduckoo
ํ”„๋ฆฌ์ฝ”์Šค 2์ฃผ์ฐจ ํ›„๊ธฐ: ๋žœ๋ค๊ฐ’ ํ…Œ์ŠคํŠธ ๊ทธ๊ฑฐ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”๊ฑด๋ฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.