ewhk9887/korean_code_reviews_from_github huggingface dataset:
@@ -0,0 +1,21 @@
+public class Car {
+    private String name;
+    private int position;
+
+    Car(String name) {
+        this.name = name;
+        this.position = 0;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public int getPosition() {
+        return position;
+    }
+
+    public void goForward() {
+        this.position++;
+    }
+}

리뷰: 다음에는 code formatting 을 한 뒤에 제출하는 습관을 들이시면 좋을 것 같아요 ~ :)
@@ -0,0 +1,21 @@
+public class Car {
+    private String name;
+    private int position;
+
+    Car(String name) {
+        this.name = name;
+        this.position = 0;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public int getPosition() {
+        return position;
+    }
+
+    public void goForward() {
+        this.position++;
+    }
+}

리뷰: 10, 4 가 어떤 의미를 지니고 있는지 2년 뒤에 이 코드를 보거나 타인이 보면 이해가 잘 안될 수 있을 것 같아요.
이런 magic number 를 상수로 추출해보는게 어떨까요?
@@ -0,0 +1,68 @@
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Scanner;
+import java.util.stream.Stream;
+
+public class InputView {
+    private static final int MAX_LENGTH = 6;
+    private static final Scanner scanner = new Scanner(System.in);
+
+    public static List<Car> inputCarName() {
+        String name = scanner.nextLine();
+        String[] splittedInputCarName = splitInputCarName(name);
+        String[] trimmedInputCarName = trimInputCarName(splittedInputCarName);
+
+        try {
+            processStreamAboutCheckName(trimmedInputCarName);
+        } catch(IllegalArgumentException e) {
+            System.out.println(e.getMessage());
+            inputCarName();
+        }
+
+        List<Car> cars = new ArrayList<>();
+        for(int i = 0; i< splittedInputCarName.length; i++) {
+            cars.add(new Car(trimmedInputCarName[i]));
+        }
+        return cars;
+    }
+
+    private static String[] splitInputCarName(String name) {
+        return name.split(",");
+    }
+
+    private static String[] trimInputCarName(String[] name) {
+        for(int i = 0; i<name.length; i++) {
+            name[i] = name[i].trim();
+        }
+        return name;
+    }
+
+    private static void checkNameLength(String name) {
+        if(name.length() >= MAX_LENGTH) {
+            throw new IllegalArgumentException("이름은 5자 이하만 가능합니다.");
+        }
+    }
+
+    private static void processStreamAboutCheckName(String[] trimmedInputCarName) {
+        Stream<String> stream = Arrays.stream(trimmedInputCarName);
+        stream.forEach(e -> checkNameLength(e));
+    }
+
+    public static int inputTrial() {
+        return scanner.nextInt();
+    }
+
+    public static void inputCarNamesMessage() {
+        System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
+    }
+
+    public static void inputCountMessage() {
+        System.out.println("시도할 횟수는 몇회인가요?");
+    }
+}
+
+
+
+
+

리뷰: primitive type 이 아니라 wrapper type 으로 선언하신 이유가 있을까요?
@@ -0,0 +1,68 @@
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Scanner;
+import java.util.stream.Stream;
+
+public class InputView {
+    private static final int MAX_LENGTH = 6;
+    private static final Scanner scanner = new Scanner(System.in);
+
+    public static List<Car> inputCarName() {
+        String name = scanner.nextLine();
+        String[] splittedInputCarName = splitInputCarName(name);
+        String[] trimmedInputCarName = trimInputCarName(splittedInputCarName);
+
+        try {
+            processStreamAboutCheckName(trimmedInputCarName);
+        } catch(IllegalArgumentException e) {
+            System.out.println(e.getMessage());
+            inputCarName();
+        }
+
+        List<Car> cars = new ArrayList<>();
+        for(int i = 0; i< splittedInputCarName.length; i++) {
+            cars.add(new Car(trimmedInputCarName[i]));
+        }
+        return cars;
+    }
+
+    private static String[] splitInputCarName(String name) {
+        return name.split(",");
+    }
+
+    private static String[] trimInputCarName(String[] name) {
+        for(int i = 0; i<name.length; i++) {
+            name[i] = name[i].trim();
+        }
+        return name;
+    }
+
+    private static void checkNameLength(String name) {
+        if(name.length() >= MAX_LENGTH) {
+            throw new IllegalArgumentException("이름은 5자 이하만 가능합니다.");
+        }
+    }
+
+    private static void processStreamAboutCheckName(String[] trimmedInputCarName) {
+        Stream<String> stream = Arrays.stream(trimmedInputCarName);
+        stream.forEach(e -> checkNameLength(e));
+    }
+
+    public static int inputTrial() {
+        return scanner.nextInt();
+    }
+
+    public static void inputCarNamesMessage() {
+        System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
+    }
+
+    public static void inputCountMessage() {
+        System.out.println("시도할 횟수는 몇회인가요?");
+    }
+}
+
+
+
+
+

리뷰: 접근제어자가 빠진 이유가 있을까요?
접근제어자를 생략하면 어떤 접근제어자가 적용될까요?
@@ -0,0 +1,68 @@
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Scanner;
+import java.util.stream.Stream;
+
+public class InputView {
+    private static final int MAX_LENGTH = 6;
+    private static final Scanner scanner = new Scanner(System.in);
+
+    public static List<Car> inputCarName() {
+        String name = scanner.nextLine();
+        String[] splittedInputCarName = splitInputCarName(name);
+        String[] trimmedInputCarName = trimInputCarName(splittedInputCarName);
+
+        try {
+            processStreamAboutCheckName(trimmedInputCarName);
+        } catch(IllegalArgumentException e) {
+            System.out.println(e.getMessage());
+            inputCarName();
+        }
+
+        List<Car> cars = new ArrayList<>();
+        for(int i = 0; i< splittedInputCarName.length; i++) {
+            cars.add(new Car(trimmedInputCarName[i]));
+        }
+        return cars;
+    }
+
+    private static String[] splitInputCarName(String name) {
+        return name.split(",");
+    }
+
+    private static String[] trimInputCarName(String[] name) {
+        for(int i = 0; i<name.length; i++) {
+            name[i] = name[i].trim();
+        }
+        return name;
+    }
+
+    private static void checkNameLength(String name) {
+        if(name.length() >= MAX_LENGTH) {
+            throw new IllegalArgumentException("이름은 5자 이하만 가능합니다.");
+        }
+    }
+
+    private static void processStreamAboutCheckName(String[] trimmedInputCarName) {
+        Stream<String> stream = Arrays.stream(trimmedInputCarName);
+        stream.forEach(e -> checkNameLength(e));
+    }
+
+    public static int inputTrial() {
+        return scanner.nextInt();
+    }
+
+    public static void inputCarNamesMessage() {
+        System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
+    }
+
+    public static void inputCountMessage() {
+        System.out.println("시도할 횟수는 몇회인가요?");
+    }
+}
+
+
+
+
+

리뷰: InputView 객체는 상태를 가지지 않는 util 클래스처럼 비춰지는데
static 메서드들로 구성하여 객체 생성 비용을 절감시켜보는건 어떤가요?
@@ -0,0 +1,68 @@
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Scanner;
+import java.util.stream.Stream;
+
+public class InputView {
+    private static final int MAX_LENGTH = 6;
+    private static final Scanner scanner = new Scanner(System.in);
+
+    public static List<Car> inputCarName() {
+        String name = scanner.nextLine();
+        String[] splittedInputCarName = splitInputCarName(name);
+        String[] trimmedInputCarName = trimInputCarName(splittedInputCarName);
+
+        try {
+            processStreamAboutCheckName(trimmedInputCarName);
+        } catch(IllegalArgumentException e) {
+            System.out.println(e.getMessage());
+            inputCarName();
+        }
+
+        List<Car> cars = new ArrayList<>();
+        for(int i = 0; i< splittedInputCarName.length; i++) {
+            cars.add(new Car(trimmedInputCarName[i]));
+        }
+        return cars;
+    }
+
+    private static String[] splitInputCarName(String name) {
+        return name.split(",");
+    }
+
+    private static String[] trimInputCarName(String[] name) {
+        for(int i = 0; i<name.length; i++) {
+            name[i] = name[i].trim();
+        }
+        return name;
+    }
+
+    private static void checkNameLength(String name) {
+        if(name.length() >= MAX_LENGTH) {
+            throw new IllegalArgumentException("이름은 5자 이하만 가능합니다.");
+        }
+    }
+
+    private static void processStreamAboutCheckName(String[] trimmedInputCarName) {
+        Stream<String> stream = Arrays.stream(trimmedInputCarName);
+        stream.forEach(e -> checkNameLength(e));
+    }
+
+    public static int inputTrial() {
+        return scanner.nextInt();
+    }
+
+    public static void inputCarNamesMessage() {
+        System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
+    }
+
+    public static void inputCountMessage() {
+        System.out.println("시도할 횟수는 몇회인가요?");
+    }
+}
+
+
+
+
+

리뷰: 사용하지 않는 코드는 과감히 삭제하시는게 좋을 것 같습니다
@@ -0,0 +1,68 @@
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Scanner;
+import java.util.stream.Stream;
+
+public class InputView {
+    private static final int MAX_LENGTH = 6;
+    private static final Scanner scanner = new Scanner(System.in);
+
+    public static List<Car> inputCarName() {
+        String name = scanner.nextLine();
+        String[] splittedInputCarName = splitInputCarName(name);
+        String[] trimmedInputCarName = trimInputCarName(splittedInputCarName);
+
+        try {
+            processStreamAboutCheckName(trimmedInputCarName);
+        } catch(IllegalArgumentException e) {
+            System.out.println(e.getMessage());
+            inputCarName();
+        }
+
+        List<Car> cars = new ArrayList<>();
+        for(int i = 0; i< splittedInputCarName.length; i++) {
+            cars.add(new Car(trimmedInputCarName[i]));
+        }
+        return cars;
+    }
+
+    private static String[] splitInputCarName(String name) {
+        return name.split(",");
+    }
+
+    private static String[] trimInputCarName(String[] name) {
+        for(int i = 0; i<name.length; i++) {
+            name[i] = name[i].trim();
+        }
+        return name;
+    }
+
+    private static void checkNameLength(String name) {
+        if(name.length() >= MAX_LENGTH) {
+            throw new IllegalArgumentException("이름은 5자 이하만 가능합니다.");
+        }
+    }
+
+    private static void processStreamAboutCheckName(String[] trimmedInputCarName) {
+        Stream<String> stream = Arrays.stream(trimmedInputCarName);
+        stream.forEach(e -> checkNameLength(e));
+    }
+
+    public static int inputTrial() {
+        return scanner.nextInt();
+    }
+
+    public static void inputCarNamesMessage() {
+        System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
+    }
+
+    public static void inputCountMessage() {
+        System.out.println("시도할 횟수는 몇회인가요?");
+    }
+}
+
+
+
+
+

리뷰: 줄바꿈, 스페이스도 컨벤션입니다.
문맥이 달라진다던가, 필드와 메서드 사이 등을 한번의 줄바꿈으로 구분 지어서 가독성을 높여보면 어떨까요?
@@ -0,0 +1,68 @@
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Scanner;
+import java.util.stream.Stream;
+
+public class InputView {
+    private static final int MAX_LENGTH = 6;
+    private static final Scanner scanner = new Scanner(System.in);
+
+    public static List<Car> inputCarName() {
+        String name = scanner.nextLine();
+        String[] splittedInputCarName = splitInputCarName(name);
+        String[] trimmedInputCarName = trimInputCarName(splittedInputCarName);
+
+        try {
+            processStreamAboutCheckName(trimmedInputCarName);
+        } catch(IllegalArgumentException e) {
+            System.out.println(e.getMessage());
+            inputCarName();
+        }
+
+        List<Car> cars = new ArrayList<>();
+        for(int i = 0; i< splittedInputCarName.length; i++) {
+            cars.add(new Car(trimmedInputCarName[i]));
+        }
+        return cars;
+    }
+
+    private static String[] splitInputCarName(String name) {
+        return name.split(",");
+    }
+
+    private static String[] trimInputCarName(String[] name) {
+        for(int i = 0; i<name.length; i++) {
+            name[i] = name[i].trim();
+        }
+        return name;
+    }
+
+    private static void checkNameLength(String name) {
+        if(name.length() >= MAX_LENGTH) {
+            throw new IllegalArgumentException("이름은 5자 이하만 가능합니다.");
+        }
+    }
+
+    private static void processStreamAboutCheckName(String[] trimmedInputCarName) {
+        Stream<String> stream = Arrays.stream(trimmedInputCarName);
+        stream.forEach(e -> checkNameLength(e));
+    }
+
+    public static int inputTrial() {
+        return scanner.nextInt();
+    }
+
+    public static void inputCarNamesMessage() {
+        System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
+    }
+
+    public static void inputCountMessage() {
+        System.out.println("시도할 횟수는 몇회인가요?");
+    }
+}
+
+
+
+
+

리뷰: 이 부분에 java 8 의 stream api 를 사용해보면 어떨까요?
@@ -0,0 +1,68 @@
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Scanner;
+import java.util.stream.Stream;
+
+public class InputView {
+    private static final int MAX_LENGTH = 6;
+    private static final Scanner scanner = new Scanner(System.in);
+
+    public static List<Car> inputCarName() {
+        String name = scanner.nextLine();
+        String[] splittedInputCarName = splitInputCarName(name);
+        String[] trimmedInputCarName = trimInputCarName(splittedInputCarName);
+
+        try {
+            processStreamAboutCheckName(trimmedInputCarName);
+        } catch(IllegalArgumentException e) {
+            System.out.println(e.getMessage());
+            inputCarName();
+        }
+
+        List<Car> cars = new ArrayList<>();
+        for(int i = 0; i< splittedInputCarName.length; i++) {
+            cars.add(new Car(trimmedInputCarName[i]));
+        }
+        return cars;
+    }
+
+    private static String[] splitInputCarName(String name) {
+        return name.split(",");
+    }
+
+    private static String[] trimInputCarName(String[] name) {
+        for(int i = 0; i<name.length; i++) {
+            name[i] = name[i].trim();
+        }
+        return name;
+    }
+
+    private static void checkNameLength(String name) {
+        if(name.length() >= MAX_LENGTH) {
+            throw new IllegalArgumentException("이름은 5자 이하만 가능합니다.");
+        }
+    }
+
+    private static void processStreamAboutCheckName(String[] trimmedInputCarName) {
+        Stream<String> stream = Arrays.stream(trimmedInputCarName);
+        stream.forEach(e -> checkNameLength(e));
+    }
+
+    public static int inputTrial() {
+        return scanner.nextInt();
+    }
+
+    public static void inputCarNamesMessage() {
+        System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
+    }
+
+    public static void inputCountMessage() {
+        System.out.println("시도할 횟수는 몇회인가요?");
+    }
+}
+
+
+
+
+

리뷰: 선언과 할당이 분리된 이유가 있을까요?
@@ -0,0 +1,27 @@
+import java.util.List;
+
+public class OutputView {
+    private static final String DRIVE = "-";
+
+    public void resultMessage() {
+        System.out.println("\n실행 결과");
+    }
+
+    public void oneTrialMessage(List<Car> cars) {
+        for(Car car: cars) {
+            System.out.println(car.getName() + ": " + raceOneTrial(car));
+        }
+    }
+
+    private StringBuilder raceOneTrial(Car car) {
+        StringBuilder goSignal = new StringBuilder();
+        for(int i = 0; i<car.getPosition(); i++) {
+            goSignal.append(DRIVE);
+        }
+        return goSignal;
+    }
+
+    public void getWinnerMessage(List<String> winnernames) {
+        System.out.println(String.join(",", winnernames + "가 최종 우승했습니다."));
+    }
+}

리뷰: 게임 시작을 위한 input 과 관련된 print 는 inputview 에 있는게 어떨까요?
@@ -0,0 +1,27 @@
+import java.util.List;
+
+public class OutputView {
+    private static final String DRIVE = "-";
+
+    public void resultMessage() {
+        System.out.println("\n실행 결과");
+    }
+
+    public void oneTrialMessage(List<Car> cars) {
+        for(Car car: cars) {
+            System.out.println(car.getName() + ": " + raceOneTrial(car));
+        }
+    }
+
+    private StringBuilder raceOneTrial(Car car) {
+        StringBuilder goSignal = new StringBuilder();
+        for(int i = 0; i<car.getPosition(); i++) {
+            goSignal.append(DRIVE);
+        }
+        return goSignal;
+    }
+
+    public void getWinnerMessage(List<String> winnernames) {
+        System.out.println(String.join(",", winnernames + "가 최종 우승했습니다."));
+    }
+}

리뷰: 메서드 이름이 대문자로 시작하고 명사네요 ~
@@ -0,0 +1,68 @@
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Scanner;
+import java.util.stream.Stream;
+
+public class InputView {
+    private static final int MAX_LENGTH = 6;
+    private static final Scanner scanner = new Scanner(System.in);
+
+    public static List<Car> inputCarName() {
+        String name = scanner.nextLine();
+        String[] splittedInputCarName = splitInputCarName(name);
+        String[] trimmedInputCarName = trimInputCarName(splittedInputCarName);
+
+        try {
+            processStreamAboutCheckName(trimmedInputCarName);
+        } catch(IllegalArgumentException e) {
+            System.out.println(e.getMessage());
+            inputCarName();
+        }
+
+        List<Car> cars = new ArrayList<>();
+        for(int i = 0; i< splittedInputCarName.length; i++) {
+            cars.add(new Car(trimmedInputCarName[i]));
+        }
+        return cars;
+    }
+
+    private static String[] splitInputCarName(String name) {
+        return name.split(",");
+    }
+
+    private static String[] trimInputCarName(String[] name) {
+        for(int i = 0; i<name.length; i++) {
+            name[i] = name[i].trim();
+        }
+        return name;
+    }
+
+    private static void checkNameLength(String name) {
+        if(name.length() >= MAX_LENGTH) {
+            throw new IllegalArgumentException("이름은 5자 이하만 가능합니다.");
+        }
+    }
+
+    private static void processStreamAboutCheckName(String[] trimmedInputCarName) {
+        Stream<String> stream = Arrays.stream(trimmedInputCarName);
+        stream.forEach(e -> checkNameLength(e));
+    }
+
+    public static int inputTrial() {
+        return scanner.nextInt();
+    }
+
+    public static void inputCarNamesMessage() {
+        System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
+    }
+
+    public static void inputCountMessage() {
+        System.out.println("시도할 횟수는 몇회인가요?");
+    }
+}
+
+
+
+
+

리뷰: 리턴을 이렇게 적으신 이유가 있을까요?
@@ -0,0 +1,68 @@
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Scanner;
+import java.util.stream.Stream;
+
+public class InputView {
+    private static final int MAX_LENGTH = 6;
+    private static final Scanner scanner = new Scanner(System.in);
+
+    public static List<Car> inputCarName() {
+        String name = scanner.nextLine();
+        String[] splittedInputCarName = splitInputCarName(name);
+        String[] trimmedInputCarName = trimInputCarName(splittedInputCarName);
+
+        try {
+            processStreamAboutCheckName(trimmedInputCarName);
+        } catch(IllegalArgumentException e) {
+            System.out.println(e.getMessage());
+            inputCarName();
+        }
+
+        List<Car> cars = new ArrayList<>();
+        for(int i = 0; i< splittedInputCarName.length; i++) {
+            cars.add(new Car(trimmedInputCarName[i]));
+        }
+        return cars;
+    }
+
+    private static String[] splitInputCarName(String name) {
+        return name.split(",");
+    }
+
+    private static String[] trimInputCarName(String[] name) {
+        for(int i = 0; i<name.length; i++) {
+            name[i] = name[i].trim();
+        }
+        return name;
+    }
+
+    private static void checkNameLength(String name) {
+        if(name.length() >= MAX_LENGTH) {
+            throw new IllegalArgumentException("이름은 5자 이하만 가능합니다.");
+        }
+    }
+
+    private static void processStreamAboutCheckName(String[] trimmedInputCarName) {
+        Stream<String> stream = Arrays.stream(trimmedInputCarName);
+        stream.forEach(e -> checkNameLength(e));
+    }
+
+    public static int inputTrial() {
+        return scanner.nextInt();
+    }
+
+    public static void inputCarNamesMessage() {
+        System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
+    }
+
+    public static void inputCountMessage() {
+        System.out.println("시도할 횟수는 몇회인가요?");
+    }
+}
+
+
+
+
+

리뷰: trim 과 checkNameLength 두개의 역할을 수행하는 메서드네요
메서드들을 재사용할 수 있게 네이밍 변경, 단일책임원칙을 지켜서 리팩토링 해보면 어떨까요?
@@ -0,0 +1,68 @@
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Scanner;
+import java.util.stream.Stream;
+
+public class InputView {
+    private static final int MAX_LENGTH = 6;
+    private static final Scanner scanner = new Scanner(System.in);
+
+    public static List<Car> inputCarName() {
+        String name = scanner.nextLine();
+        String[] splittedInputCarName = splitInputCarName(name);
+        String[] trimmedInputCarName = trimInputCarName(splittedInputCarName);
+
+        try {
+            processStreamAboutCheckName(trimmedInputCarName);
+        } catch(IllegalArgumentException e) {
+            System.out.println(e.getMessage());
+            inputCarName();
+        }
+
+        List<Car> cars = new ArrayList<>();
+        for(int i = 0; i< splittedInputCarName.length; i++) {
+            cars.add(new Car(trimmedInputCarName[i]));
+        }
+        return cars;
+    }
+
+    private static String[] splitInputCarName(String name) {
+        return name.split(",");
+    }
+
+    private static String[] trimInputCarName(String[] name) {
+        for(int i = 0; i<name.length; i++) {
+            name[i] = name[i].trim();
+        }
+        return name;
+    }
+
+    private static void checkNameLength(String name) {
+        if(name.length() >= MAX_LENGTH) {
+            throw new IllegalArgumentException("이름은 5자 이하만 가능합니다.");
+        }
+    }
+
+    private static void processStreamAboutCheckName(String[] trimmedInputCarName) {
+        Stream<String> stream = Arrays.stream(trimmedInputCarName);
+        stream.forEach(e -> checkNameLength(e));
+    }
+
+    public static int inputTrial() {
+        return scanner.nextInt();
+    }
+
+    public static void inputCarNamesMessage() {
+        System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
+    }
+
+    public static void inputCountMessage() {
+        System.out.println("시도할 횟수는 몇회인가요?");
+    }
+}
+
+
+
+
+

리뷰: return scanner.nextInt(); 로 충분할 것 같습니다 ~

그리고 input() 메서드가 inputCount() 메서드를 포함하는 듯한 네이밍인 것 같습니다
둘의 구분을 위해 메서드 이름을 좀 변경해보시면 어떨까요?

(Count 라는 네이밍은 너무 광범위한 단어인 것 같습니다. 시도 횟수를 나타내는 더 괜찮은 네이밍은 없을까요?)
@@ -0,0 +1,27 @@
+import java.util.List;
+
+public class OutputView {
+    private static final String DRIVE = "-";
+
+    public void resultMessage() {
+        System.out.println("\n실행 결과");
+    }
+
+    public void oneTrialMessage(List<Car> cars) {
+        for(Car car: cars) {
+            System.out.println(car.getName() + ": " + raceOneTrial(car));
+        }
+    }
+
+    private StringBuilder raceOneTrial(Car car) {
+        StringBuilder goSignal = new StringBuilder();
+        for(int i = 0; i<car.getPosition(); i++) {
+            goSignal.append(DRIVE);
+        }
+        return goSignal;
+    }
+
+    public void getWinnerMessage(List<String> winnernames) {
+        System.out.println(String.join(",", winnernames + "가 최종 우승했습니다."));
+    }
+}

리뷰: 여기서는 StringBuilder 로 받는 이유가 있을까요?