λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

회고

[μš°μ•„ν•œ ν…Œν¬μ½”μŠ€ 7κΈ°] ν”„λ¦¬μ½”μŠ€ 2μ£Όμ°¨ λ„·μ§Έλ‚  회고

🎁 포μž₯ν•΄λ³΄μž 🎁

μ˜€λŠ˜μ€ μ–΄λ–€ 객체λ₯Ό 또 돌돌 말아 κ°μ‹Έλ³ΌκΉŒ ν•˜κ³  κ³ λ―Όν–ˆλ˜ ν•˜λ£¨μ˜€λ‹€.

μš°μŠΉμžλ“€μ„ μ €μž₯ν•˜μž

public class Cars {
    public List<String> getNameOfWinner() {
        return cars.getNameOfMaxPositionCars();
    }

    public List<Car> getMaxPositionCars() {
        int maxPosition = cars.stream()
                .mapToInt(Car::getPosition)
                .max()
                .orElseThrow(() -> new IllegalStateException("λ“±λ‘λœ μ°¨λŸ‰μ΄ μ—†μŠ΅λ‹ˆλ‹€."));

        return cars.stream()
                .filter(car -> car.getPosition() == maxPosition)
                .collect(Collectors.toList());
    }
}

public class Game {
	 public List<String> getNameOfWinner() {
        return cars.getNameOfMaxPositionCars();
}

public class GameController {
	public void start() {
    	// μƒλž΅..
        outputView.displayWinners(game.getNameOfWinner);
    }
}

κΈ°μ‘΄μ—λŠ” Game 이 Cars 우승자λ₯Ό μ°Ύμ•„ 이름을 λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄ λ°”λ‘œ 컨트둀러둜 λ„˜κΈ°λ„λ‘ ν–ˆλ‹€. 우승자의 값에 λŒ€ν•΄μ„œ λ”°λ‘œ μ €μž₯ν•˜μ§€λŠ” μ•Šμ•˜λ‹€. κ·ΈλŸ¬λ‚˜ λ‹€μŒκ³Ό 같은 고민을 ν–ˆλ‹€.

πŸ€” 1. String 의 리슀트둜 λ°˜ν™˜ν•˜λŠ” 것은 μΊ‘μŠν™”κ°€ 잘 μ§€μΌœμ§€λŠ”κ°€?

ν˜„μž¬ Cars μ—μ„œλŠ” Car 객체λ₯Ό λ°˜ν™˜ν•˜λŠ” λŒ€μ‹ , getter 둜 이름을 κΊΌλ‚΄ String 의 리슀트 ν˜•νƒœλ‘œ λ°˜ν™˜ν•˜κ³  μžˆλ‹€.

κ·ΈλŸ¬λ‚˜ 이가 정말 μΊ‘μŠν™”λ₯Ό 지킬 수 μžˆλŠ”μ§€μ— λŒ€ν•œ 의문이 λ“€μ—ˆλ‹€. 

 

λ§Œμ•½, λ‹€λ₯Έ μ½”λ“œμ—μ„œ 리슀트 값에 μ ‘κ·Όν•΄ λ‹€μ‹œ 값을 μ„ΈνŒ…ν•œλ‹€λ©΄? ν˜Ήμ€ μš°μŠΉμžκ°€ 두λͺ…μ΄μ—ˆλŠ”λ° ν•œ μš”μ†Œλ₯Ό μ‚­μ œν•΄λ²„λ¦°λ‹€λ©΄?

πŸ€” 2. 우승자의 정보λ₯Ό μ €μž₯ν•˜μ§€ μ•Šμ•„λ„ λ˜λŠ”κ°€?

λ‚΄κ°€ μ •μ˜ν•œ μ„œλΉ„μŠ€ λ‚΄μ—μ„œ Game 의 역할은 ν•œ 번 μ‚¬μš©μžκ°€ μž…λ ₯ν•œ 값에 λŒ€ν•˜μ—¬ κ²Œμž„μ„ ν•œ 판 μ§„ν–‰ν•΄μ£ΌλŠ” 객체이닀.

즉, κ²Œμž„μ— κ΄€λ ¨λœ μ •λ³΄λŠ” λͺ¨λ‘ 여기에 μ €μž₯λœλ‹€. 총 λΌμš΄λ“œ 수, μ°Έμ—¬ν•˜λŠ” μžλ™μ°¨λ“€, λžœλ€ν•œ μˆ˜μ—μ„œ λͺ‡ 이상이 λ‚˜μ™€μ•Ό μžλ™μ°¨λ“€μ΄ 움직일 수 μžˆλŠ”μ§€ 등에 λŒ€ν•΄ μ •μ˜ν•œλ‹€.

 

그런데 μ΄λŸ¬ν•œ Game 의 객체에 우승자λ₯Ό μ €μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것이 μ–΄μƒ‰ν•˜κ²Œ 생각 λ˜μ—ˆλ‹€.

πŸ€” 3. 우승자의 이름을 λ°˜ν™˜ν•˜λŠ” 것이 Cars 의 역할인가?

ν˜„μž¬λŠ” Cars κ°€ 우승자의 이름을 λ°˜ν™˜ν•˜κ³  μžˆλ‹€. Cars 의 λ©”μ„œλ“œλͺ…은 κ°€μž₯ 멀리 λ‚˜κ°„ μžλ™μ°¨μ˜ 이름을 μ°ΎλŠ”λ‹€κ³  λ˜μ–΄ μžˆμ§€λ§Œ, 사싀상 이에 λŒ€ν•œ 값을 Game 은 λ°˜ν™˜λ§Œ ν•˜κ³  μžˆκΈ°μ— 우승자λ₯Ό μ •ν•΄μ£ΌλŠ” 것과 λ³„λ°˜ λ‹€λ₯Ό λ°”κ°€ μ—†λ‹€. 그렇기에 μ–΄μ°Œλ³΄λ©΄ 우승자λ₯Ό μ •ν•˜λŠ” 것이 Cars 의 μ±…μž„μ²˜λŸΌ 보이기도 ν–ˆλ‹€.

 

μ˜¬λ¦Όν”½μ— μΆœμ „ν•œ μ„ μˆ˜λ“€μ€ μΆœμ „λ§Œ ν•˜κ³ , μžμ‹ μ΄ 맑은 λ°”λ₯Ό ν•  뿐 μš°μŠΉμžλ“€μ„ μ •ν•˜μ§„ μ•ŠλŠ”λ‹€. 🀸🏻‍♀️

 

κ·Έλž˜μ„œ λ‚˜λŠ” DTO λ₯Ό μ‚¬μš©ν•˜κΈ°λ‘œ ν–ˆλ‹€.

public class Game {
    public void judgeWinners() {
    List<Car> maxPositionCars = cars.getMaxPositionCars();
    this.winners = new Winners(maxPositionCars);
    }
}

public class Cars {
    public List<Car> getMaxPositionCars() {
       // κ°€μž₯ 멀리 λ‚˜κ°„ μžλ™μ°¨λ“€μ„ λ°˜ν™˜
    }
}

public class Winners {
    private final List<Car> cars;
    
