Object의 기본 toString 메서드가 우리가 작성한 클래스에 적합한 문자열을 반환하는 경우는 거의 없다.
이 메서드는 PhoneNumber@adbbd처럼 단순히 클래스이름@16진수로_표현한_해시코드를 반환할 뿐이다.
toString의 일반 규약에 따르면, 간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야 한다.
toString의 규악은 모든 하위클래스에서 이 메서드를 재정의하라라고 하고 있다.

  • toString을 잘 구현한 클래스는 사용하기 편하고, 그 클래스에 대해 디버깅 하기 쉽다.
    • map객체를 출력하는 경우 {Jenny=PhoneNumber@addbb} 보다는 {Jenney=707-867-5308}이라는 메세지가 가독성이 좋다.
  • 실전에서는 toString메서드를 재작성 할 때, 그 객체가 가진 주요 정보 모두를 반환하는게 좋다.
  • toString을 구현할 때면 반환값의 포맷을 문서화 할 지 정해야 한다.
    • 포맷을 명시하면, 그 객체는 표준적이고, 명확하고, 사람이 읽을 수 있게 된다.
    • 포맷을 명시하기로 했으면, 명시한 포맷에 맞는 문자열과 객체를 상호전환 할 수 있는 정적 팩터리나 생성자를 함께 제공하면 좋다.
    • 단, 포맷을 한번 명시하면, 평생 그 포맷에 얽매이게 된다.
    • 포맷을 명시하지 않는다면 다음 릴리즈에 포맷을 변경할 수 있는 유연성을 더 가져갈 수 있다.
  • 포맷을 명시하든 아니든, 개발자의 의도는 명확히 밝혀야 한다.
  • toString이 반환한 값에 대해 포함된 정보를 얻어올 수 있는 API를 제공하자
    • toString에 있는 정보에 대한 접근자를 제공하지 않는다면, 클라이언트에서 toString의 반환값을 파싱하여 사용할 지도 모른다.
@ToString // toString() 메서드를 재정의 하지 않아도 자동으로 바꿔준다. 
public class TestApplication {

    public static void main(String[] args) {
        TestApplication str = new TestApplication();
        System.out.println(str); 
    }
    int num = 1;
    int a = 2;
    int b = 3;

}

// 결과 : TestApplication(num=1, a=2, b=3)

public class TestApplication {

    public static void main(String[] args) {
        TestApplication str = new TestApplication();
        System.out.println(str); 
    }
    int num = 1;
    int a = 2;
    int b = 3;
    
    @Override
    public String toString() {
        return String.format("%3d - %4d -%4d ", num, a, b);
    }
}

// 결과 : 1 - 2 - 3

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

댓글남기기