Effective Java | #12. toString을 항상 재정의하라

보람·2022년 5월 11일
0

Effective-Java

목록 보기
13/25
PhoneNumber jenny = new PhoneNumber(707, 867, 5309);
System.out.println("제니의 번호: " + jenny);
  • toString 재정의전 : 제니의 번호: effectivejava.chapter3.item12.PhoneNumber@adbbd
  • toString 재정의후 : 제니의 번호: 707-867-5309

확실히 후자가 보기 좋다.

/**
 * 이 전화번호의 문자열 표현을 반환한다.
 * 이 문자열은 "XXX-YYY-ZZZZ" 형태의 12글자로 구성된다.
 * XXX는 지역 코드, YYY는 프리픽스, ZZZZ는 가입자 번호다.
 * 각각의 대문자는 10진수 숫자 하나를 나타낸다.
 *
 * 전화번호의 각 부분의 값이 너무 작아서 자릿수를 채울 수 없다면,
 * 앞에서부터 0으로 채워나간다. 예컨대 가입자 번호가 123이라면
 * 전화번호의 마지막 네 문자는 "0123"이 된다.
 */
@Override public String toString() {
    return String.format("%03d-%03d-%04d",
            areaCode, prefix, lineNum);
}
  • toString을 잘 구현한 클래스는 사용하기에 훨씬 즐겁고, 그 클래스를 사용한 시스템을 디버깅하기 쉽다.
  • 실전에서 toString은 그 객체가 가진 주요 정보 모두를 반환하는게 좋다.
  • 반환값의 포맷을 문서화할지 정해야 하며
    • 포맷을 명시하든 아니든 의도는 명확히 밝혀야 한다.
  • toString이 반환한 값에 포함된 정보를 얻어올 수 있는 API를 제공하자.
    • 위 PhoneNumber 클래스에서는 지역코드, 프리픽스, 가입자 번호용 세가지에 대한 접근자를 제공해야 한다.
    • 접근자를 제공하지 않는다면 toString으로 출력된 문자열을 파싱해야하는데 성능면에서 좋지 X
  • equals(item-10), hashCode(item-11)에서도 등장한 AutoValue를 사용하면 toString 또한 재정의 가능하다.

핵심 정리

모든 구체 클래스에서 Object의 toString을 재정의하자. 상위 클래스에서 이미 알맞게 재정의한 경우는 예외다. toString을 재정의한 클래스는 사용하기도 즐겁고 그 클래스를 사용한 시스템을 디버깅하기 쉽게 해준다. toString은 해당 객체에 관한 명확하고 유용한 정보를 읽기 좋은 형태로 반환해야 한다.

kotlin-in-action 책에서 나오는 data class도 equals, hashCode, toString을 사용하기 편한 형식으로 재정의한다고 나온다. AutoValue가 코틀린의 data class와 같은 맥락인 듯 싶다!

profile
백엔드 개발자

0개의 댓글