    // μƒλž΅..
}

public record WinnersDto(List<String> nameOfWinners) {
    public WinnersDto(Game game) {
        this(game.getNameOfWinners());
    }
}

public class GameController {
	public void start() {
    	// μƒλž΅..
        outputView.displayWinners(game);
    }
}

Cars λŠ” 리슀트 ν˜•νƒœλ‘œ Car 객체 자체λ₯Ό λ°˜ν™˜ν•œλ‹€. κ²Œμž„μ€ κ·Έμ € Cars μ—κ²Œ 제일 멀리 λ‚˜κ°„ 차듀에 λŒ€ν•΄ λ¬»λŠ”λ‹€. 우승자λ₯Ό νŒλ‹¨ν•˜λΌλŠ” μ±…μž„μ€ μ§€μ§€ μ•Šλ„λ‘ ν•œλ‹€. 그리고 Game 은 이 객체듀을 Winners λΌλŠ” 객체둜 돌돌 말아 μ €μž₯ν•œλ‹€.

이후 GameController λŠ” 아무것도 κΊΌλ‚΄μ§€ μ•Šκ³  κ·Έμ € game 을 전달해 λ‚΄λΆ€μ—μ„œ Winners 의 이름을 꺼내도둝 ν•œλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄, 적어도 Winners 의 λ‚΄λΆ€μ˜ 값을 λ°”κΏ€ 수 μ—†κΈ° λ•Œλ¬Έμ— μ €μž₯된 우승자 정보λ₯Ό μ‘°μž‘ν•  μœ„ν—˜μ„±μ€ μ—†λ‹€. λ˜ν•œ, GameController μ—μ„œλ„ μš°μŠΉμžλ“€μ˜ 이름을 λ…ΈμΆœν•˜μ§€ μ•Šκ³  λ°”λ‘œ DTO 둜 λ„˜κ²ΌκΈ° λ•Œλ¬Έμ— μ–΄λ””μ—μ„œλ„ 리슀트 ν˜•νƒœμ˜ μš°μŠΉμžλ“€μ˜ 이름에 μ ‘κ·Όν•  수 μ—†κ²Œ 됐닀.

μ²˜μŒμ—λŠ” λ‹¨μˆœ String 의 배열이기에 DTO 둜 κ°μŒ€ ν•„μš”κ°€ μžˆμ„κΉŒ μ‹Άμ—ˆλŠ”λ°.. μ•ˆμΌν–ˆλ‹€. DTO 의 κ³ λ§ˆμ›€μ„ λΌˆμ €λ¦¬κ²Œ λŠκΌˆλ‹€.

μ‹œλ„ 횟수λ₯Ό κ°μ‹Έμž

public class Game {
	private int attemptCount;
    
