Item 12. toString을 항상 재정의하라

심규환·2022년 1월 23일
0

Effective Java

목록 보기
12/29
post-thumbnail

Object의 기본 toString 메서드가 우리가 원하는 문자열을 반환하는 경우는 거의 없다. 그렇기 때문에 toString 일반 규약에 맞게 '간결하면서 사람이 읽기 쉬운 형태의 유익한 정보' 를 반환할 수 있도록 재정의를 하는게 좋다.
equalshashCode 규약만큼 엄청 중요하지는 않지만 toString을 잘 정의하면 사용하기 즐겁고 디버깅하기 쉬워진다.
분명 재정의한 객체는 어딘가 쓰여질 것이고 로깅으로 남길 것이다. 그때 toString의 재정의를 제대로 했다면 다음 코드만으로 문제를 진단하기에 충분한 메시지를 남길 수 있다.

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

또 제대로 정의한 toString 메서드는 컬렉션 객체를 사용할 때 유용하게 쓰인다. map 객체를 출력했을 때, {Jenny=PhoneNumber@abcde} 보다는 {Jenny=707-867-5309} 가 더 눈에 들어오는 것을 알 수 있다.

toString을 구현할 때, 반환값의 포맷을 문서화할지 정해야 한다. 만약 전화번호나 행렬 같은 값 클래스라면 문서화하기를 권한다. 포맷을 명시하면 그 객체는 표준적이고 명확하고, 사람이 읽을 수 있는 데이터 객체로 저장할 수 있다.
포맷을 명시하기로 했다면, 명시한 포맷에 맞는 문자열과 객체를 상호 전환할 수 있는 정적 팩터리생성자를 함께 제공하는 것이 좋다.

포맷을 명시하는 것에 단점도 있다. 한번 포맷을 명시해 놓으면 평생 그 포맷에 얽매이게 된다. 만약 포맷대로 프로그래밍 해두고 향후 포맷의 변화를 주면 이와 관련된 코드는 다 엉망이 되어버린다. 반대로 포맷을 명시하지 않으면 유연성을 가지게 된다.

포맷을 명시하던 안하던 의도는 명확히 밝혀야 한다. 포맷을 명시하려면 아주 정확하게 남겨야 한다. (주석)

그리고 포맷 명시 여부와 상관없이 toString이 반환한 값에 포함된 정보를 얻을 수 있는 API를 제공하자
그렇지 않으면 toString의 반환값의 일부가 필요한 프로그래머는 일일이 파싱하면서 그 값을 구해야 한다.

profile
장생농씬가?

0개의 댓글