📖본 포스팅은 'Effective java - 조슈아' 님의 책를 보고 작성되었습니다.
[toString]
toString의 역할 그 객체를 설명해주는 문자열을 리턴한다.
- Object의 기본 toString은 우리가 작성한 클래스에 적합한 문자열을 반환하는 경우가 거의 없다.
- '클래스_이름@16진수로_표시한_해시코드'를 반환할 뿐이다.
- toString 규약에 따라 '간결하면서 사람이 읽기 쉬운 형태의 유익한 정보'를 반환해야 한다.
- '모든 하위 클래스에서 이 메서드를 재정의해라'라는 toString 규약은 새겨들어야 할 조언이다.
[내가 쓰지 않아도 어디선가 사용될 toString]
내가 사용하지 않더라도 toString은 어디서든 사용될 수 있기 때문에 재정의 해주어야 한다.
- 컴포넌트 오류 메시지의 로깅
- 진단 메시지 등등..
즉 toString은 객체가 가진 주요 정보를 모두 반환하는 것이 중요하다.
[toString 구현 시 반환값이 포맷을 문서화할지 정해야 한다.]
[toString 구현 시 반환값이 포맷을 문서화 하는 경우(명시화 하는 경우)]
명시화 하는 경우라면 문자열과 객체를 상호 전환할 수 있는 정적 팩터리나 생성자를 함께 제공해주는 것이 좋다.
- 장점
- 객체가 표준적이다.
- 객체가 명확하다.
- 객체를 사람이 읽을 수 있다.
- 단점
- 포맷을 한번 명시하게 되면 평생 그 포맷에 얽매이게 된다.
- 예
- 포맷에 맞춰 파싱하고 새로운 객체를 만들고 영속 데이터로 저장하는 코드를 작성해야 한다.
- 향후 릴리즈에서 포맷 변경이라도 생기면 사용하던 코드들과 데이터들은 엉망이 된다.
[toString 구현 시 반환값이 포맷을 문서화 하지 않는 경우(명시화 하지 않는 경우)]
- 장점
- 향후 릴리스에서 정보를 더 넣거나 포맷을 개선할 수 있는 유연성을 얻게 된다.
[포맷을 명시하든 안 하든 의도를 명확하게 밝혀야 한다.]
- 포맷을 명시하려면 아주 정확하게 해야 한다.
//명시한 경우
@Override public String toString(){
return String.format("%03d-%03d-%04d", areaCode, prefix,lineNum);
}
//명시 하지 않은 경우
@Override public String toString(){
...
}
[포맷 여부 명시와 상관 없이 toString이 반환한 값에 포함된 정보를 얻어올 수 있는 API를 제공하자.]
- 접근자를 제공해야 한다.
- 접근자를 제공하지 않으면 그 포맷이 사실상 준-표준 API나 다름 없다.