    public void play() {
        attemptCount--;
        attemptToMoveCars();
    }
    
    public boolean isRunning() {
        return attemptCount > 0;
    }
}

κΈ°μ‘΄μ—λŠ” μœ„μ™€ 같이 Game 객체에 μ›μ‹œκ°’μœΌλ‘œ μ‹œλ„ 횟수λ₯Ό μ €μž₯ν–ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이후 λ―Έμ…˜μ—μ„œ μ•ˆλ‚΄λ˜μ§€ μ•ŠλŠ” 뢀뢄듀을 λ‚΄κ°€ μ •μ˜ν•˜λŠ” κ³Όμ •μ—μ„œ μ‹œλ„ 횟수의 μƒν•œμ„ μ •ν•΄λ’€κΈ° λ•Œλ¬Έμ— λΉ„μ§€λ‹ˆμŠ€ 둜직이 좔가됐닀. 그렇기에 이λ₯Ό 객체둜 생성해 감싸쀬닀.

public class TotalRounds {

    private final int totalRounds;

    public boolean hasMoreRoundsThan(int currentRound) {
        return totalRounds >= currentRound;
    }
}

public class Game {
	public boolean isRunning() {
        return attemptCount > 0;
        return totalRounds.hasMoreRoundsThan(currentRound);
    }
}

μ΄λ ‡κ²Œ κ°μ‹Έλ‹ˆ μ•žμœΌλ‘œ 더 남은 λΌμš΄λ“œκ°€ μžˆλŠ”μ§€ νŒλ‹¨ν•˜λŠ” μ±…μž„λ„ Game μ—μ„œ TotalRounds 둜 μ΄λ™ν–ˆλ‹€.

Game 클래슀의 크기가 μ΄μ „λ³΄λ‹€λŠ” μž‘μ•„μ Έ 적절히 μ±…μž„μ΄ 뢄배됐닀고 μƒκ°ν–ˆλ‹€.

μžλ™μ°¨λ“€μ˜ μƒνƒœλ₯Ό κ°μ‹Έμž

public class CarMovementResults {
    private final List<CarMovementResult> carMovementResults;

