본문 바로가기

study/effective java

[item12] toString은 항상 오버라이딩하라

toString() 메소드

최상위 객체인 Object 클래스에 작성되어 있으며 객체를 String으로 표현하는 책임을 가진다.

왜 항상 재정의를 해야할까?

Object 클래스에 toString은 다음과 같이 작성되어 있다.

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

클래스명@해시코드 로 String 객체를 만들어 반환해준다. 이 방법의 문제점은 String으로 보여주는 내용으로 프로그래머가 얻을 수 있는 정보가 거의 없다. 클래스명, 해시코드를 알면 실제 객체를 알아보기 위한 시간이 더 소모된다. 심지어 해시 코드는 프로그램이 실행될 때마다 달라질 수 있으므로 디버깅이 더 어려워진다.

toString은 객체의 정보를 로깅할 때 유용하게 사용한다. 만약에 로그에 클래스명@해시코드 만 나온다면 객체의 상태를 알 수 없다. 때문에 toString은 항상 재정의가 필요하다.

단 상위 클래스에서 정의한 내용으로도 표현이 가능하다변 굳이 오버라이딩 할 필요는 없다.

의미를 나타내는 toString 오버라이딩

  1. toString은 가지고 있는 모든 주요 정보를 반환하는 것이 좋다
    • Person객체의 name, age, address 요소들을 모두 보여주는 것 처럼 toString으로 표현되는 요소들을 모두 보여줘야 한다.
    • 그러나 보여줘야하는 데이터의 양이 많으면 요약 정보를 보여줘야 한다.
  2. 포맷을 명시하던가 의도를 밝혀야 한다
    • 데이터양이 많거나, 혹은 JSON이 아닌 특정한 포맷, 특이한 데이터를 표현할 때 이 데이터가 어떤 의미인지를 명시해야한다.
  3. toString으로 반환되는 정보는 읽어올 수 있는 API를 제공해야 한다
    • toString으로 반환되는 정보는 getter메소드등 반환값을 제공할 수 있는 기능을 제공해줘야 한다.
    • API를 지원하지 않을 경우 toString를 파싱해야 하므로 성능 저하의 문제가 발생할 수 있다.

Reference