"만약 요구사항이 콘솔 출력에서 웹 페이지 출력으로 바뀐다면 toString의 반환값을 HTML로 나타내야 할까?" 라는 질문에 대해서도 한번 고민해보시면 좋겠습니다.
-리뷰어 에단
자동차 미션을 구현하던 중 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을 이용해 출력문에 이용하는 일은 지양하려고한다.