    private CarMovementResults(List<CarMovementResult> carMovementResults) {
        this.carMovementResults = carMovementResults;
    }
    public static CarMovementResults from(SequencedMap<String, Integer> statusOfCars) {
        List<CarMovementResult> movementResults = statusOfCars.sequencedKeySet().stream()
                .map(name -> new CarMovementResult(name, statusOfCars.get(name)))
                .collect(Collectors.toList());
        return new CarMovementResults(movementResults);
}

public class Cars {
     public SequencedMap<String, Integer> getStatus() {
            SequencedMap<String, Integer> carStatusMap = new LinkedHashMap<>();
            cars.forEach(car -> carStatusMap.put(car.getName(), car.getPosition()));
            return carStatusMap;
    }
}

기쑴의 μ½”λ“œ.. λ³Ό ν•„μš”λ„ μ—†λ‹€.. μΊ‘μŠν™”λ₯Ό μ§€ν‚€κ² λ‹΅μ‹œκ³  Map 을 μ‚¬μš©ν–ˆμ—ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ³΄λ‹€μ‹œν”Ό 가독성이 극악이라 λ¦¬νŒ©ν† λ§ν•  μƒκ°μœΌλ‘œ μš°μ„  κ΅¬ν˜„λΆ€ν„° ν•΄λ’€μ—ˆλ‹€. λ˜ν•œ μ§€κΈˆ μ™€μ„œ 보면, μ•žμ„œ 우승자λ₯Ό νŒλ³„ν–ˆλ˜ 기쑴의 둜직과 같이 μ™ΈλΆ€μ—μ„œ 이λ₯Ό μ‘°μž‘ν•  μš°λ €κ°€ λ„ˆλ¬΄ λ§Žλ‹€. Map 에 μ ‘κ·Όν•΄μ„œ νŠΉμ • 값을 바꿔버리면 μ–΄λ–»κ²Œ ν•  μˆ˜κ°€ μ—†λ‹€. κ·Έλž˜μ„œ 이에 λŒ€ν•œ 고민을 였늘 μ‹œμž‘ν–ˆλ‹€.

 

λ‹€λ₯Έ κ²½μš°λ“€μ²˜λŸΌ μžλ™μ°¨μ˜ μƒνƒœλ₯Ό μ •μ˜ν•˜λŠ” λͺ¨λΈλ‘œ κ°μŒ€κΉŒμ— λŒ€ν•œ 고민을 ν–ˆλ‹€. κ·ΈλŸ¬λ‚˜, 이 κ²½μš°μ—λŠ” 더 고민이 λ§Žμ•˜λ‹€. μ΄μœ λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

πŸ€” 1. DTO λž‘ 별 차이가 μ—†μ§€ μ•Šλ‚˜?

뭐라고 μ •μ˜ν•΄μ•Ό ν• μ§€ 고민이 됐닀. DTO 인가, λͺ¨λΈμΈκ°€?

정보λ₯Ό μ „λ‹¬ν•˜κΈ° μœ„ν•œ κ°μ²΄λ‹ˆκΉŒ DTO 인가?

κ·Έλ ‡λ‹€λ©΄ λͺ¨λΈμ—μ„œλŠ” λ·°λ₯Ό μ˜μ‘΄ν•˜λ©΄ μ•ˆλ˜λ‹ˆ Controller μ—μ„œ μ •μ˜λ₯Ό ν•΄μ•Ό ν•˜λŠ”κ±΄κ°€? μ΄λ ‡κ²Œ 섀계 μžμ²΄μ— λŒ€ν•œ 고민을 ν–ˆλ‹€. 

πŸ€” 2. Car κ³Ό 별 차이가 μ—†μ§€ μ•Šλ‚˜?

Car κ³Ό 같이 μžλ™μ°¨μ˜ μƒνƒœμ—λ„ 이름과 μœ„μΉ˜κ°€ ν•„μš”ν•˜λ‹€. κ·Έλ ‡λ‹€λ©΄ κ²°κ΅­ 같은 정보λ₯Ό μ€‘λ³΅μ μœΌλ‘œ κ°–κ³  μžˆλŠ” 꼴인데, Car 이 μ•„λ‹Œ 또 λ‹€λ₯Έ 객체λ₯Ό μ •μ˜ν•  μ΄μœ κ°€ μžˆλ‚˜?

 

λ‚΄ 고민의 κ²°κ³ΌλŠ” λͺ¨λΈλ‘œ μ •μ˜ν•΄μ„œ κ°μ‹ΈλŠ” 게 λ§žλ‹€λŠ” κ²ƒμ΄μ—ˆλ‹€!

일단, 쀑볡이라고 νŒλ‹¨ν•˜μ§€ μ•Šμ€ μ΄μœ κ°€ μžˆλ‹€. 객체지ν–₯의 사싀과 μ˜€ν•΄μ—λŠ” λ‹€μŒκ³Ό 같은 λ¬Έμž₯이 λ‚˜μ˜¨λ‹€.


λͺ¨λ“  κ°μ²΄λŠ” μ‹λ³„μžλ₯Ό κ°€μ§€λ©° μ‹λ³„μžλ₯Ό μ΄μš©ν•΄ 객체λ₯Ό ꡬ별할 수 μžˆλ‹€.

λͺ¨λ“  객체가 μ‹λ³„μžλ₯Ό κ°€μ§„λ‹€λŠ” 것은 λ°˜λŒ€λ‘œ 객체가 μ•„λ‹Œ λ‹¨μˆœν•œ 값은 μ‹λ³„μžλ₯Ό κ°€μ§€μ§€ μ•ŠλŠ”λ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

μžλ™μ°¨μ˜ μƒνƒœλ₯Ό μ •μ˜ν•˜λŠ” 것은 μ‹λ³„μžλ₯Ό κ°–λŠ”λ‹€. μžλ™μ°¨μ˜ μƒνƒœλ₯Ό μ €μž₯ν•˜λŠ” 것은 각 λΌμš΄λ“œλ§ˆλ‹€ μžλ™μ°¨κ°€ 전진을 ν•˜λ˜, ν•˜μ§€ μ•Šλ˜ 이뀄진닀. 즉, λΌμš΄λ“œ + μžλ™μ°¨μ˜ 이름이 κ²°κ΅­μ—λŠ” μ‹λ³„μžλ‘œμ„œμ˜ 의미λ₯Ό κ°–κ³  λ™μž‘ν•œλ‹€. 그렇기에 μ΄λŠ” λ‹¨μˆœν•œ κ°’ 객체인 DTO κ°€ μ•„λ‹Œ λͺ¨λΈμ΄λΌκ³  νŒλ‹¨ν–ˆλ‹€.

λ˜ν•œ, 이와 같은 λ§₯λ½μ—μ„œ 각 λΌμš΄λ“œλ§ˆλ‹€ μžλ™μ°¨μ˜ μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” κ°μ²΄λŠ” μžλ™μ°¨ κ°μ²΄μ™€λŠ” μ—„μ—°νžˆ λ‹€λ₯΄λ‹€.

μŠ€λƒ…μƒ·μ„ μ €μž₯ν•˜λŠ” 것과 같은 λ§₯락이닀. μš°λ¦¬κ°€ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό λ³΅μ‚¬ν•˜λ €κ³  ν•  λ•Œ μŠ€λƒ…μƒ·μ„ 뜬 것을 λ°μ΄ν„°λ² μ΄μŠ€μ™€ λ˜‘κ°™λ‹€κ³  λ³΄μ§€λŠ” μ•ŠλŠ” 것과 λ§ˆμ°¬κ°€μ§€λΌκ³  λ΄€λ‹€.μ΄λŠ” μ ˆλŒ€ μ ˆλŒ€ 값이 λ³€ν•˜λ©΄ μ•ˆλ˜κΈ° λ•Œλ¬Έμ— record 둜 μ •μ˜ν•΄μ€¬λ‹€.

public record CarStatus(String name, int position, int round) {
}

πŸ’­ μƒμƒν•΄λ³΄μž πŸ’­

μ½”λ“œ 리뷰λ₯Ό 톡해 이전 μ£Όμ°¨ κ³Όμ œμ—μ„œλŠ” μ—£μ§€ μΌ€μ΄μŠ€λ₯Ό 많이 κ³ λ €ν•˜μ§€ λͺ»ν–ˆλ‹€λŠ” 것을 μ•Œκ²Œ 됐닀. κ·Έλž˜μ„œ 이번 μ£Όμ°¨μ—λŠ” λ‹€μ–‘ν•œ μ—£μ§€ μΌ€μ΄μŠ€λ₯Ό 고렀해보고 μ‹Άμ—ˆλŠ”λ°, μžμœ λ„κ°€ λ†’λ‹€λ³΄λ‹ˆ μ–΄λ””λΆ€ν„° μ–΄λ””κΉŒμ§€ 정해둬야 ν• μ§€ 잘 λͺ¨λ₯΄κ² λ‹€λŠ” 생각을 ν–ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ λ‚΄κ°€ 직접 ν•˜λ‚˜λΆ€ν„° μ—΄κΉŒμ§€ κ·œμ •μ„ ν•΄λ³΄λŠ” 건 μ–΄λ–¨κΉŒ μ‹Άμ—ˆλ‹€.

# μžλ™μ°¨ κ²½μ£Ό κ²Œμž„ μž…λ ₯κ°’ κ·œμΉ™

μ•ˆλ…•ν•˜μ„Έμš”! μžλ™μ°¨ κ²½μ£Ό κ²Œμž„μ— μ˜€μ‹  μ—¬λŸ¬λΆ„λ“€μ„ ν™˜μ˜ν•©λ‹ˆλ‹€.

μžλ™μ°¨ κ²½μ£Ό κ²Œμž„ 진행에 μ•žμ„œ, κ²Œμž„μ˜ μž…λ ₯값에 λŒ€ν•œ κ·œμΉ™μ„ μ„€λͺ…ν•΄ λ“œλ¦¬λ €κ³  ν•©λ‹ˆλ‹€.

## πŸ“μžλ™μ°¨ 이름에 λŒ€ν•˜μ—¬

κ΅¬λΆ„μž(,) λ₯Ό κΈ°μ€€μœΌλ‘œ μžλ™μ°¨μ˜ 이름을 μž…λ ₯ν•΄μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€.

μΆœμ „ν•˜λŠ” μžλ™μ°¨λŠ” λ°˜λ“œμ‹œ 2λŒ€ 이상이어야 ν•©λ‹ˆλ‹€. 우승자의 자리λ₯Ό 두고 λ‹€ν‰ˆμ•Ό ν•˜λ‹ˆ 두 λŒ€ 이상이 λ‹Ήμ—°νžˆ μΆœμ „ν•΄μ•Όκ² μ£ ?!

- ex) `토끼,` 와 같은 μž…λ ₯값은 ν•œ λŒ€λ‘œ κ°„μ£Όλ˜μ–΄ 잘λͺ»λœ μž…λ ₯κ°’μœΌλ‘œ 인해 κ²Œμž„μ΄ μ’…λ£Œλ˜λ‹ˆ μ£Όμ˜ν•΄μ£Όμ„Έμš”!

μ΄λ¦„μ˜ 각 μ–‘μͺ½μ˜ 곡백은 μ œκ±°λ©λ‹ˆλ‹€.

- ex) `토끼, 거뢁이` → 토끼와 거뢁이가 μΆœμ „ν•˜λŠ” κ²ƒμœΌλ‘œ μž…λ ₯λ©λ‹ˆλ‹€. 거뢁이 μ•žμ˜ 곡백이 μ œκ±°λ©λ‹ˆλ‹€.

