-
[Effective Java] Item 12. toString을 항상 재정의하라Java/Effective Java 2020. 8. 24. 00:05반응형
Object의 기본 toString() 메서드는 우리가 작성한 클래스에 적합한 문자열을 반환하는 경우는 거의 없습니다. toString()의 일반 규약에 따르면 '간결하면서 사람이 읽기 쉬운 형태의 유익한 정보'를 반환해야 합니다. 또한 이 규약은 "모든 하위 클래스에서 이 메서드를 재정의하라"고 합니다.
toString()을 잘 구현한 클래스는 디버깅을 용이하게 해줍니다. toString()은 오류 메시지를 로깅할 때 자동으로 호출되어 유용한 정보들을 남길 수 있게됩니다. 만약 그렇지 않다면 쓸모없는 메시지만 로그에 남을 것입니다. map 객체를 출력했을 때 {Jenny=PhoneNumber@adbbd} 보다는 {Jenny=707-867-5309} 라는 메시지가 나오는 것이 훨씬 보기에 좋다고 생각될 것입니다.
실제로 toString()은 그 객체가 가진 주요 정보 모두를 반환하는 게 좋습니다. 하지만 객체가 거대하거나 객체의 상태가 문자열로 표현하기에 적합하지 않다면 요약 정보를 담아야 합니다. 이상적으로는 스스로를 완벽히 설명하는 문자열이어야 합니다.
toString() 포맷의 문서화
toString()을 구현할 때, 반환값의 포맷을 문서화할지 정해야 합니다. 전화번호나 행렬 같은 값 클래스라면 문서화 하는 것이 좋습니다. 포맷을 명시하면 그 객체는 표준적이고, 명확하고, 사람이 읽을 수 있게 됩니다. 따라서 그 값을 그대로 사용하거나 CSV 파일처럼 사람이 읽을 수 있는 데이터 객체로 저장할 수도 있습니다. 포맷을 명시하기로 했다면, 명시한 포맷에 맞는 문자열과 객체를 상호 전환할 수 있는 정적 팩토리나 생성자를 함께 제공해주면 좋습니다.
하지만 단점도 있습니다. 포맷을 한 번 명시하면 평생 그 포맷에 얽매이게 되어 향후 릴리스에서 정보를 더 넣거나 포맷을 개선할 수 있는 유연성을 잃게 될 것입니다.
포맷을 명시하든 아니든 작성자의 의도는 명확히 밝혀야 합니다.
포맷을 명시하기로 한 예
/** * 이 전화번호의 문자열 표현을 반환한다. * 이 문자열은 "XXX-YYY-ZZZZ" 형태의 12글자로 구성된다. * XXX는 지역 코드, YYY는 프리픽스, ZZZZ는 가입자 번호다. * 각각의 대문자는 10진수 숫자 하나를 나타낸다. * * 전화번호의 각 부분의 값이 너무 작아서 자릿수를 채울 수 없다면, * 앞에서부터 0으로 채워나간다. 예를 들어 가입자 번호가 123이라면 * 전화번호의 마지막 네 문자는 "0123"이다. */ @Override public String toString() { return String.format("%03d-%03d-%04d", areaCode, prefix, lineNum); }
포맷을 명시하지 않기로 한 예
/** * 이 약물에 관한 대락적인 설명을 반환한다. * 다음은 이 설명의 일반적인 형태이나, * 상세 형식은 정해지지 않았으며 향후 변경될 수 있다. * * "[약물 #9: 유형=사랑, 냄새=테레빈유, 겉모습=먹물]" */ @Override public String toString() { ... }
참고자료
반응형'Java > Effective Java' 카테고리의 다른 글
[Effective Java] Item 14. Comparable을 구현할지 고려하라 (0) 2020.08.26 [Effective Java] Item 13. clone 재정의는 주의해서 진행하라 (0) 2020.08.26 [Effective Java] Item 11. equals를 재정의하려거든 hashCode도 재정의하라 (0) 2020.08.23 [Effective Java] Item 10. equals는 일반 규약을 지켜 재정의하라 (0) 2020.08.21 [Effective Java] Item 9. try-finally 보다는 try-with-resources를 사용하라 (0) 2020.08.18