JAVA/Effective Java

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

Garonguri 2022. 4. 19. 15:28
728x90

toString

 

[규약]

모든 하위 클래스에서 이 메서드를 재정의한다.

간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환한다.

 

[기본 메서드]

- 기본적으로 class_Name@16진수로_표시한_hashCode 반환. (간결하고 읽기 쉽지만, 상대적으로 덜 유익하다.)

- 객체를 println, printf, 문자열 연결 연산자(+), assert 구문에 넘길 때, 혹은 디버거가 객체를 출력할 때 자동으로 불린다.

- 즉, 직접 호출하지 않더라도 호출될 수 있다.

public class item12 {
    public static void main(String[] args) {
        Info info1 = new Info("Gayoung", 26);
        System.out.println(info1);
        // toString 재정의 전 : item12$Info@36baf30c
    }

    public static class Info{
        String name; int age;
        public Info(String name, int age) {
            this.name = name; this.age = age;
        }
    }
}

-> 실전에서 toString은 객체가 가진 주요 정보를 모두 반환하는 것이 좋다.

 

[toString 반환 값의 문서화 여부 ]

  • 포맷 명시 여부와 상관 없이 toString이 반환값에 포함된 정보를 얻어올 수 있는 API는 제공해야한다.
  • 포맷 명시 여부와 상관 없이 의도는 명확히 밝혀야 한다.

반환값 포맷을 명시하는 경우

- 값 클래스의 경우 문서화하기를 권한다.

- 하위 클래스들이 공유해야 할 문자열 표현이 있는 추상 클래스

- 반환값 포맷을 명시한다면, 해당 객체는 표준적이고, 명확하고, 가독성이 좋아진다. -> 입출력에 사용하거나 데이터 객체로 저장 가능.

- 명시한 포맷의 문자열, 객체를 상호전환할 수 있는 정적 팩터리와 생성자를 함께 제공하면 좋음.

 

반환값 포맷을 명시했을 때의 단점

- 평생 포맷에 얽매이게 된다.

- 향후 일리스에서 포맷을 바꿀 시 이를 사용하는 코드, 데이터를 모두 변경해야 하므로 포맷을 개선할 수 있는 유연성이 떨어짐.

 

반환값 포맷을 명시하지 않아도 되는 경우

- 정적 유틸리티 클래스

- 대부분의 열거 타입

 


[핵심 정리]

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

 

 

728x90