-
[μ°μν ν ν¬μ½μ€ 7κΈ°] ν리μ½μ€ 2μ£Όμ°¨ λ·μ§Έλ νκ³νκ³ 2024. 10. 25. 23:36
π ν¬μ₯ν΄λ³΄μ π
μ€λμ μ΄λ€ κ°μ²΄λ₯Ό λ λλ λ§μ κ°μΈλ³ΌκΉ νκ³ κ³ λ―Όνλ ν루μλ€.
μ°μΉμλ€μ μ μ₯νμ
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 μ μ 체μ μΈ νλ¦μ΄ λμ λ€μ΄μ€μ§λ μκ² μ€κ³κ° λ κ² κ°μμ μ΄ λΆλΆμ λν΄μλ λ€μ κ³ λ €λ₯Ό ν΄λ΄μΌκ² λ€!
λ΄μΌλ μ΅μ μ λ€ν΄λ³΄μ~
'νκ³ ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