-
item 12 toString을 항상 재정의하라책/이펙티브 자바 2022. 2. 24. 21:05
ITEM 12 toString을 항상 재정의하라
Object의 기본 toString 메서드는 우리가 작성한 클래스에 적합한 문자열을 반환하는 경우는 거의 없다
- 단순히 클래스_이름@16진수로_표시한_해시코드를 반환한다
- toString의 일반 규약
- 간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야 한다
- 모든 하위 클래스에서 이 메서드를 재정의하라
toString 메서드를 잘 구현한 클래스는 디버깅이 용이하다
toString 메서드가 호출되는 경우
- 객체를 println, printf, 문자열 연결 연산자(+), assert 구문에 넘길때
- 디버거가 객체를 출력할때
- 즉 직접 호출하지 않아도 어딘가는 쓰인다
toString 메서드는 해당 객체의 주요 정보를 모두 반환하는게 좋다
map 객체를 출력한다고 가정하자
1. {jenny=PhoneNumber@adbbd} 2. {jenny=707-867-539}
1번 보다는 2번이 훨씬 보기가 좋다
toString 메서드를 구현할때 반환값의 포맷을 문서화 할지 정해야 한다
- 이는 중요한 선택이며 전화번호나 행렬 같은 값 클래스는 문서화를 권장한다
- 포맷이 생긴다면 표준화가 가능하고 명확하며 읽기가 편하다
- 포맷을 잘 이용하여 데이터를 그대로 사용할수도 있다
- 포맷을 사용하기로 했다면 포맷에 맞는 문자열과 객체가 상호 전환이 가능하도록 도와주자
- 정적 팩터리나 생성자를 함께 제공
포맷 명시의 단점
- 포맷을 명시한 클래스가 자주 쓰이게 된다면 해당 포맷에 얽매이게 된다
- 해당 포맷을 사용하여 개발이 진행되기 때문에 바꾸기가 쉽지않음
- 포맷을 명시하지 않는다면 포맷을 개선하기가 상대적으로 쉬워진다
포맷을 명시하든 아니든 개발자의 의도는 명확하게 해야한다
포맷을 정확하게 명시한 경우
/** * 이 전화번호의 문자열 표현을 반환한다 * 이 문자열은 "XXX-YYY-ZZZZ" 형태의 12글자로 구성된다 * XXX는 지역코드, YYY는 프리픽스, ZZZZ는 가입자 번호다 * 각각의 대문자는 10진수 숫자 하나를 나타낸다 * * 전화번호의 각 부분의 값이 너무 작아서 자릿수를 채울 수 없다면 * 앞에서부터 0으로 채워 나간다. 예컨대 가입자 번호가 123이라면 * 전화번호의 마지막 네 문자는 "0123"이 된다 **/ @Overrid public String toString() { return String.format("%03d-%03d-%04d", areaCode, prefix, lineNum); }
포맷을 명시하지 않은 경우
/** * 이 전화번호의 대략적인 설명을 반환한다 * 다음은 이 전화번호의 일반적인 형태이지만 추후에 변경될수있다 * xxx-yyy-zzzz * 지역코드 - 프리픽스 - 가입자번호 **/ @Overrid public String toString() { ...... }
위와 같은 설명에 맞게 코딩을 한다면 추후 변경을 하더라도 탓하기가 힘들다
포맷 명시 여부와 관계없이 반환값에 포함된 정보를 얻어올 수 있는 API를 제공하자
- ex) PhoneNumber 클래스는 지역 코드, 프리픽스, 가입자 번호용 접근자를 제공해야 한다
- 제공하지 않는다면 이 정보가 필요한 사람은 toString의 반환값을 파싱할 수 밖에 없다
- 성능 저하가 생기며 불필요한 작업이다
- 추후 포맷 변경이 일어난다면 오류 발생 가능성이 높아진다
- 접근자를 제공하지 않으면 (변경될 수 있다고 문서화 해도) 해당 포맷이 사실상 준 표준 API 나 마찬가지다
- 정적 유틸리티 클래스는 toString을 제공할 이유가 없다
- 대부분의 열거타입도 완변한 toString을 제공하기 때문에 따로 정의할 필요가 없다
- 하위 클래스가 공유해야할 문자열 포현이 있는 추상 클래스라면 toString 메서드를 재정의 해줘야 한다
- 대다수의 컬렉션 구현체는 추상 컬렉션 클래스들의 toString 메서드를 상속해서 쓴다
모든 구체 클래스에서 Object의 toString 메서드를 재정의하자
상위 클래스에서 이미 잘 정의해 놨으면 안해도됨
toString 메서드를 재정의 하면 사용하기도 즐겁고 디버깅도 쉬워짐
toString 메서드는 해당 객체에 대해 정확한 유용한 정보를 보기 좋은 형태로 반환해야함
'책 > 이펙티브 자바' 카테고리의 다른 글
item 14 Comparable을 구현할지 고려하라 (0) 2022.02.28 item 13 clone 재정의는 주의하여 진행하라 (0) 2022.02.25 item 11 equals를 재정의하려거든 hashCode도 재정의하라 (0) 2022.02.23 item 10 equals는 일반 규약을 지켜 재정의하라 (0) 2022.02.22 item 9 try-finally보다는 try-with-resources를 사용하라 (0) 2022.02.21