toString과 view는 어떤 차이가 있나요?

토닉·2022년 2월 21일
0

문제

자동차 경주를 구현하다가 자동차의 출력 부분에서 고민이 생겼다.
자동차의 이름과 위치를 - 로 출력해주어야 한다.
car1 : --- : car1은 3만큼 움직였다.
처음 나는 출력할 때 Car의 toString()에서 위처럼 포맷팅하여 구현했다.

public String toString() {
    return String.format("%s : %s",
        name.value(), "-".repeat(position.value()));
}

위처럼 작성한 이유

  • toString()은 요구사항의 형식도 간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환한다고 생각해서
  • getter의 사용을 피하기 위해

피드백

toString()의 용도가 무엇일까요?

  • 디버깅을 위한 메소드

객체의 정보가 어떤지 개발자가 확인하는 용도이지 요구사항에 맞게 출력을 하는 것은 옳지 않다.

getter를 왜 피해야 하죠?

  • getter를 피해야 하는 상황은 도메인 간의 객체 정보 전달
  • view에게 객체의 정보를 전달해야 할 땐 getter가 필요

요구사항에서 Car는 자신의 정보
(이름, 위치)를 전달해야 하는 역할이 생겼기 때문에 이럴 땐 getter를 작성해 주어야 한다.

해결

Car의 이름과 위치를 반환하는 getter 생성

  • 단, 이 때 객체를 그대로 반환하기 보단 캡슐화를 위해 객체의 값을 반환해준다.
Car {
    private final Name name;
    private final Position position;
    
    public String getName() {
        return name.value();
    }    
    
    public int getPosition() {
        return position.value();
    }
}

view에서 차의 이름과 위치를 받아 요구사항 출력에 맞게 구현

OutputView {
    public static void printCar(Car car) {
        System.out.printf("%s : %s",
        car.getName(), "-".repeat(car.getPosition()));
    }
}
profile
우아한테크코스 4기 교육생

0개의 댓글