ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Item 12. toString을 항상 재정의하라
    백수의 개발/이펙티브 자바 2019. 8. 22. 17:38

     

    Object의 기본 toString 메서드는 우리가 작성한 클래스에 적합한 문자열을 반환하는 경우는 거의 없다.

    일반적으로 TestClass@a7cd(클래스이름@16진수로 표시된 해시코드)와 같이 보여줄 뿐이다.

     

    그래서 toString을 재정의하여 사람이 읽기 쉬운 형태의 유익한 정보를 반환할 필요가 있다.

     

    toString를 재정의하는 이유

    전화번호를 저장하는 PhoneNumber객체가 있을 때, 이를 출력한다고 가정해보자.

    PhoneNumber Jeny = new PhoneNumber(707, 867, 5309);
    System.out.println("Jeny PhoneNumber : " + Jeny);

    이와 같이 했을 때, 'Jeny PhoneNumber : PhoneNumber@abcd'와 'Jeny PhoneNumber : 707-867-5309' 이 둘 중 어떤 것이 더 유익한지 생각해보면, 당연히 후자일 것이다.

     

    이처럼 toString을 잘 구현한 클래스는 사용하기 편하고, 그 클래스에 대해 디버깅 하기 쉽다.

     

    toString 재정의 하기

    1. toString은 그 객체가 가진 주요 정보 모두를 반환하는 것이 좋다.
    2. toString을 구현할 때, 반환값의 포맷을 문서화할지 정해야 한다.
      • 포맷을 명시하면 그 객체는 표준적이고, 명확하고, 사람이 읽을 수 있게 된다.
      • 포맷을 명시하기로 했다면, 명시한 포맷에 맞는 문자열과 객체를 상호 전활할 수 있는 정적 팩터리나 생성자를 함께 제공해주면 좋다.
      • 단, 포맷을 한번 명시하면 평생 그 포맷에 얽매이게 된다.(클라이언트가 해당 포맷에 맞춰 파싱할 수 있기 때문)
      • 포맷을 명시하지 않는다면 다음 릴리즈에서 정보를 더 넣거나 포맷을 개선할 수 있는 유연성을 얻는다.
    3. 포맷을 명시하든 아니든 그 의도를 명확히 밝혀야 한다.
    4. toString이 반환한 값에 포함된 정보를 얻어올 수 있는 API를 제공하자.(이가 없다면 toString데이터를 파싱해야 한다.)

    toString 재정의가 불필요한 경우

    1. 정적 유틸리티 클래스(객체 상태를 가지는 클래스가 아니다)
    2. 대부분의 열거 타입(기본적으로 제공하는 toString으로 충분)
    3. 상위 클래스의 toString으로도 충분한 경우
    4. 애너테이션 사용(구글의 @Autovalue, Lombok의 @ToString)

    마무리

    모든 구체 클래스에서 Object의 toString을 재정의하자. 상위 클래스에서 이미 알맞게 재정의한 경우는 예외이다.

    toString을 잘 재정의한 클래스는 사용하기도 좋을 뿐더러 디버깅을 용이하게 해준다.

    toString은 해당 객체에 관한 명확하고 유용한 정보를 읽기 좋은 형태로 반환해야 한다.

    댓글

Designed by Tistory.