아이템 12. toString()을 항상 재정의하라

Hyunta·2022년 2월 17일
0

이펙티브 자바

목록 보기
2/3

학습동기

"만약 요구사항이 콘솔 출력에서 웹 페이지 출력으로 바뀐다면 toString의 반환값을 HTML로 나타내야 할까?" 라는 질문에 대해서도 한번 고민해보시면 좋겠습니다.
-리뷰어 에단

자동차 미션을 구현하던 중 toString() 메서드에 대한 질문을 받고 출력형태에 따라 반환값을 다르게 해야하나 고민했다. 이펙티브 자바에 toString()에 관한 내용이 있길래 읽고 정리해봤다.


요약 정리

toString() 일반 규약

  • '간결하면서 사람이 읽기 쉬운 형태의 유익한 정보'를 반환한다.
  • 모든 하위 클래스에서 이 메서드를 재정의하는 것을 추천한다.

한국에서 이러한 전화번호를 출력하는 메서드를 phoneNumber.toString() 라고 한다면, 우리는 010-1234-5678 와 같이 보여주기를 바랄 것이다.

System.out.println(phoneNumber + "에 연결할 수 없습니다.");

toString() 을 제대로 재정의했다면 메시지가 유의미하고 간결하게 작성될 것이다.유사하게 map 객체를 출력했을 때 {Arthur = 010-1234-5678} 과 같이 출력되는 것이 훨씬 전달력이 좋을 것이다.

실전에서 toString()은 그 객체가 가진 주요 정보를 모두를 반환하는게 좋다. 나중에 테스트를 할 때 실패하는 원인을 알 수 없는 경우가 발생할 수 있다.
Assertions failure: expected {abc,123), but was {abc,123}.

toString()을 구현할 때 반환값의 포맷을 문서화할지 정해야 한다. 전화번호처럼 규칙이 있는 클래스라면 포맷을 통해 전달력을 향상시킬 수 있다. 하지만 포맷을 명시하면 규칙에 얽매이게 되므로, 새로운 정보를 추가하거나 포맷을 개선할 수 있는 유연성이 사라진다.

포맷을 명시하든 아니든 의도는 명확히 밝혀야 한다.


답변

"만약 요구사항이 콘솔 출력에서 웹 페이지 출력으로 바뀐다면 toString의 반환값을 HTML로 나타내야 할까?" 라는 질문에 대해서도 한번 고민해보시면 좋겠습니다.
-리뷰어 에단

페어였던 파랑도 비슷한 피드백을 받았는데, html과 콘솔에 출력하는 기능을 동시에 구현한다고 생각해보면 toString을 이용하는건 부적절하다고 생각했다. 출력에 대한 책임은 도메인이 아니라 view가 가져야한다.

toString은 최대한 일반적인 정보만 반환해야하고, view 클래스를 이용해 출력형태에 대해 결정할 수 있도록 구현하는 것이 좋다.


추가 피드백

블랙잭 미션을 진행하면서 카드를 출력해야했는데, toString을 쓰는게 괜찮다고 생각을 했다. 하지만 스티치가 아래와 같은 피드백을 남겼다.

지금은 스티치의 말에 동의한다. Card를 출력할 때 "A스페이드" 와 같은 정보는 내가 보고싶은 정보의 형태인 것이고 toString을 사용하는 목적은 로깅과 가깝다고 생각해서 toString을 이용해 출력문에 이용하는 일은 지양하려고한다.

profile
세상을 아름답게!

0개의 댓글