μžλ™μ°¨μ˜ 이름은 자유둭게 μž…λ ₯ν•΄μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€! 단, μˆ«μžμ™€ ν•œκΈ€, μ•ŒνŒŒλ²³λ§Œμ„ μž…λ ₯ν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

- ex) `ν† a끼,κ±°1뢁이` λŠ” κ°€λŠ₯ν•©λ‹ˆλ‹€.
- ex) `토끼,**거뢁이` λŠ” λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

κ΅¬λΆ„μž(,) 둜 λλ‚΄κ±°λ‚˜ κ΅¬λΆ„μž(,) 만 μ‘΄μž¬ν•˜λŠ” 것은 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€!

- ex)`토끼,거뢁이,` λŠ” λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.
- ex) `,,,,` λŠ” λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

μžλ™μ°¨μ˜ 이름은 λ°˜λ“œμ‹œ 5자 μ΄ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€! κ·ΈλŸ¬λ‚˜ 이 λ•Œ 이름 μ–‘μͺ½ 끝 곡백은 κΈ€μž 수둜 κ°„μ£Όν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

- ex) `토끼깑총, 거뢁이` λŠ” κ°€λŠ₯ν•©λ‹ˆλ‹€.
- ex) `토끼깑총, 거뢁이`          λŠ” κ°€λŠ₯ν•©λ‹ˆλ‹€.
- ex) `토끼깑총, κ±°   뢁이` λŠ” λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.
- ex) `토끼깑총, κ±°λΆμ΄μ—‰κΈˆμ—‰κΈˆ` 은 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

