Item 12: toString을 항상 재정의하라

다람·2025년 3월 3일
0

Effective Java

목록 보기
12/13
post-thumbnail

1. toString을 재정의해야 하는 이유

  • 기본 Object.toString()클래스이름@16진수해시코드를 반환한다.
  • 의미 없는 정보만 제공하기 때문에 가독성이 떨어지게되어 사용자에게 유용한 정보를 포함하는 toString()을 직접 재정의해야 한다.
  • 예를 들어, PhoneNumber 클래스의 기본 toString()은 아래와 같다.
  PhoneNumber p = new PhoneNumber(82, 1234, 5678);
  System.out.println(p);
  // 출력: PhoneNumber@3124625a (알 수 없는 정보)
  • 만약 toString()을 재정의해서 사람이 읽기 쉽게 만들었다면?
  PhoneNumber p = new PhoneNumber(82, 1234, 5678);
  System.out.println(p);
  // 출력: +82-1234-5678
  • 출력만 깔끔해지는 것이 아니라 객체의 핵심 정보를 담고 있게 되기 때문에 로그, 디버깅, 오류 메시지에서도 더 유용한 정보가 포함될 수 있게 된다.

2. toString()을 재정의하는 방법

toString() 구현 예시

@Override
public String toString() {
    return String.format("+%02d-%04d-%04d", countryCode, prefix, lineNumber);
}
  • String.format()을 사용해 사람이 읽기 쉬운 형식으로 변환했다.
  • 예제 출력:
  PhoneNumber p = new PhoneNumber(82, 1234, 5678);
  System.out.println(p); // 출력: +82-1234-5678

3. toString() 작성 시 고려할 점

3-1. 모든 필드를 포함해야 하는가?

  • 필드를 전부 포함하면 너무 길어질 수 있다.
  • 객체의 주요 정보만 포함하는 것이 좋다.
  • 예를 들어, 비밀번호 같은 민감한 정보는 제외해야 한다.

3-2. toString()을 문서화해야 하는가?

  • 포맷을 명시화해도되고 안해도 되지만 의도는 명확히 밝혀야한다.
  • 만약 형식이 바뀔 가능성이 있다면 명시적으로 "형식이 바뀔 수 있음"을 문서화해야 한다.

예:

/**
 * 이 전화번호의 문자열 표현을 반환한다.
 * 이 문자열은 "+XX-YYYY-ZZZZ" 형태의 13글자로 구성된다.
 * 형식: +국가코드-중간번호-끝번호 (+82-1234-5678)
 */
@Override
public String toString() {
    return String.format("+%02d-%04d-%04d", countryCode, prefix, lineNumber);
}
  • 추가로 포맷 명시 여부와 상관없이 toString이 반환한 값에 포함된 정보를 얻어올 수 있는 API를 제공해야 한다.

참고: record 클래스

  • 불변 데이터 객체(VO, DTO) 생성을 위해 설계된 클래스이다.
  • 자바 16+에서는 record 클래스 를 사용하면 toString이 자동 생성된다.
  public record PhoneNumber(int countryCode, int areaCode, int number) {}
  • 불변 데이터 객체를 간결하게 표현하기 위해 사용되는 클래스이다.
  • 아래의 기능을 자동으로 생성해준다.
    • 불변 필드 (final 포함)
    • 생성자
    • Getter 메서드 (필드명과 동일)
    • toString() 자동 생성
    • equals() & hashCode() 자동 생성
  • record 단점 : 필드 변경 불가능, 상속 불가능 등이 존재한다.

4. 결론

  • toString()을 재정의하면 가독성, 디버깅, 로깅, 유지보수성이 향상된다.
  • 핵심 정보만 포함하되 형식이 고정될 경우 이를 문서화해야 한다.
profile
개발하는 다람쥐

0개의 댓글