- 자동차 경주 게임 요구사항을 파악한다.
- 요구사항에 대한 구현을 완료한 후 자신의 github 아이디에 해당하는 브랜치에 Pull Request(이하 PR)를 통해 코드 리뷰 요청을 한다.
- 코드 리뷰 피드백에 대한 개선 작업을 하고 다시 PUSH한다.
- 모든 피드백을 완료하면 다음 단계를 도전하고 앞의 과정을 반복한다.
- 초간단 자동차 경주 게임을 구현한다.
- 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다.
- 사용자는 몇 대의 자동차로 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다.
- 전진하는 조건은 0에서 9 사이에서 random 값을 구한 후 random 값이 4이상일 경우이다.
- 자동차의 상태를 화면에 출력한다. 어느 시점에 출력할 것인지에 대한 제약은 없다.
- 자동차의 처음 위치는 0이다.
- 사용자가 입력한 개수만큼의 자동차가 존재한다.
- 사용자가 0 또는 음수의 자동차 개수를 입력하면 에러를 반환한다.
- random값이 4 이상일 경우에 자동차의 위치는 1 추가된다.
- m 라운드가 끝나면 자동차 경주는 종료된다.
- 모든 로직에 단위 테스트를 구현한다. 단, UI(System.out, System.in) 로직은 제외
- 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 구분한다.
- UI 로직을 InputView, ResultView와 같은 클래스를 추가해 분리한다.
- 자바 코드 컨벤션을 지키면서 프로그래밍한다.
- 이 과정의 Code Style은 intellij idea Code Style. Java을 따른다.
- intellij idea Code Style. Java을 따르려면 code formatting 단축키(Windows : Ctrl + Alt + L. Mac : ⌥ (Option) + ⌘ (Command) + L.)를 사용한다.
- else 예약어를 쓰지 않는다.
- 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다.
- else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다.
Game : 게임의 시작과 종료를 담당 Race : 전체 라운드의 진행을 담당 GameSettings : 자동차 경주 게임의 설정값 Car : 자동차 객체 InputView : 사용자의 입력을 받음 ResultView : 결과를 출력
- 각 자동차에 이름을 부여할 수 있다. 자동차 이름은 5자를 초과할 수 없다.
- 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.
- 자동차 이름은 쉼표(,)를 기준으로 구분한다.
- 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한명 이상일 수 있다.
-
자동차 이름 기능
-
Car
클래스에 이름 필드 추가 - 이름 유효성 검사 (5자 초과 불가)
-
Car
생성자에 이름 파라미터 추가 -
CarTest
에 이름 관련 테스트 추가- 이름이 5자를 초과하면 예외 발생
- 유효한 이름으로 생성 가능
-
-
자동차 이름 출력
-
ResultView
수정- 자동차 이름과 위치를 함께 출력하는 형식 변경
-
presentCars
메소드 파라미터 수정 (이름 정보 추가)
-
Race
클래스 수정-
getCarPositions
메소드를getCarStatus
로 변경 - 자동차 이름과 위치를 함께 반환하도록 수정
-
-
-
자동차 이름 입력
-
InputView
수정- 자동차 이름 입력 메소드 추가
- 쉼표로 구분된 이름 문자열 파싱 로직 추가
-
GameSettings
수정- 자동차 이름 목록 필드 추가
- 생성자 수정
-
-
우승자 판정
-
Race
클래스에 우승자 판정 로직 추가-
getWinners
메소드 추가 - 가장 멀리 간 자동차들 찾기
-
-
ResultView
에 우승자 출력 메소드 추가 -
Game
클래스 수정- 경주 종료 후 우승자 출력 로직 추가
-
- Game: 게임의 전체 생명주기 관리 및 사용자 인터랙션 조정
- Race: 경주 진행 상태 관리, 자동차 이동 처리, 우승자 판정
- GameSettings: 게임 설정값(자동차 이름, 라운드 수) 검증 및 관리
- Car: 자동차의 기본 속성(이름, 위치) 관리
- InputView: 사용자 입력 처리 및 검증
- ResultView: 게임 진행 상태 및 결과 출력
- CarStatus: 자동차의 현재 상태를 불변 객체로 표현
- MoveStrategy: 자동차 이동 전략 정의 (RandomMoveStrategy, FixedMoveStrategy)
- indent(인덴트, 들여쓰기) depth를 2를 넘지 않도록 구현한다. 1까지만 허용한다.
- 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.
- 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메소드)를 분리하면 된다.
- 함수(또는 메소드)의 길이가 15라인을 넘어가지 않도록 구현한다.
- 함수(또는 메소드)가 한 가지 일만 잘 하도록 구현한다.
- 모든 로직에 단위 테스트를 구현한다. 단, UI(System.out, System.in) 로직은 제외
- 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 구분한다.
- UI 로직을 InputView, ResultView와 같은 클래스를 추가해 분리한다.
- 자바 코드 컨벤션을 지키면서 프로그래밍한다.
- else 예약어를 쓰지 않는다.
- 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다.
- else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다.