## πŸ“μ‹œλ„ νšŸμˆ˜μ— λŒ€ν•˜μ—¬

μž…λ ₯ν•˜μ‹  μ‹œλ„ 횟수만큼 κ²Œμž„μ„ μ§„ν–‰ν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” `λΌμš΄λ“œ` 라고 ν•˜κ² μŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ λΌμš΄λ“œλŠ” 10번 μ΄ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€. λ„ˆλ¬΄ 였랜 μ‹œκ°„ λ™μ•ˆμ˜ κ²Œμž„ 진행은 κ²Œμž„ 쀑독 μœ„ν—˜μ΄ μžˆμŠ΅λ‹ˆλ‹€! πŸ˜“

λΌμš΄λ“œλŠ” λ°˜λ“œμ‹œ 0보닀 큰 μ •μˆ˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.

즉, 0μ΄κ±°λ‚˜ 음수, μ†Œμˆ˜μΌ 수 μ—†μŠ΅λ‹ˆλ‹€. κ²Œμž„μ„ -1 회만큼 μ§„ν–‰ν•  수 μžˆμ„κΉŒμš”? 0번 μ§„ν–‰ν•˜λŠ” 건 κ²Œμž„μ΄ μ•„λ‹ˆκ² μ£ ! 2.3회 κ²Œμž„ μ§„ν–‰ ν•΄λ³΄μ…¨λ‚˜μš”?

