ewhk9887/korean_code_reviews_from_github huggingface dataset:
@@ -0,0 +1,85 @@
+package com.codesquad.datastructurestudy.list.arraylist;
+
+public class ArrayList implements List<Integer> {
+
+  private int[] numbers;
+  private int numOfData;
+
+  public ArrayList() {
+    this.numbers = new int[100];
+    this.numOfData = 0;
+  }
+
+  public ArrayList(int[] numbers, int numOfData) {
+    this.numbers = numbers;
+    this.numOfData = numOfData;
+  }
+
+  public void add(int index, Integer element) {
+    if (numOfData > this.numbers.length) {
+      System.out.println("배열이 가득 찼습니다");
+//      throw new ArrayIndexOutOfBoundsException();
+    }
+    this.numbers[index] = element;
+    numOfData++;
+  }
+
+  public void add(Integer element) {
+    if (numOfData > this.numbers.length) {
+      System.out.println("배열이 가득 찼습니다");
+    }
+    this.numbers[numOfData] = element;
+    numOfData++;
+  }
+
+  public int count() {
+    return this.numOfData;
+  }
+
+  public Integer get(int index) {
+    return this.numbers[index];
+  }
+
+  public Integer remove(int index) {
+    Integer data = this.numbers[index];
+
+    for (int i = index; i < this.numOfData - 1; i++) {
+      this.numbers[i] = this.numbers[i+1];
+    }
+
+    this.numOfData--;
+    return data;
+  }
+
+  public int size() {
+    return this.numbers.length;
+  }
+
+  public static void main(String[] args) {
+    List<Integer> list = new ArrayList();
+
+    // 데이터 삽입
+    list.add(1);
+    list.add(2);
+    list.add(3);
+    list.add(4);
+
+    // 저장된 데이터 출력
+    System.out.println("현재 데이터의 수: " + list.count());
+
+    for (int i = 0; i < list.count(); i++) {
+      System.out.println(list.get(i));
+    }
+
+    list.remove(2);
+    list.remove(3);
+
+    System.out.println("삭제 후 데이터의 수: " + list.count());
+
+    for (int i = 0; i < list.count(); i++) {
+      System.out.println(list.get(i));
+    }
+
+    System.out.println("삭제 후 배열 크기: " + list.size());
+  }
+}

리뷰: 응? 이거 어떻게보면 맞는 것 같기도 하고 아닌 것 같기도 합니다.
java의 size는 어떻게 동작하나요?
@@ -0,0 +1,27 @@
+package com.codesquad.datastructurestudy.list.arraylist;
+
+public interface List<T> {
+
+  void add(T element);
+  void add(int index, T element);
+
+  int count();
+
+  T get(int index);
+
+  T remove(int index);
+
+  int size();
+
+//  int indexOf(T o);
+//  int lastIndexOf(T o);
+
+//  ListIterator listIterator();
+//  ListIterator listIterator(int index);
+
+//  T set(int index, T element);
+
+//  void sort(Comparator c);
+
+//  List subList(int fromIndex, int toIndex);
+}

리뷰: ㅋㅋㅋ 나중에 구현할 사항들인가요?
@@ -0,0 +1,35 @@
+package com.codesquad.datastructurestudy.list.arraylist;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+public class ListMain {
+
+  public static void main(String[] args) {
+    List<Integer> list = new ArrayList<>();
+    for (int i = 0; i < 9; i++) {
+      list.add(i,i+1);
+    }
+
+    int sum = 0;
+    for (int i = 0; i < list.size(); i++) {
+      sum += list.get(i);
+    }
+    System.out.println("리스트의 합계는 : " + sum);
+
+    List list1 = new ArrayList();
+
+    for (int i = 0; i < list.size(); i++) {
+      if (!(list.get(i) % 3 == 0 || list.get(i) % 2 == 0)) {
+        list1.add(list.get(i));
+      }
+    }
+
+    Iterator<Integer> iterator = list1.iterator();
+    while (iterator.hasNext()) {
+      System.out.println(iterator.next());
+    }
+  }
+}

