Programming/Java

[Effective Java] item12 - toString을 항상 재정의하라.

VSFe 2021. 2. 12. 12:10
toString을 항상 재정의하라!

Object의 toString의 결과물은 다음과 같다.

Chicken@12a58z

단순히 클래스 이름@16진수로 표기한 해시코드 형식인데, 우리가 객체를 print 할 때 저런 결과물을 바라고 출력하는게 아니지 않을까?

규약에 따르면 toString은 간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야 한다.

사실 일반적으론 toString은 그 객체가 가진 모든 주요 정보를 반환하는게 최고다. 최소한 디버깅용으론 좋지 않을까? 문제는 객체의 사이즈가 크다면 담기 힘들 것이다.

대한민국 치킨집이 20000개가 넘는데, 해당 자료를 담은 객체가 있다고 가정하자. 모든 데이터를 출력하도록 toString을 재정의하면 대참사가 날 것은 뻔하다!

toString을 재정의 할 때는 반환값의 포맷을 문서화할지 정해야 한다. 객체를 API 처럼 이용하는 사람 입장에선 toString의 포맷을 잘 문서화 해두면 테스트 코드 작성시 많이 유리할 것이다.

추가로, 포맷 명시 여부와 상관없이 toString이 반환한 값에 포함된 정보를 얻어올 수 있는 API를 제공하는 것도 좋다. toString으로 정보를 얻었는데, 막상 활용하려고 했는데 getter가 없다? 그럼 결국 toString을 파싱하고 앉아있을 것이다... 거기에 추후 포맷이 변경되면 더 답이 없다.

정적 유틸리티 클래스는 toString을 제공할 필요가 없다. 또한 일반적인 추상 클래스도 toString을 잘 정의하지 않는데, 만약 상속받은 구체 클래스가 toString을 비슷하게 사용한다면 추상 클래스에서 정의해주는 것이 효율적일 것이다. (실제로 컬렉션 클래스들이 이렇게 한다!)