- ex) `0` , `-1` , `2.3` 은 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

λ‹Ήμ—°νžˆ 숫자 μ΄μ™Έμ˜ 값은 μž…λ ₯ν•˜μ‹€ 수 μ—†μŠ΅λ‹ˆλ‹€.

- ex) `d` , `rabbit` 은 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

그럼 λͺ¨λ‘ μž…λ ₯값을 잘 μž…λ ₯ν•΄ μž¬λ°ŒλŠ” κ²Œμž„ μ‹œκ°„ λ³΄λ‚΄μ‹œκΈΈ λ°”λΌκ² μŠ΅λ‹ˆλ‹€! πŸ™‡πŸ»

κ·Έλž˜μ„œ λ‚˜λŠ” μœ„μ™€ 같이 직접 κ²Œμž„μ˜ μ•ˆλ‚΄μžκ°€ λ˜μ—ˆλ‹€κ³  μƒκ°ν•˜κ³  κ·œμΉ™ μ•ˆλ‚΄λ¬Έμ„ μž‘μ„±ν•΄λ΄€λ‹€.

이가 λ‹¨μˆœνžˆ κ³Όμ œμ΄κ±°λ‚˜ μ½”λ”©μ˜ 세계라고 μƒκ°ν•˜μ§€ μ•Šκ³ , μ‚¬μš©μžκ°€ 있으며 νƒ€μΈμ—κ²Œ 이λ₯Ό μ•ˆλ‚΄ν•΄μ•Όκ² λ‹€κ³  μƒκ°ν•˜λ‹ˆ μ–΄λ–€ 뢀뢄듀을 κ³ λ €ν•΄μ•Ό ν•˜λŠ”μ§€ 더 λͺ…ν™•ν•΄μ Έμ„œ 도움이 됐닀. 이λ₯Ό 톡해 μ—£μ§€ μΌ€μ΄μŠ€λ“€μ„ 더 λ‹€μ–‘ν•˜κ²Œ κ³ λ €ν•  수 μžˆμ—ˆλ‹€!