리뷰: 전반적으로 java coding convention이 잘 지켜지지 않는 모습이네요.
@@ -0,0 +1,35 @@
+package com.codesquad.datastructurestudy.list.arraylist;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+public class ListMain {
+
+  public static void main(String[] args) {
+    List<Integer> list = new ArrayList<>();
+    for (int i = 0; i < 9; i++) {
+      list.add(i,i+1);
+    }
+
+    int sum = 0;
+    for (int i = 0; i < list.size(); i++) {
+      sum += list.get(i);
+    }
+    System.out.println("리스트의 합계는 : " + sum);
+
+    List list1 = new ArrayList();
+
+    for (int i = 0; i < list.size(); i++) {
+      if (!(list.get(i) % 3 == 0 || list.get(i) % 2 == 0)) {
+        list1.add(list.get(i));
+      }
+    }
+
+    Iterator<Integer> iterator = list1.iterator();
+    while (iterator.hasNext()) {
+      System.out.println(iterator.next());
+    }
+  }
+}

리뷰: enhanced for loop를 사용해도 됩니다.
@@ -0,0 +1,50 @@
+package com.codesquad.datastructurestudy.list.arraylist;
+
+public class NameCard {
+
+  private String[] name;
+  private String[] phone;
+
+  // NameCard 구조체 변수의 동적 할당 및 초기화 후 주소 값 반환
+  public NameCard(String[] name, String[] phone) {
+    this.name = name;
+    this.phone = phone;
+  }
+
+  public NameCard() {
+    this.name = new String[30];
+    this.phone = new String[30];
+  }
+
+  // NameCard 구조체 변수의 정보 출력
+  public static void showNameCardInfo(NameCard nameCard) {
+    System.out.println("[이름] : " + nameCard.name);
+    System.out.println("[번호] : " + nameCard.phone);
+  }
+
+  // 이름이 같으면 true, 다르면 false 값 반환
+  public static boolean nameCompare(NameCard nameCard, String[] name) {
+    return nameCard.name.equals(name);
+  }
+
+  // 전화번호 정보를 변경
+  public static void changePhoneNum(NameCard nameCard, String[] phone) {
+    nameCard.phone = phone;
+  }
+
+  public static void main(String[] args) {
+    NameCard nameCard = new NameCard();
+    List<Integer> list = new ArrayList();
+
+    // 총 3명의 전화번호 정보를, 앞서 우리가 구현한 리스트에 저장한다.
+    nameCard.name[0] = "이진수";
+    nameCard.name[1] = "한지영";
+    nameCard.name[2] = "조수진";
+    nameCard.phone[0] = "010-1111-2222";
+    nameCard.phone[1] = "010-2222-5555";
+    nameCard.phone[2] = "010-3333-7777";
+
+  }
+
+
+}

리뷰: 좀 더 객체지향적인 접근을 해보세요 ㅎㅎ
@@ -0,0 +1,50 @@
+package com.codesquad.datastructurestudy.list.arraylist;
+
+public class NameCard {
+
+  private String[] name;
+  private String[] phone;
+
+  // NameCard 구조체 변수의 동적 할당 및 초기화 후 주소 값 반환
+  public NameCard(String[] name, String[] phone) {
+    this.name = name;
+    this.phone = phone;
+  }
+
+  public NameCard() {
+    this.name = new String[30];
+    this.phone = new String[30];
+  }
+
+  // NameCard 구조체 변수의 정보 출력
+  public static void showNameCardInfo(NameCard nameCard) {
+    System.out.println("[이름] : " + nameCard.name);
+    System.out.println("[번호] : " + nameCard.phone);
+  }
+
+  // 이름이 같으면 true, 다르면 false 값 반환
+  public static boolean nameCompare(NameCard nameCard, String[] name) {
+    return nameCard.name.equals(name);
+  }
+
+  // 전화번호 정보를 변경
+  public static void changePhoneNum(NameCard nameCard, String[] phone) {
+    nameCard.phone = phone;
+  }
+
+  public static void main(String[] args) {
+    NameCard nameCard = new NameCard();
+    List<Integer> list = new ArrayList();
+
+    // 총 3명의 전화번호 정보를, 앞서 우리가 구현한 리스트에 저장한다.
+    nameCard.name[0] = "이진수";
+    nameCard.name[1] = "한지영";
+    nameCard.name[2] = "조수진";
+    nameCard.phone[0] = "010-1111-2222";
+    nameCard.phone[1] = "010-2222-5555";
+    nameCard.phone[2] = "010-3333-7777";
+
+  }
+
+
+}

