티스토리 뷰

728x90
반응형

toString을 항상 재정의하라


  • Object 클래스에서 기본적으로 제공하는 toString 메서드는 우리가 보기에 적합하지 않습니다. 
    클래스명@16진수로_표시된_해시코드 반환
  • toString의 일반 규약에 따라 간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야 합니다.
  • 또한 toString의 규약은 모든 하위 클래스에서 이 메서드를 재정의하라 라고 하고 있습니다.

 

toString을 잘 구현하는 클래스


  • 사용자 입장에서 객체 정보를 한눈에 볼 수 있습니다.
  • 해당 클래스를 디버깅하기 좋습니다. 디버깅시 클래스명@1238abcf24 보다는 적절한 값이 출력되는게 알아보기 쉽습니다.

 

toString 포맷 문서화


  • toString을 재정의할 때 반환값의 포맷을 문서화 할지 정해야 합니다.(선택)
  • 포맷을 명시하면 얽메이게 된다는 단점을 가지고 있습니다. 프로그래머들이 해당 포맷에 맞춰 파싱하고, 새로운 객체를 만들고, 영속 데이터로 저장하는 코드를 작성하게 될 수도 있습니다.
  • 포맷 유뮤와 상관없이 의도가 명확히 드러나야 합니다.

💡포맷을 명시하기로한 경우 예시

/**
 * 전화번호의 문자열 표현을 반환한다.
 * 이 문자열은 "XXX-YYYY-ZZZZ" 형태의 12글자다.
 * XXX는 통신사 식별번호, YYYY는 일련번호 앞자리, ZZZZ는 일련번호 뒷자리이다.
 * 각각의 대문자는 10진수 숫자 하나를 나타낸다. 
 * 
 * 전화번호의 각 부분이 값이 너무 작아 자릿수를 채울 수 없는 경우,
 * 앞에서부터 0으로 채워나간다.(ex: 123 -> 0123)
 * @return
 */
@Override
public String toString() {
    return String.format("%03d-%03d-%04d", prefix, middle, suffix);
}

 

💡포맷을 명시하지 않기로한 경우 예시

/**
 * 전화번호 정보를 반환한다.
 * 기본적으로 다음과 같은 정보를 포함한다.
 * "[통신사 식별번호: 010, 일련번호 앞자리: 1234, 일련번호 뒷자리: 5678]"
 * @return
 */
@Override
public String toString() {...}

 

toString 재정의가 필요없는 경우


  • 정적 유틸리티 클래스
  • 열거 타입(이미 자바에서 충분한 toString을 제공합니다.)
  • 하지만 하위 클래스들이 공유해야 할 문자열 표현이 있는 추상 클래스라면 toString을 재정의해줘야 합니다.

 

 

 

728x90
반응형