μ˜€λŠ˜μ€ 주둜 μœ νš¨μ„± 검사와 객체λ₯Ό κ°μ‹ΈλŠ” 것에 λŒ€ν•œ κ³ λ €λ₯Ό ν–ˆλ‹€.

λ¦¬νŒ©ν† λ§μ„ ν•œ 뒀에 λ‚΄λΆ€μ μœΌλ‘œλŠ” κ΅¬ν˜„μ΄ λ°”λ€Œμ—ˆμ–΄λ„ ν…ŒμŠ€νŠΈκ°€ κΉ¨μ§€μ§€ μ•ŠμœΌλ©΄, 변경에 μœ μ—°ν•˜κ²Œ μ„€κ³„ν–ˆλ‹€λŠ” 생각이 λ“€μ–΄ λΏŒλ“―ν•˜κΈ°λ„ ν–ˆλ‹€! κ·Έλ ‡μ§€λ§Œ μ˜€λŠ˜μ€ 혼자 고민만 ν•΄μ„œ κ·ΈλŸ°μ§€ 이 λ°©ν–₯이 λ§žλŠ”μ§€λ„ λͺ¨λ₯΄κ² κ³ , μƒˆλ‘­κ²Œ λ“€μ–΄μ˜€λŠ” 지식은 μ—†μ–΄μ„œ 쑰금 힘이 빠지기도 ν–ˆλ‹€ γ… .γ… ~

 

내일은 MVC ꡬ쑰λ₯Ό 쑰금 더 깊게 μ‚΄νŽ΄λ³΄κ³ , 역할에 μ–΄κΈ‹λ‚˜λŠ” 뢀뢄이 μžˆλŠ”μ§€μ— λŒ€ν•œ 생각을 해봐야겠닀.

그리고 아직 GameController 의 전체적인 흐름이 λˆˆμ— λ“€μ–΄μ˜€μ§€λŠ” μ•Šκ²Œ 섀계가 된 것 κ°™μ•„μ„œ 이 뢀뢄에 λŒ€ν•΄μ„œλ„ λ‹€μ‹œ κ³ λ €λ₯Ό 해봐야겠닀!

 

내일도 μ΅œμ„ μ„ λ‹€ν•΄λ³΄μž~