조종 다음은 개발
article thumbnail

서론

pobi : ----
juni : --
choi : ------

나는 우테코 프리코스 2 주차 미션 요구사항에서는 자동차 진행 결과를 위와 같이 출력해야 했다.

그래서 나는 Car 객체의 toString을 재정의하여 간단하게 출력하였다.

System.out.println(car)를 해주면
${이름} : ---- 로 깔끔하게 나오기 때문에
toString을 재정의 하는 게 좋다고 생각했었다.

혹시 모르니 피드백 해주신 분들의 이름은 모자이크 했다.

그런데 2 주차 미션에 대해 코드 리뷰를 받으면서 출력이 수정된다면 도메인을 수정해야 한다는 것이 어색하다는 피드백을 받았다.
그래서 이번 기회에 toString의 역할에 대해서 알아보면 좋을 것 같아 이 글을 작성하게 되었다.

👷 toString의 역할

toString 의 역할은 무엇일까?
toString 의 일반 규약은 '간결하면서 사람이 읽기 쉬운 형태의 유익한 정보'를 반환하는 것이다.

 

그런데 기본 toString 은 읽기 쉬운 유익한 정보를 줄까??

class Car {
    private String name;
    private int position;

    public Car(String name, int position) {
        this.name = name;
        this.position = position;
    }
}

위 객체를 출력해 보자.

Car car = new Car("myCar", 0);
System.out.println(car.toString); // toString() 은 생략해도 된다.

실제로 출력해 보면 Car@59a6e353와 같이 알기 어려운 정보를 반환한다.

이 같은 정보가 나오는 이유는 최상의 객체인 Object에서 toString을 아래와 같이 정의하기 때문이다.

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

이는 전혀 알기 쉬운 정보가 아니다.

 

그래서 이펙티브 자바 아이템 12에서는 "항상 toString을 재정의 해라"라고 말한다.
자세한 내용은 이 팩티브 자바에서 확인하면 좋을 것 같다.

🙄View에 맞게 toString을 재정의하면 안 돼?

toString을 재정의 해야 한다는 것은 알았다.
그렇다면 왜 View에 맞게 재정의하면 안 될까?

단순히 'toString 은 디버깅을 위한 용도이기 때문' 일까?

 

View에 맞게 toString을 재정의하면 안 되는 이유는 서로 계층에 영향을 주면 안 되기 때문이다.

 

만약 출력 방식을 pobi : ---- 가 아니라 [X][X][X][X] : pobi와 같이 수정해 달라고 요청이 왔다고 해보자.
그렇다면 어디에서 수정을 해줘야 할까?

 

당연히 출력 담당이니까 에서 수정해줘야 하는 게 맞다.

그런데 나의 경우와 같이 도메인 객체에서 toString을 출력 형식에 맞게 재정의했다면??

결국 손을 대야할 클래스가 View 레벨뿐만이 아닌 도메인 객체도 포함이 되어버린다.

 

즉, 요구사항이 변경되면 어느 곳에서 변경이 일어날지 예측하기 어려워진다.
이는 유지보수의 어려움으로 이어진다.

 

그렇기 때문에 toString을 뷰에 맞게 재정의하면 안 된다.
출력에 대한 책임은 오직 뷰가 가지도록 해주자!

🌐 Reference

https://stackoverflow.com/questions/4762406/tostring-for-debugging-or-for-humans

 

toString(): for debugging or for humans?

class Address { private enum Component { NUMBER, STREET, STATE, COUNTRY } private Map<Component, String> componentToValue = ...; } I'd like my class to contain two m...

stackoverflow.com

https://dublin-java.tistory.com/46

 

[Java] toString()에 대해서

어느 날 누가 내게 toString()은 언제, 어떻게 써야 하냐고 물었는데 대답할 수가 없었다. 그동안 생각 없이 toString()을 사용했구나! 생각이 들면서 마침 이펙티브 자바에 설명이 잘 되어있어서 정리

dublin-java.tistory.com

https://tjdtls690.github.io/studycontents/java/2022-10-13-to_string/

 

[자바, Java] toString 의 용도 - 단순 로그?? or View 로직도 가능??

.

tjdtls690.github.io

https://hudi.blog/java-correct-purpose-of-tostring/

 

Java 에서 toString 메소드의 올바른 사용 용도에 대하여

이펙티브 자바 3판의 아이템 12, 'toString을 항상 재정의하라' 의 많은 내용을 참고하였다. 학습 동기 toString 메소드는 어떤 용도로 사용하라고 만들어진 것 일까? 우아한테크코스 레벨1 자동차 경

hudi.blog

 

'개발 스토리' 카테고리의 다른 글

DTO 를 사용하는 이유  (0) 2023.11.12
나도 한 번 정리해보자, TDD  (0) 2023.11.08
Enum 을 꼭 사용해야 할까??  (4) 2023.11.06
원시값 포장에 대해 알아보자!  (10) 2023.10.30
getter 를 지양해야하는 이유  (1) 2023.10.28
profile

조종 다음은 개발

@타칸

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!