-
toString을 항상 재정의하라JAVA/Effective java 2021. 1. 19. 12:30
- Object의 기본 toString 메서드가 우리가 작성한 클래스에 적합한 문자열을 반환하는 경우는 거의 없다.
- 이 메서드는 단순히 클래스_이름@16진수로_표시한_해시코드 를 반환할 뿐이다.
- toString의 일반 규약에 따르면 '간결하면서 사람이 읽기 쉬운 형태의 유익한 정보'를 반환해야 한다.
- 이 같은 toString을 잘 구현한 클래스는 사용하기에 훨씬 즐겁고, 그 클래스를 사용한 시스템은 디버깅하기 쉽다.
- toString메서드는 객체를 println, printf, 문자열 연결, assert 구문에 넘길 때, 혹은 디버거가 객체를 출력할 때 자동으로 불리고 이는 직접 호출되지 않더라도 다른 어딘가에서 쓰일 거란 이야기이다.
- 또 작성한 객체를 참조하는 컴포넌트가 오류 메시지를 로깅할 때 자동으로 호출할 수 있다. toString을 제대로 재정의 하지 않는다면 쓸모없는 메시지만 로그에 남을 것이다.
- 다음에 println을 했을 때 클래스@해시코드 보다는 실제 유용한 메시지가 나오는 게 훨씬 반가울 것이다.
- 실전에서 toString은 객체가 가진 주요 정보 모두를 반환하는게 좋다.
- toString을 구현할 때면 반환 값의 포맷을 문서화 할지 정해야 한다.
- 포맷을 명시하기로 했다면 명시한 포맷에 맞는 문자열과 객체를 상호 전환할 수 있는 정적 팩터리나 생성자를 함께 제공해주면 좋다.
- 포맷을 한번 명시하면 평생 그 포맷에 얽매이게 된다는 단점 역시 있다.
- 하지만 포맷을 명시하든 아니든 의도는 명확히 밝혀야 한다.
- 포맷 명시 여부와 상관없이 toString이 반환한 값에 포함된 정보를 얻어올 수 있는 API를 제공하자.
- PhoneNumber 클래스는 지역 코드, 프리픽스, 가입자 번호용 접근자를 제공해야 한다.
- 그렇지 않으면 이 정보가 필요한 프로그래머는 toString의 반환값을 파싱 할 것이고 이는 성능이 나빠지고 필요치 않은 작업이다.
- 비록 자동 생성에 적합하지는 않더라도 객체의 값에 관해 아무것도 알려주지 않는 Object의 toString보다는 자동 생성된 toString이 훨씬 유용하다.
정리
- 모든 구체 클래스에서 Object의 toString을 재정의하자.
- toString을 재정의한 클래스는 사용하기 즐겁고 그 클래스를 사용한 시스템을 디버깅하기 쉽게 해준다.
- toString은 객체에 대한 명확하고 유용한 정보를 읽기 좋은 형태로 반환해야 한다.
참고 자료
'JAVA > Effective java' 카테고리의 다른 글
Comparable을 구현할지 고려하라 (0) 2021.01.21 clone 재정의는 주의해서 진행하라 (0) 2021.01.20 equals를 재정의하려거든 hashCode도 재정의하라 (0) 2021.01.14 equals는 일반 규약을 지켜 재정의 하라 (0) 2021.01.11 Try-Finally 대신 Try-with-Resource 사용하라 (0) 2021.01.04