오늘 한일

자동차경주게임 피드백 반영

이펙티브 자바 4. clone을 재정의할 때는 신중하게 한다.

자동차게임의 단계별 결과를 저장하기 전, 자동차 복사를 위해 clonable 구현, clone 메소드를 제공하던 구조에서 정적 팩토리 메소드로 변경했다. 이 과정에서 리뷰어님과 많은 대화를 나눴다.

@Test
public void test2() {
    RacingCar car = new RacingCar();
    System.out.println(car);
    System.out.println(new NamedRacingCar(car.getPosition(), car.toString()));
}

// racing.model.RacingCar@c2e1f26
// racing.model.RacingCar@c2e1f26

자동차 name에 대한 getter를 toString으로 사용하여 RacingCar타입으로 NamedRacingCar를 생성하면 toString도 그대로 복사되는 문제가 있어서 cloneable 구현과 clone 메소드를 제공하는 구조로 변경했다.

// racing.model.RacingCar@6193b845
// racing.model.RacingCar@2e817b38

그러나 toString이 같은 값을 가지지 않으면 로그를 출력하는 부분에서 각 라운드의 자동차들이 모두 다른 자동차처럼 보이는 것이 더 이상하다는 생각이 들었다.

// NamedRacingCar
public static RacingCar copy(RacingCar car) {
    return new NamedRacingCar(car.toString(), car.getPosition());
}

// RacingGameBoard
public int createCars(List<String> names) {
    cars.addAll(names.stream()
            .map(name -> new RacingCar())
            .collect(Collectors.toList()));
    return cars.size();
}

// StepResult
private List<RacingCar> copyCars(List<RacingCar> cars) {
    return cars.stream()
            .map(car -> NamedRacingCar.copy(car))
            .collect(Collectors.toList());
}

// 실행 결과
// racing.model.RacingCar@6193b845 : 
// racing.model.RacingCar@2e817b38 : -
// racing.model.RacingCar@c4437c4 : -

// racing.model.RacingCar@6193b845 : 
// racing.model.RacingCar@2e817b38 : -
// racing.model.RacingCar@c4437c4 : -

정적 팩토리 메소드를 제공하는 구조로 변경하여 피드백을 기다리는 중이다.

로또게임 1단계 구현

18년 10월 쯤에 NextStep 책에서 봤던 로또게임이 교육과정 2주차 과제였다. github repo에 코드를 올린 적이 있었는데 다시 개발해보니 처음 개발해보는 것 마냥 어려웠다. 최대한 TDD로 개발을 진행해야 했는데, 하나의 클래스를 개발하는 도중에 다른 클래스가 필요해지면 해당 클래스 개발로 넘어갔다가 다시 원래 클래스를 개발하면서 정신이 없었다.

피드백 요청에 남긴 질문

  • 보통 TDD로 개발을 진행하면서 테스트를 작성하다가 다른 클래스가 필요해질 때는 현재 작성중인 클래스 개발을 멈추고 다른 클래스를 진행하나요??
  • 구조를 잡기 어려웠던 부분
    • GameBoard에서 티켓목록 반환 -> ResultView에서 티켓목록 출력
      • 티켓구매 메소드에서 생성된 티켓의 복사본을 반환하는게 더 나을까요?
    • Gameboard의 티켓구매 메소드에서 티켓의 갯수 반환, 당첨체크 메소드에서 List<랭크> 반환 -> ResultView에서 티켓의 갯수와 List<랭크>를 이용해 통계 출력
      • 별도의 통계 클래스를 만들어서 제공하는게 더 나을까요?

오늘 느낀점

2주차까지 진행한 과제 2개의 요구사항이 비교적 간단하지만 TDD, 객체지향 생활체조 규칙을 따르려고 하다보니 많은 어려움을 겪었다. OOP의 기본 원칙을 준수하기가 이렇게 어려울 줄이야. 특히 getter를 사용하지 않고 요구사항을 만족하기가 너무 힘들었다.

내일 할일

  • 우아한 테크코스 지원 결과 확인
    • 이거 떨어지면 어떡하지....
    • 다른 학원을 알아보거나 앞으로의 공부 계획을 세워봐야겠다
  • DP 관련 알고리즘 문제 한 개 풀기
  • 자동차경주게임 3단계 merge가 되지 않은 경우 다시 피드백 반영하고 리뷰 요청하기
  • 로또 1단계 구현 피드백 반영하고 리뷰 요청하기