본문 바로가기

JAVA/Effective Java

item 12) toString을 항상 재정의하라

728x90

1. toString 함수란?

 

   toString 함수는 프로그래머가 객체를 잘 읽을수 있도록 대표적인 특성을 보여주는 함수이다. 하지만 Object의 toString 함수는 전혀 그런 특징을 보여주지 못하고 있다. Object의 toString 함수는 내부적으로 클래스 이름과 hashCode를 합한 문자열을 리턴하게 되어있는데 이것만으로는 객체의 특성을 파악하는데 부족하다. 프로그래머는 자신이 정의한 객체의 toString 함수를 재정의함으로써 프로그램 디버깅을 하기 더 쉽기 떄문에 이것을 재정의하는 것을 추천한다.

public String toString()
Returns a string representation of the object. In general, the toString method returns a string that "textually represents" this object. The result should be a concise but informative representation that is easy for a person to read. It is recommended that all subclasses override this method.
The toString method for class Object returns a string consisting of the name of the class of which the object is an instance, the at-sign character `@', and the unsigned hexadecimal representation of the hash code of the object. In other words, this method returns a string equal to the value of:

 getClass().getName() + '@' + Integer.toHexString(hashCode())
 
Returns:
a string representation of the object.

 

2. 좋은 toString 함수를 짜는 법

 

  • 객체가 가진 모든 상태정보를 반환한다. 그러나, 문자열로 표현하기 어려운 경우 제외한다. (Thread, Lock 등등)
  • 반환값의 포맷을 문서화할지 정한다.  
  • toString 반환값에 포함한 정보를 얻을수 있는 API(getter)를 제공한다. 
  •  

3. toString 이 필요없는 경우

 

  • 정적 유틸 클래스 (상태정보가 없으므로)
  • enum 타입 (이미 완벽하게 구현되어있다.)
  • 대다수의 컬렉션 구현체 (AbstractMap 등의 추상클래스에서 재정의되어있다.)

4. 프레임워크로 만들어진 toString 예시

 

/* toString() auto generated by AutoValue*/

@Override
    public String toString() {
        return "Foo [text=" + text + ", number=" + number + "]";
    }
    
    
    
    
/*toString() auto generated by AutoValue
@ToString(exclude={"제외할 값"})로 제외할수도있다.
*/

@ToString{exclude="AA"}
class Foo{
	int AA;
    int BB;
    int CC;
}