diff --git a/bin/main/racingcar/Application.class b/bin/main/racingcar/Application.class new file mode 100644 index 0000000..7b4d54b Binary files /dev/null and b/bin/main/racingcar/Application.class differ diff --git a/bin/main/racingcar/Car.class b/bin/main/racingcar/Car.class new file mode 100644 index 0000000..5d3edd7 Binary files /dev/null and b/bin/main/racingcar/Car.class differ diff --git a/bin/main/racingcar/InputView.class b/bin/main/racingcar/InputView.class new file mode 100644 index 0000000..21eca3c Binary files /dev/null and b/bin/main/racingcar/InputView.class differ diff --git a/bin/main/racingcar/OutputView.class b/bin/main/racingcar/OutputView.class new file mode 100644 index 0000000..2f733d1 Binary files /dev/null and b/bin/main/racingcar/OutputView.class differ diff --git a/bin/main/racingcar/RacingGame.class b/bin/main/racingcar/RacingGame.class new file mode 100644 index 0000000..ca14106 Binary files /dev/null and b/bin/main/racingcar/RacingGame.class differ diff --git a/bin/main/racingcar/RacingResult.class b/bin/main/racingcar/RacingResult.class new file mode 100644 index 0000000..95f72b0 Binary files /dev/null and b/bin/main/racingcar/RacingResult.class differ diff --git a/bin/test/racingcar/ApplicationTest.class b/bin/test/racingcar/ApplicationTest.class new file mode 100644 index 0000000..5951e3d Binary files /dev/null and b/bin/test/racingcar/ApplicationTest.class differ diff --git a/bin/test/study/StringTest.class b/bin/test/study/StringTest.class new file mode 100644 index 0000000..ecbf42b Binary files /dev/null and b/bin/test/study/StringTest.class differ diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e..55eadce 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,20 @@ package racingcar; +import java.util.List; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + // 1. 입출력 뷰 객체 생성 + InputView inputView = new InputView(); + OutputView outputView = new OutputView(); + + // 2. 게임 엔진에 뷰 객체 주입 및 실행 (null 파라미터 제거) + RacingGame racingGame = new RacingGame(inputView, outputView); + List carList = racingGame.start(); + + // 3. 우승자 판별 및 결과 출력 + // (RacingResult 내부에서도 outputView를 사용하도록 수정하는 것을 권장함) + RacingResult racingResult = new RacingResult(); + racingResult.result(carList); } -} +} \ No newline at end of file diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java new file mode 100644 index 0000000..be2559d --- /dev/null +++ b/src/main/java/racingcar/Car.java @@ -0,0 +1,21 @@ +package racingcar; + +public class Car { + // public에서 private으로 변경하여 외부 조작 방지 + private String carName; + private int count; + + public Car(String carName) { + this.carName = carName; + this.count = 0; + } + + public void upCount(int number) { + if (number >= 4) { + this.count++; + } + } + + public String getCarName() { return carName; } + public int getCount() { return count; } +} \ No newline at end of file diff --git a/src/main/java/racingcar/InputView.java b/src/main/java/racingcar/InputView.java new file mode 100644 index 0000000..4dd2990 --- /dev/null +++ b/src/main/java/racingcar/InputView.java @@ -0,0 +1,60 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Console; + +import java.util.ArrayList; +import java.util.List; + +public class InputView { + + public List createCars() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + + String nameInput = Console.readLine(); + String[] carNames = nameInput.split(","); + + List existNames = new ArrayList<>(); //차 이름 중복 예외처리 하려고 만든 리스트 + + List carList = new ArrayList<>(); + + for (String name : carNames) { + + if (name.length() > 5) { + throw new IllegalArgumentException("차 이름 5글자보다 클 수 없음"); + } + + if (name.isEmpty() || name.contains(" ")) { + throw new IllegalArgumentException("빈값, 공백 오류"); + } + + if (existNames.contains(name)) { + throw new IllegalArgumentException("중복된 차 있음"); + } + existNames.add(name); + + Car car = new Car(name); + carList.add(car); + } + return carList; + } + + public int getCount() { + + System.out.println("시도할 회수는 몇회인가요?"); + String countInput = Console.readLine(); + + int tryCount; + + try { + tryCount = Integer.parseInt(countInput); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("시도 횟수는 숫자여야함"); + } + + if (tryCount <= 0) { + throw new IllegalArgumentException("0보다 작은 수 안됨"); + } + + return tryCount; + } +} \ No newline at end of file diff --git a/src/main/java/racingcar/OutputView.java b/src/main/java/racingcar/OutputView.java new file mode 100644 index 0000000..b07f1bb --- /dev/null +++ b/src/main/java/racingcar/OutputView.java @@ -0,0 +1,26 @@ +package racingcar; + +import java.util.List; + +public class OutputView { + + public void printRunResultHeader() { + System.out.println("\n실행 결과"); + } + + public void printCarPosition(Car car) { + System.out.print(car.getCarName() + " : "); + for (int i = 0; i < car.getCount(); i++) { + System.out.print("-"); + } + System.out.println(); + } + + public void printEmptyLine() { + System.out.println(); + } + + public void printWinners(List winnerNames) { + System.out.print("최종 우승자 : " + String.join(", ", winnerNames)); + } +} \ No newline at end of file diff --git a/src/main/java/racingcar/RacingGame.java b/src/main/java/racingcar/RacingGame.java new file mode 100644 index 0000000..8fc1f39 --- /dev/null +++ b/src/main/java/racingcar/RacingGame.java @@ -0,0 +1,33 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Randoms; +import java.util.List; + +public class RacingGame { + private final InputView inputView; + private final OutputView outputView; + + // 생성자를 통한 의존성 주입 + public RacingGame(InputView inputView, OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + } + + // 불필요한 List 매개변수 제거 + public List start() { + List carList = inputView.createCars(); + int count = inputView.getCount(); + + outputView.printRunResultHeader(); + + for (int i = 0; i < count; i++) { + for (Car car : carList) { + int randomNumber = Randoms.pickNumberInRange(0, 9); + car.upCount(randomNumber); + outputView.printCarPosition(car); // 출력 위임 + } + outputView.printEmptyLine(); + } + return carList; + } +} \ No newline at end of file diff --git a/src/main/java/racingcar/RacingResult.java b/src/main/java/racingcar/RacingResult.java new file mode 100644 index 0000000..87cddfd --- /dev/null +++ b/src/main/java/racingcar/RacingResult.java @@ -0,0 +1,31 @@ +package racingcar; + +import java.util.ArrayList; +import java.util.List; + +public class RacingResult { + + // 문제의 원인! 이 줄을 과감하게 삭제합니다. + // RacingGame racingGame = new RacingGame(); + + public void result(List carList) { + ArrayList winnerList = new ArrayList<>(); + int maxNum = 0; + + for (Car car : carList) { + if (car.getCount() >= maxNum) { + maxNum = car.getCount(); + } + } + + for(Car car: carList) { + if (car.getCount() == maxNum ) { + winnerList.add(car.getCarName()); + } + } + + String winnerNames = String.join(", ", winnerList); + System.out.print("최종 우승자 : "); + System.out.print(winnerNames); + } +} \ No newline at end of file