Effective Java - 모든 객체의 공통 메서드(3) : toString을 항상 재정의히라

목포·2022년 4월 17일
0

이펙티브 자바

목록 보기
13/13

toString을 항상 재정의히라

Object의 기본 toString 메서드는 잘 알다시피 우리가 작성한 클래스에 적합한 문자열을 반환하는 경우는 거의 없다. 클래스_이름@16진수로_표시한_해시코드로나 반환될 것이다.
toString 일반 규약에 따르면 간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야 한다.

toString() 메서드는 보통 println, printf, 문자열 연결 연산자(+), assert 구문을 넘길 때, 혹은 디버거가 객체를 출력할 때 자동으로 불린다.
작성한 객체를 참조하는 컴포넌트가 오류 메세지를 로깅할 때도 자동으로 호출할 수 있다. 만약 제대로 정의하지 않는다면 쓸모없는 메세지만 로그에 남을 것이다.

// 쓸모없는 형태의 예
System.out.pinrtln(phoneNumber + "에 연결할 수 없습니다."

좋은 toString은 (컬렉션처럼) 이 인스턴스를 포함하는 객체에서 유용하게 쓰인다. 때문에 그 객체가 가진 주요 정보 모두를 반환하는 것이 좋다.
그렇다면 객체가 거대하거나 객체의 상태가 문자열로 표현하기 적합하지 않다면 어떻게 해야할까? 이런 경우는 스스로를 완벽히 설명하는 문자열을 반환하도록 하자. 맨해튼 거주자 전화번호부(총 1564752개) 같은..

Assertion.failure : expected {abc, 123}, but was {abc, 123}.
// 잘못 작성한 경우 -> 예상값과 실패값이 같아져버림

포맷과 명시 여부와 상관없이 toString이 반환한 값에 포함된 정보를 얻어올 수 있는 API를 제공하자

예컨대 PhoneNumber 클래스는 지역 코드, 프리픽스, 가입자 번호용 접근자를 제공해야 한다. 그렇지 않으면 이 정보가 필요한 프로그래머는 toString의 반환 값을 파싱할 수 밖에 없다. 그러면 성능에도 영향이 가고 향후 포맷 변경 시 시스템이 망가지는 결과가 초래될 수도 있다.

정적 유틸리티 클래스는 toString을 제공할 필요 없다.

대부분의 열거 타입도 자바가 이미 완벽한 toString을 제공하고 있다. 하지만, 하위 클래스들이 공유해야 할 문자열 표현이 있는 추상 클래스라면 toString을 정의해주어야 한다. 예컨대 대다수의 컬렉션 구현체는 추상 컬렉션 클래스들의 toString을 상속해 쓴다.

profile
mokpo devlog

0개의 댓글