Java/이펙티브 자바(Effective Java)

[이펙티브 자바(Effective Java)][모든 객체의 공통 메서드] - 12. toString을 항상 재정의하자

얄루몬 2022. 4. 12. 19:15

📖본 포스팅은 'Effective java - 조슈아' 님의 책를 보고 작성되었습니다.


[toString]

toString의 역할 그 객체를 설명해주는 문자열을 리턴한다.

  • Object의 기본 toString은 우리가 작성한 클래스에 적합한 문자열을 반환하는 경우가 거의 없다.
    • '클래스_이름@16진수로_표시한_해시코드'를 반환할 뿐이다.
  • toString 규약에 따라 '간결하면서 사람이 읽기 쉬운 형태의 유익한 정보'를 반환해야 한다.
  • '모든 하위 클래스에서 이 메서드를 재정의해라'라는 toString 규약은 새겨들어야 할 조언이다.

 

[내가 쓰지 않아도 어디선가 사용될 toString]

내가 사용하지 않더라도 toString은 어디서든 사용될 수 있기 때문에 재정의 해주어야 한다.

  • 컴포넌트 오류 메시지의 로깅
  • 진단 메시지 등등..

즉 toString은 객체가 가진 주요 정보를 모두 반환하는 것이 중요하다.

 

[toString 구현 시 반환값이 포맷을 문서화할지 정해야 한다.]

[toString 구현 시 반환값이 포맷을 문서화 하는 경우(명시화 하는 경우)]

명시화 하는 경우라면 문자열과 객체를 상호 전환할 수 있는 정적 팩터리나 생성자를 함께 제공해주는 것이 좋다.

  • 장점
    • 객체가 표준적이다.
    • 객체가 명확하다.
    • 객체를 사람이 읽을 수 있다.
  • 단점
    • 포맷을 한번 명시하게 되면 평생 그 포맷에 얽매이게 된다.
      • 포맷에 맞춰 파싱하고 새로운 객체를 만들고 영속 데이터로 저장하는 코드를 작성해야 한다.
      • 향후 릴리즈에서 포맷 변경이라도 생기면 사용하던 코드들과 데이터들은 엉망이 된다.

[toString 구현 시 반환값이 포맷을 문서화 하지 않는 경우(명시화 하지 않는 경우)]

  • 장점
    • 향후 릴리스에서 정보를 더 넣거나 포맷을 개선할 수 있는 유연성을 얻게 된다.

[포맷을 명시하든 안 하든 의도를 명확하게 밝혀야 한다.]

  • 포맷을 명시하려면 아주 정확하게 해야 한다.
//명시한 경우
@Override public String toString(){
    return String.format("%03d-%03d-%04d", areaCode, prefix,lineNum);
}
//명시 하지 않은 경우
@Override public String toString(){
    ...
}

[포맷 여부 명시와 상관 없이 toString이 반환한 값에 포함된 정보를 얻어올 수 있는 API를 제공하자.]

  • 접근자를 제공해야 한다.
  • 접근자를 제공하지 않으면 그 포맷이 사실상 준-표준 API나 다름 없다.