Study/Effective-Java

[item#12] toString을 항상 재정의하라

hongeeii 2023. 11. 29.
728x90
반응형

toString을 항상 재정의하라

toString의 일반 규약
간결하면서 사람이 읽기 쉬운 형태의 유익한 정보

모든 하위 클래스에서 이 메서드를 재정의하라



toString 사용 이유 - 잘 구현해 놓은 클래스는 디버깅이 쉬움

println, printf, 문자열 연결, assert 구문에 넘길 때, 디버거가 객체를 출력할 때 자동으로 불리기 때문

(대충 디버깅 할 때 해쉬코드만 남을때 보다 객체의 정보가 남으면 디버깅이 쉽다는 의미)


실전에서 toString은 그 객체가 가진 주요 정보 모두를 반환하는게 좋다.

  • toString을 구현할 때면 반환값의 포맥을 문서화할지 정해야함.

    전화번호 같은 값 클래스라면 문서화하길 권장.
  • 포맷을 명시하기로 했다면

    명시한 포맷에 맞는 문자열과 객체를 상호 전환할 수 있는 정적 팩터리나 생성자를 함께 제공하면 좋음.

    대신 한번 포맷을 명시하면 그 포맷에 평생 얽매여야함.

포맷을 명시하든 아니든 의도는 명확히 밝혀야함.

포맷 명시 예)

image.

포맷을 명시 하지 않은 예)

/**
이 약물에 관한 대략적인 설명을 반환한다.
다음은 이 설명의 일반적인 형태이나, 
상세 형식은 정해지지 않았으며 향후 변경될 수 있다.

"[약물 #9: 유형=사랑, 냄새=테레빈유, 겉모습=먹물]"
*/
@Override public String toString() {...}

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

그렇지 않으면 해당 정보가 필요한 프로그래머는 toString의 반환값을 파싱할 수 밖에 없다.

=> 성능도 나빠지고 필요하지 않은 작업임.

toString을 재정의할 필요없는 클래스

정적 유틸리티 클래스.

열거타입(자바가 제공함).

대다수의 컬렉션 구현체(추상 컬렉션 클래스들의 toString을 상속해서 씀).


Auto Value

구글의 Auto Value 프레임워크는 toString도 생성해 주지만 클래스의 의미까지는 파악하지 못함.

필요에 따라 재정의 하자.

728x90
반응형

추천 글