우아한테크코스 6기 백엔드 프리코스 - 자동차 경주 게임

테스트 목록

앞으로 구현해야 할 테스트는 2개이다. (m2t08을 추가했다.)

m2t01 - 자동차 이름은 5자 이하의 문자열이며 쉼표로 구분하여 입력받는다.
m2t02 - 이동 횟수는 숫자만을 입력받는다.
m2st01 - 정규표현식 학습 테스트
m2t03 - 이외의 값을 입력할 경우 IllegalArgumentException을 발생시키며 프로그램은 종료된다.
m2t04 - 우승한 자동차의 이름을 모두 출력한다. 한 개 이상인 경우 쉼표로 구분하여 출력한다.
m2t05 - 지정된 범위의(0부터 9까지) 난수를 생성할 수 있어야 한다.
m2t06 - 1회의 이동에서 생성된 난수가 4 이상인 경우에만 전진한다.
m2t07 - 입력받은 횟수 만큼의 전진이 끝난 뒤 가장 앞에 있는 자동차를 선택한다.
m2t08 - 모든 자동차들이 이동한 뒤 화면에 현재 상황을 출력한다.

구현

리팩토링

테스트를 작성하기 전에 IOTest의 중복을 제거하기로 했다. 이 클래스에서 중복된 코드는 다음과 같다.

  • GameRule 초기화
  • 입력값 전달을 위한 스트림 리다이렉션 & 원상복구
  • prompt.close()

IOTest 리팩토링 1

아래의 stdInWillRead(String input) 메서드로 전달된 문자열은 stdIn으로 전달된다. 엄밀히 말하면 System.in 스트림이 input 이 저장된 스트림으로 변경되었다.
restoreStdIn 메서드는 System.in이 표준 입출력 스트림을 참조하도록 되돌려 놓는다.

IOTest 리팩토링 2

m2t08

m2t08

아래와 같이 수정했다.

m2t08-2

오류 수정

게임의 규칙을 잘못 이해했다. 랜덤 숫자가 4이상이면 무조건 1칸 전진이였다!!

오류 수정

기존의 테스트 한 개를 수정했다.

테스트 수정

m2t04

미션에서 제공해준 테스트를 사용하였고 Application 클래스는 아래와 같이 구현했다.

main

리팩토링

Application 클래스에서 문자열 리터럴을 사용한 것부터 시작하자. 그리고 System.out같은 외부 API도 최대한 숨겨보자.

main 리팩토링

런타임에 변하지 않는 상태를 다루는 객체는 모두 static final 을 붙여 의도하지 않은 변경을 막았다. static 키워드를 붙이면 컴파일 타임에 초기화 되기 때문에 성능이 향상된다는 이점이 있지만 여기에서는 별로 의미는 없다.

마무리

시간

reference

Comments