리뷰: 요 코드는 다시 작성하는게 좋아보입니다.
전체적으로 자바로 짠 느낌이 하나도 들지 않았어요.
@@ -0,0 +1,13 @@
+package com.codesquad.datastructurestudy.list.arraylist;
+
+public interface Wallet {
+
+  // 모든 멤버변수는 public static final. 생략 가능
+  int coin100Num = 0;
+  int bill5000Num = 0;
+
+  // 모든 메서드는 public abstract 이어야함. 생략 가능
+  int takeOutMoney(int coin100Num, int bill5000Num);
+  void putMoney(int coin100Num, int bill5000Num);
+
+}

리뷰: 학습 내용은 좋아보입니다.
근데 보통 interface에서는 멤버변수 선언을 잘 안하는 편이고, 네이밍 컨벤션에 맞게 작성해주시는게 좋을 것 같아요.
@@ -0,0 +1,41 @@
+import domain.Point
+
+class AroundMineChecker(private val mineBoard: Map<Point, Square>, private val currentPoint: Point) {
+
+    fun isFinish(): Boolean = mineBoard.getValue(currentPoint).isMine()
+
+    fun getBoard(): Map<Point, Square> {
+        val checkLeft = checkLeft(currentPoint, mineBoard)
+        return checkRight(currentPoint, checkLeft)
+    }
+
+    private fun checkLeft(currentPoint: Point, acc: Map<Point, Square> = emptyMap()): Map<Point, Square> {
+        val board = acc.toMutableMap()
+
+        if (!board.containsKey(currentPoint)) return acc
+        if (board.getValue(currentPoint).isMine()) return acc
+
+        val countMine = AroundMine(board, currentPoint).countMine()
+        board.replace(currentPoint, NonMine(countMine))
+
+        val diagonalUpLeft = checkLeft(currentPoint.diagonalUpLeft(), board)
+        val left = checkLeft(currentPoint.left(), diagonalUpLeft)
+        val diagonalBottomLeft = checkLeft(currentPoint.diagonalBottomLeft(), left)
+        return checkLeft(currentPoint.bottom(), diagonalBottomLeft)
+    }
+
+    private fun checkRight(currentPoint: Point, acc: Map<Point, Square> = emptyMap()): Map<Point, Square> {
+        val board = acc.toMutableMap()
+
+        if (!board.containsKey(currentPoint)) return acc
+        if (board.getValue(currentPoint).isMine()) return acc
+
+        val countMine = AroundMine(board, currentPoint).countMine()
+        board.replace(currentPoint, NonMine(countMine))
+        val up = checkRight(currentPoint.up(), board)
+        val diagonalUpRight = checkRight(currentPoint.diagonalUpRight(), up)
+        val diagonalBottomRight = checkRight(currentPoint.diagonalBottomRight(), diagonalUpRight)
+        return checkRight(currentPoint.right(), diagonalBottomRight)
+    }
+
+}

