toString() 메소드
최상위 객체인 Object
클래스에 작성되어 있으며 객체를 String으로 표현하는 책임을 가진다.
왜 항상 재정의를 해야할까?
Object
클래스에 toString은 다음과 같이 작성되어 있다.
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
클래스명@해시코드 로 String 객체를 만들어 반환해준다. 이 방법의 문제점은 String으로 보여주는 내용으로 프로그래머가 얻을 수 있는 정보가 거의 없다. 클래스명, 해시코드를 알면 실제 객체를 알아보기 위한 시간이 더 소모된다. 심지어 해시 코드는 프로그램이 실행될 때마다 달라질 수 있으므로 디버깅이 더 어려워진다.
toString은 객체의 정보를 로깅할 때 유용하게 사용한다. 만약에 로그에 클래스명@해시코드 만 나온다면 객체의 상태를 알 수 없다. 때문에 toString은 항상 재정의가 필요하다.
단 상위 클래스에서 정의한 내용으로도 표현이 가능하다변 굳이 오버라이딩 할 필요는 없다.
의미를 나타내는 toString 오버라이딩
- toString은 가지고 있는 모든 주요 정보를 반환하는 것이 좋다
Person
객체의 name, age, address 요소들을 모두 보여주는 것 처럼 toString으로 표현되는 요소들을 모두 보여줘야 한다.- 그러나 보여줘야하는 데이터의 양이 많으면 요약 정보를 보여줘야 한다.
- 포맷을 명시하던가 의도를 밝혀야 한다
- 데이터양이 많거나, 혹은 JSON이 아닌 특정한 포맷, 특이한 데이터를 표현할 때 이 데이터가 어떤 의미인지를 명시해야한다.
- toString으로 반환되는 정보는 읽어올 수 있는 API를 제공해야 한다
- toString으로 반환되는 정보는 getter메소드등 반환값을 제공할 수 있는 기능을 제공해줘야 한다.
- API를 지원하지 않을 경우 toString를 파싱해야 하므로 성능 저하의 문제가 발생할 수 있다.
Reference
'study > effective java' 카테고리의 다른 글
[item14] Comparable를 구현할지 고려하라 (0) | 2023.05.02 |
---|---|
[item13] clone 오버라이딩은 주의해서 진행해라 (0) | 2023.05.02 |
[item11] equals와 hashCode는 같이 정의해라 (0) | 2023.05.01 |
[item10] equals는 일반 규약을 지켜 재정의해라 (0) | 2023.05.01 |
[item9] try-finally보다 try-with-resources를 사용해라 (0) | 2023.04.25 |