toString의 기본 규약에 따라 ‘간결하면서 사람이 읽기 쉬운 형태의 유익한 정보’를 반환해야 하지만 우리가 작성한 클래스에서 적합한 문자열을 반환하는 경우는 거의 없음
→ PhoneNumber@adbbd 같은 클래스이름@해시코드 를 반환
toString을 잘 구현하면, 클래스를 사용하기가 즐겁고 클래스를 사용한 사람은 디버깅이 쉬워짐
toString이 사용되는 경우 (자동으로 호출됨)
객체를 println, printf, 문자열 연결 연산자(+), assert구문에 넘길 때
디버거가 객체를 출력할 때
우리가 만든 객체를 참조하는 컴포넌트가 오류 메시지를 로깅할 때
toString이 호출되어졌을 때에 기본적으로 반환되는 문자로는 유익한 정보를 얻기 힘드므로 재정의를 하여 우리가 해당 인스턴스가 어떠한 인스턴스인지 알 수 있는 유익한 정보를 반환해주도록 하는 것이 목적!
toString은 그 객체가 가지는 주요 정보를 모두 반환하는 것이 좋지만 객체가 크거나 문자열로 표현하기 적합하지 않다면 요약 정보를 담아야 함
주요 정보가 담기지 않으면 의미없는 실패 메세지를 띄우게 될 수 있음
Assertion failure : expected {abc, 123}, but was {abc, 123}
반환값의 포맷을 명시할 수 있지만 이 포맷을 후에 변경한다면 이를 사용하던 다른 코드에 영향을 줄 수 있음
→ 포맷 명시 시 포맷에 맞는 문자열과 객체를 상호 전환할 수 있는 정적 팩터리나 생성자도 같이 제공하면 좋음 (필요할까? ..)
포맷 명시 여부와 상관없이 toString이 반환한 값에 포함된 정보를 얻어올 수 있는 API를 제공하자
ex) PhoneNumber 클래스는 지역 코드, 프리픽스, 가입자 번호용 접근자 제공 → 이게 없으면 toString을 파싱해야하고 포맷이 변경되면 망가짐 ㅠㅠ
정적 유틸리티 클래스는 toString을 제공할 이유가 없음
일반적으로 입력 매개변수만을 사용하여 동작하며, 그 결과를 반환하므로 정적 유틸리티 클래스는 보통 상태를 가지지 않음
대부분의 열거 타입은 자바가 이미 완벽한 toString을 제공함
하위 클래스들이 공유해야 할 문자열 표현이 있는 추상 클래스는 toString을 재정의해줘야 함