리뷰: [공식 컨벤션](https://kotlinlang.org/docs/coding-conventions.html#control-flow-statements)에 따르면 if문과 when문은 2줄 이상이면 중괄호를 사용합니다.

다만, 현재 코드는 early return을 하고 있어서 굳이 else 문을 쓸 필요가 없어보입니다.
@@ -0,0 +1,41 @@
+import domain.Point
+
+class AroundMineChecker(private val mineBoard: Map<Point, Square>, private val currentPoint: Point) {
+
+    fun isFinish(): Boolean = mineBoard.getValue(currentPoint).isMine()
+
+    fun getBoard(): Map<Point, Square> {
+        val checkLeft = checkLeft(currentPoint, mineBoard)
+        return checkRight(currentPoint, checkLeft)
+    }
+
+    private fun checkLeft(currentPoint: Point, acc: Map<Point, Square> = emptyMap()): Map<Point, Square> {
+        val board = acc.toMutableMap()
+
+        if (!board.containsKey(currentPoint)) return acc
+        if (board.getValue(currentPoint).isMine()) return acc
+
+        val countMine = AroundMine(board, currentPoint).countMine()
+        board.replace(currentPoint, NonMine(countMine))
+
+        val diagonalUpLeft = checkLeft(currentPoint.diagonalUpLeft(), board)
+        val left = checkLeft(currentPoint.left(), diagonalUpLeft)
+        val diagonalBottomLeft = checkLeft(currentPoint.diagonalBottomLeft(), left)
+        return checkLeft(currentPoint.bottom(), diagonalBottomLeft)
+    }
+
+    private fun checkRight(currentPoint: Point, acc: Map<Point, Square> = emptyMap()): Map<Point, Square> {
+        val board = acc.toMutableMap()
+
+        if (!board.containsKey(currentPoint)) return acc
+        if (board.getValue(currentPoint).isMine()) return acc
+
+        val countMine = AroundMine(board, currentPoint).countMine()
+        board.replace(currentPoint, NonMine(countMine))
+        val up = checkRight(currentPoint.up(), board)
+        val diagonalUpRight = checkRight(currentPoint.diagonalUpRight(), up)
+        val diagonalBottomRight = checkRight(currentPoint.diagonalBottomRight(), diagonalUpRight)
+        return checkRight(currentPoint.right(), diagonalBottomRight)
+    }
+
+}

리뷰: 재귀적으로 처리하는 방식이 좋네요. 다만 반환을 하지 않고 내부의 상태를 변경한다는 점이 조금 아쉽습니다.
내부 상태를 변경하는대신 반환하도록 만들고 순수함수로 만들어보면 어떨까요?

아래와 같은 함수 서명으로 만들어보면 좋겠어요.
```kotlin
private fun checkLeft(
    currentPoint: Point, 
    acc: Map<Point, Square> = emptyMap(),
): Map<Point, Square> {
    // TODO
}
```
@@ -0,0 +1,41 @@
+import domain.Point
+
+class AroundMineChecker(private val mineBoard: Map<Point, Square>, private val currentPoint: Point) {
+
+    fun isFinish(): Boolean = mineBoard.getValue(currentPoint).isMine()
+
+    fun getBoard(): Map<Point, Square> {
+        val checkLeft = checkLeft(currentPoint, mineBoard)
+        return checkRight(currentPoint, checkLeft)
+    }
+
+    private fun checkLeft(currentPoint: Point, acc: Map<Point, Square> = emptyMap()): Map<Point, Square> {
+        val board = acc.toMutableMap()
+
+        if (!board.containsKey(currentPoint)) return acc
+        if (board.getValue(currentPoint).isMine()) return acc
+
+        val countMine = AroundMine(board, currentPoint).countMine()
+        board.replace(currentPoint, NonMine(countMine))
+
+        val diagonalUpLeft = checkLeft(currentPoint.diagonalUpLeft(), board)
+        val left = checkLeft(currentPoint.left(), diagonalUpLeft)
+        val diagonalBottomLeft = checkLeft(currentPoint.diagonalBottomLeft(), left)
+        return checkLeft(currentPoint.bottom(), diagonalBottomLeft)
+    }
+
+    private fun checkRight(currentPoint: Point, acc: Map<Point, Square> = emptyMap()): Map<Point, Square> {
+        val board = acc.toMutableMap()
+
+        if (!board.containsKey(currentPoint)) return acc
+        if (board.getValue(currentPoint).isMine()) return acc
+
+        val countMine = AroundMine(board, currentPoint).countMine()
+        board.replace(currentPoint, NonMine(countMine))
+        val up = checkRight(currentPoint.up(), board)
+        val diagonalUpRight = checkRight(currentPoint.diagonalUpRight(), up)
+        val diagonalBottomRight = checkRight(currentPoint.diagonalBottomRight(), diagonalUpRight)
+        return checkRight(currentPoint.right(), diagonalBottomRight)
+    }
+
+}

리뷰: 각 방향을 반환하는 함수들 가독성이 좋네요 👍
@@ -0,0 +1,41 @@
+import domain.Point
+
+class AroundMineChecker(private val mineBoard: Map<Point, Square>, private val currentPoint: Point) {
+
+    fun isFinish(): Boolean = mineBoard.getValue(currentPoint).isMine()
+
+    fun getBoard(): Map<Point, Square> {
+        val checkLeft = checkLeft(currentPoint, mineBoard)
+        return checkRight(currentPoint, checkLeft)
+    }
+
+    private fun checkLeft(currentPoint: Point, acc: Map<Point, Square> = emptyMap()): Map<Point, Square> {
+        val board = acc.toMutableMap()
+
+        if (!board.containsKey(currentPoint)) return acc
+        if (board.getValue(currentPoint).isMine()) return acc
+
+        val countMine = AroundMine(board, currentPoint).countMine()
+        board.replace(currentPoint, NonMine(countMine))
+
+        val diagonalUpLeft = checkLeft(currentPoint.diagonalUpLeft(), board)
+        val left = checkLeft(currentPoint.left(), diagonalUpLeft)
+        val diagonalBottomLeft = checkLeft(currentPoint.diagonalBottomLeft(), left)
+        return checkLeft(currentPoint.bottom(), diagonalBottomLeft)
+    }
+
+    private fun checkRight(currentPoint: Point, acc: Map<Point, Square> = emptyMap()): Map<Point, Square> {
+        val board = acc.toMutableMap()
+
+        if (!board.containsKey(currentPoint)) return acc
+        if (board.getValue(currentPoint).isMine()) return acc
+
+        val countMine = AroundMine(board, currentPoint).countMine()
+        board.replace(currentPoint, NonMine(countMine))
+        val up = checkRight(currentPoint.up(), board)
+        val diagonalUpRight = checkRight(currentPoint.diagonalUpRight(), up)
+        val diagonalBottomRight = checkRight(currentPoint.diagonalBottomRight(), diagonalUpRight)
+        return checkRight(currentPoint.right(), diagonalBottomRight)
+    }
+
+}

리뷰: 이 함수들을 Point 클래스로 옮겨보면 어떨까요?
@@ -0,0 +1,45 @@
+* 기능 요구 사항
+  1. 주어진 횟수 동안 n 대의 자동차는 전진 또는 멈출 수 있다.
+  2. 사용자는 몇 대의 자동차로 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다.
+  3. 전진하는 조건은 0에서 9 사이에서 random 값을 구한 후 random 값이 4 이상일 경우이다.
+  4. 자동차의 상태를 화면에 출력한다. 어느 시점에 출력할 것인지에 대한 제약은 없다.
+
+* 프로그래밍 요구 사항
+  1. 모든 로직에 단위 테스트를 구현한다. 단, UI(System.out, System.in) 로직은 제외
+  2. else 예약어를 쓰지 않는다.
+
+* 기능 목록 및 commit 로그 요구사항
+  git의 commit 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위로 추가한다.
+
+* 기능 목록
+  1. 사용자로부터 자동차 대수와 이동횟수를 입력받는다.
+  2. 0에서 9 사이의 랜덤 값을 구한다.
+  3. 랜덤 값이 4 이상(4 <= n <= 9)일 때 전진한다. 이 외의 값을 입력받으면 움직이지 않는다.
+  4. 자동차의 상태를 화면에 출력한다.
+
+P.S
+안녕하세요 이동규 리뷰어님
+
+스텝 3 부터 난이도가 많이 올라갔네요..ㅠㅠ
+
+요구사항 대로 맞게 구현했는지 잘 모르겠습니다 ㅠㅠ
+부족한 부분들에 대해 가감없이 팩트 폭격 부탁드릴게요..ㅠㅠ
+
+그리고 한 가지 질문이 있습니다.
+
+테스트 진행 시 각 파라미터마다 산출되는 결과가 다를 때는 어떻게 코드를 짜야하나요?
+예를 들어, 제가 구현한 테스트 소스에서 moving() 메소드의 경우
+
+각각의 파라미터 값 마다 문자열 값이 다르게 나오는데 이를 어떻게 비교하면 되나요?
+
+제가 생각해본건 if 조건문을 걸어서 => if (randomValueForMove == N)
+각 파라미터 마다 나와야 하는 값을 일일이 비교하는 건데 너무 번거로운 것 같아서요..
+
+이 부분에 대해서 코멘트 부탁드릴게요!
+
+감사합니다.
+
+
+
+
+

리뷰: 파라미터 마다 다른 값이 나오는 경우는 ParameterizedTest를 활용하시면 테스트 가능합니다~
@@ -0,0 +1,19 @@
+public class Car {
+
+    private String moving;
+
+    public Car () {}
+
+    public Car(String moving) {
+        this.moving = moving;
+    }
+
+    public String getMoving() {
+        return moving;
+    }
+
+    public void setMoving(String moving) {
+        this.moving = moving;
+    }
+
+}

리뷰: 단순히 데이터를 전달하는 dto를 제외하고는 getter, setter를 사용하지 말고 프로그래밍해보세요. (적어도 이번 과정에서만이라도요)
혹여 getter를 사용하지 않고는 못하겠다 하더라도 setter 없이는 프로그래밍 가능합니다.
@@ -0,0 +1,113 @@
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import java.util.Scanner;
+
+public class RacingCar {
+
+    static String move = "-";
+
+    static List<Car> recordMovingCar = new ArrayList<>();
+
+    public static void main(String[] args) {
+
+        InputView userInput = scannerInput();
+
+        int numberOfCarsValue = userInput.getNumberOfCars();
+        int numberOfAttemptsValue = userInput.getNumberOfAttempts();
+
+        System.out.println("======= READY =========");
+        for (int carNumber=0; carNumber < numberOfCarsValue; carNumber++) { System.out.println(move); }
+
+        System.out.println("======= START!! =======");
+        randomMove(numberOfCarsValue, numberOfAttemptsValue);
+
+    }
+
+    public static void randomMove(int numberOfCarsValue, int numberOfAttemptsValue) {
+        Random random = new Random();
+
+        for (int attempt=0; attempt < numberOfAttemptsValue; attempt++) {
+            for (int eachCar = 0; eachCar < numberOfCarsValue; eachCar++) {
+
+                int randomValueForMove = random.nextInt(numberOfAttemptsValue);
+
+                String move = "-";
+                Car car = new Car();
+                car.setMoving(move);
+                recordMovingCar.add(car);
+
+                String beforeMoving = "";
+
+//                System.out.println("랜덤 값 : " + randomValueForMove);
+
+                if (randomValueForMove > 9 || randomValueForMove < 4) {
+                    beforeMoving = recordMovingCar.get(eachCar).getMoving();
+                    String doNotMove = beforeMoving + moving(randomValueForMove);
+                    car.setMoving(doNotMove);
+                }
+
+
+                if (randomValueForMove > 0 & randomValueForMove > 3 & randomValueForMove <= 9) {
+                    beforeMoving = recordMovingCar.get(eachCar).getMoving();
+                    String plusMoving = beforeMoving + moving(randomValueForMove);
+                    car.setMoving(plusMoving);
+                }
+
+                recordMovingCar.add(car);
+                recordMovingCar.get(eachCar).setMoving(car.getMoving());
+                System.out.println(recordMovingCar.get(eachCar).getMoving());
+            }
+            System.out.print(System.lineSeparator());
+        }
+    }
+
+    public static String moving(int randomValueForMove) {
+        String move = "-";
+
+        if (randomValueForMove > 9 || randomValueForMove < 4) {
+            move = "";
+            return move;
+        }
+
+        for (int number=0; number < randomValueForMove; number++) { move = move + "-";}
+
+        return move;
+    }
+
+    public static InputView scannerInput() {
+
+        InputView inputView = new InputView();
+        Scanner scanner = new Scanner(System.in);
+
+        System.out.println("자동차 대수는 몇 대인가요?");
+        inputView.setNumberOfCars(scanner.nextInt());
+
+        System.out.println("시도 횟수는 몇 회인가요?");
+        inputView.setNumberOfAttempts(scanner.nextInt());
+
+        return inputView;
+    }
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

리뷰: 이 로직은 InputView에 역할을 위임하는 건 어떨까요
@@ -0,0 +1,77 @@
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
+import org.junit.jupiter.params.provider.ValueSource;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import static org.assertj.core.api.Assertions.*;
+
+public class RacingCarTest {
+
+    List<Car> recordMovingCar = new ArrayList<>();
+
+    @ParameterizedTest
+    @ValueSource(ints = {1, 2, 3, 4, 5})
+    @DisplayName("입력한 횟수 만큼의 '-' 문자열 만들기")
+    public String moving(int randomValueForMove) {
+        String move = "-";
+
+        if (randomValueForMove > 9 || randomValueForMove < 4) {
+            move = "";
+            return move;
+        }
+
+        for (int number=0; number < randomValueForMove; number++) { move = move + "-";}
+
+        return move;
+    }
+
+    @ParameterizedTest
+    @CsvSource({
+            "1, 2",
+            "5, 7",
+            "3, 5",
+            "2, 7"
+    })
+    @DisplayName("입력한 자동차 대수 및 시도 횟수에 맞게 결과가 출력 되는가")
+    public void randomNumberForMove(int numberOfCarsValue, int numberOfAttemptsValue) {
+        Random random = new Random();
+
+        for (int attempt=0; attempt < numberOfAttemptsValue; attempt++) {
+            for (int eachCar = 0; eachCar < numberOfCarsValue; eachCar++) {
+                int carIndex = eachCar + 1;
+                int randomValueForMove = random.nextInt(numberOfAttemptsValue);
+
+                String move = "-";
+                Car car = new Car();
+                car.setMoving(move);
+                recordMovingCar.add(car);
+
+                String beforeMoving = "";
+
+//                System.out.println("랜덤 값 : " + randomValueForMove);
+
+                if (randomValueForMove > 9 || randomValueForMove < 4) {
+                    beforeMoving = recordMovingCar.get(eachCar).getMoving();
+                    String doNotMove = beforeMoving + moving(randomValueForMove);
+                    car.setMoving(doNotMove);
+                }
+
+                if (randomValueForMove > 0 & randomValueForMove > 3 & randomValueForMove <= 9) {
+                    beforeMoving = recordMovingCar.get(eachCar).getMoving();
+                    String plusMoving = beforeMoving + moving(randomValueForMove);
+                    car.setMoving(plusMoving);
+                }
+
+                recordMovingCar.add(car);
+                recordMovingCar.get(eachCar).setMoving(car.getMoving());
+                System.out.println(recordMovingCar.get(eachCar).getMoving());
+            }
+            System.out.print(System.lineSeparator());
+        }
+    }
+}

리뷰: - 테스트코드에 if 조건 분기를 작성할 일은 없습니다. 테스트하고자 하는 대상에 메시지를 보낸 후 응답받은 값이 의도한 결과와 같은지만 검증하면 됩니다.
- 단위 테스트에 return 문을 작성한 후 이를 활용하는 형태는 지양합니다. 필요하다면 별도의 Test Fixture를 작성하고 활용하시면 됩니다.