less than 1 minute read

item12 toString을 항상 재정의하라

  • toString()은 재정의하지 않을 경우, class_name@hex_hashcode를 반환한다. (가독성 낮음)
  • 일반 규약에 따르면, 간결하면서 읽기 쉬운 형태의 유익한 정보를 반환해야 한다. 이를 위해 클래스에 따라 재정의할 필요가 있다.
  • 이렇게 재정의된 메소드를 통해 콘솔로 객체 확인, 디버깅, 로깅 등을 한다면 훨씬 가독성이 높아질 것이다.

재정의 목표

  • 앞선 설명에 따라 재정의하고자 할때, toString을 재정의할때는 객체가 가진 주요 정보를 모두 반환하는 것이 좋다. 만일 객체의 정보가 큰 경우, 요약 정보를 반환하는 것이 좋다.
  • 반환값의 포맷의 문서화 여부를 정해야 한다.
    • 꼭 문서화를 하지 않더라도, 메서드를 통해 얻고자 하는 정보의 의도를 작성해 두는 것이 좋다.
  • 포맷 명시 여부와 상관없이 toString()이 반환한 값에 포함된 정보를 얻어올 수 있는 API를 제공하자. 
    • 접근자를 제공하지 않으면, toString의 반환값을 파싱해야 한다. 성능을 떨어뜨림과 동시에 불필요한 작업이고, 향후 포맷을 바꾸면 시스템이 망가질 수 있다.
/** 
 * 전화번호의 문자열 표현을 반환한다.
 * 이 문자열은 XXX-YYYY-ZZZZ 형태의 11글자로 구성
 * XXX는 지역코드, YYYY는 접두사, ZZZZ는 가입자 번호
 * ... 이하 toString에 대한 문서화 혹은 메서드의 의도 작성
*/
@Override
public String toString() {
    return String.format("%03d-%04d-%04d", areaCode, prefix, lineNum);
}

재정의 하지 않아도 되는 경우

  • 정적 유틸리티 클래스
    • 상태가 없고, 객체를 생성하거나 인스턴스화하지 않으므로 의미있는 문자열 표현이 없다. 따라서 toString() 메서드를 재정의할 필요가 없다.
  • Enum 타입
    • 이미 toString()이 적확하게 구현되어 있다.

Leave a comment