ITEM 12
toString을 항상 재정의 하라.
우리가 작성한 클래스의 toString을 재정의 하지 않고 호출하였을 때.
적합한 값을 반환하지 않는다.
재정의 하지 않았을 경우 클래스_이름@16진수로 표시한 해시 코드 가 반환될 뿐이다.
규약
toString의 규약은 다음과 같다.
'간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야 한다.'
'모든 하위 클래스에서 toString를 재정의하라'
재정의 해야 하는 이유 , 장점
toString은 직접 호출하지 않아도 다른 어딘가에서 호출하여 사용된다.
ex) printf() , println(), assert 구문에 넘길 때 혹은 디버거가 객체를 출력할 때
다음과 같은 의미 없는 메시지보단
다음과 같이 의미 있는 toString을 반환하도록 하자.
따라서
toString을 재정의 함으로써 얻을 수 있는 장점은
- 디버깅이 쉽다.
- 사용하기 편하다.
toString()에서 반환해야 하는 정보는 객체가 가진 모든 정보를 모두 반환하는 것이 좋다.
(단 객체의 정보가 너무 많다면 요약정보를 반환하자)
toString() 문서화 포맷
-
반환할 값을 문서화하는 경우
1-1 전화번호나 행렬 같은 값 클래스인 경우 문서화
-> 문서화를 한다면 명시한 포맷에 맞는 문자열과 객체를 상호 전환할 있는 정적 팩토리나 생성자를 제공하자
[장점]
- 표준적이고 , 명확하고 , 사람이 읽을 수 있다.
- 값을 입출력에 그대로 사용 가능하다.
- CSV같이 데이터 객체로 저장이 가능하다.
[단점]
해당 포맷에 영구적이게 얽매이게 됨
-
반환 값을 문서화하지 않는 경우
[장점]
향후 정보를 더추가하거나 포맷을 개선할 수 있는 유연성을 얻게 됨
-
포맷 여부와 상관없이 toString이 반환하는 값에 포함된 정보를 얻어올 수 있는 API를 제공하자.
-> getter 만들어서 data를 가져올 수 있게 하자.
만약 API를 제공하지 않으면 toString()의 반환 값을 파싱 해야 한다.
핵심정리
모든 구체 클래스에서 Object의 toString을 재정의하자.
(단 이미 상위 클래스에서 재정의한 경우는 제외)
toString을 재정의 함으로써 객체에 관한 정보를 쉽게 얻을 수 있고 디버깅이 쉽다
'Book Review > effective-java' 카테고리의 다른 글
[ITEM14] Comparable 을 구현할지 고려하라 (0) | 2021.02.09 |
---|---|
[ITEM13] clone 재정의는 주의해서 진행하라 (0) | 2021.02.07 |
[ITEM11]equals를 재정의하려거든 hashCode도 재정의하라 (0) | 2021.02.05 |
[ITEM10] equals 는 일반 규약을 지켜 재정의하라. (0) | 2021.02.03 |
[ITEM9]try-finally 보다는 try-with-resources를 사용하라 (0) | 2021.02.02 |