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