기능 요구사항
•
각 자동차에 이름을 부여할 수 있다. 자동차 이름은 5자를 초과할 수 없다.
•
전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.
•
자동차 이름은 쉼표(,)를 기준으로 구분한다.
•
자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한명 이상일 수 있다.
실행 결과
•
위 요구사항에 따라 3대의 자동차가 5번 움직였을 경우 프로그램을 실행한 결과는 다음과 같다.
실행결과
피드백
리뷰어 : 클래스 파일 작성 시, 다음 링크에서 제안하는 순서대로 작성해보시면 좋을 것 같습니다.
생각정리 : 클래스 파일 변수를 작성하는 순서는 회사와 맞게 하려고 했지, 순서가 있는지 처음 알았다. 인지하고 작성하도록 하자.
private int position = 0;
private static final Random random = new Random();
private static final int STARTING_CONDITION = 4;
private static final int RANDOM_RANGE = 10;
private static final int NAME_MAX_LENGTH = 5;
private int attemptCount = 0;
private String name;
Java
복사
•
다음과 같이 변경
private static final Random RANDOM = new Random();
private static final int STARTING_CONDITION = 4;
private static final int RANDOM_RANGE = 10;
private static final int NAME_MAX_LENGTH = 5;
private int position = 0;
private int attemptCount = 0;
private String name;
Java
복사
리뷰어 : 자동차 이름인 문자열 name을 클래스로 포장해보는 건 어떨까요?
생각정리 : 모든 값을 원시값으로 포장하는것이 많은 클래스들이 생길 텐데, 클래스를 관리하게 된다면 더 힘들지 않을까? 라는 생각도 한편으로 들지만, 그래도 확실시 로직을 구분하는 것은 분석하는데 도움이 많이 될 것 같다.
package study.step4;
public class Name {
private static final intNAME_MAX_LENGTH= 5;
String name;
public Name(String name) {
checkName(name);
this.name = name;
}
private void checkName(String name) {
if (name.length() >NAME_MAX_LENGTH) {
throw new IllegalArgumentException("이름이 다섯자 이상입니다.");
}
}
public String getName() {
return name;
}
}
Java
복사
리뷰어 : String.format()을 활용하면 어떤 문자열이 생성될지 대략적으로 알 수 있어서 가독성을 높여볼 수 있습니다.
public class ResultView {
private ResultView() {
// 생성자 내부 호출 -> 명시적 Exception
throw new AssertionError();
}
public static void outPut(Track track) {
StringBuilder stringBuilder = new StringBuilder();
List<Car> cars = track.getCars();
for (Car car : cars) {
addCarName(stringBuilder, car);
changeCarMoveToString(stringBuilder, car);
stringBuilder.append("\n");
}
}
Java
복사
•
다음과 같이 변경
public static void outPut(Track track) {
StringBuilder stringBuilder = new StringBuilder();
List<Car> cars = track.getCars();
for (Car car : cars) {
stringBuilder.append(String.format("%s : %s%n", car.getCarName(), POSITION_CHARTER.repeat(car.getPosition())));
}
}
Java
복사
리뷰어 : 우승자 입력 함수 stream 으로 처리
public static void outPut(Track track) {
StringBuilder stringBuilder = new StringBuilder();
List<Car> cars = track.getCars();
for (Car car : cars) {
addCarName(stringBuilder, car);
changeCarMoveToString(stringBuilder, car);
stringBuilder.append("\n");
}
System.out.println(stringBuilder);
}
Java
복사
•
다음과 같이 변경
public static void outPutWinner(Track track) {
StringBuilder stringBuilder = new StringBuilder();
List<Car> winners = track.getWinnerCars();
String victoryMessage = winners.stream().map(n -> String.valueOf(n.getName()))
.collect(Collectors.joining(", "));
stringBuilder.append(victoryMessage).append("가 최종 우승했습니다.");
System.out.println(stringBuilder);
}
Java
복사
코드 구성
작성코드
후기
오늘은 자동차 경주 우승자 4단계를 실행하게 되었다. 일급컬렉션, 원시값 포장에 대해 알 수 있었고, 사용하게 되면 테스트 코트를 구현하기도 좋고, 관리하는 측면에서도 도움이 많이 될 것 이라고 생각하였다. 인지하고, 잘 활용할 수 있도록 노력해야 겠다.
깃허브 링크
출처