Item 10 : toString은 항상 재정의하라
(Always override toString)
toString 일반 규약[JavaSE6]
"사람이 읽기 쉽도록 간략하지만 유용한 정보를 제공해야 한다."
toString을 잘 만들어 놓으면 클래스를 좀 더 쾌적하게 사용할 수 있다.
디버깅, 유지보수, 간단한 체크할 때 유용
기본 Object의 toString()은 className@해시코드
이기때문에 의미없다.
- {Jenny=PhoeNumber@163b91}
- {Jenny=(707) 867-5309}
어떤 toString이 더 유용하겠는가?
가능하다면 toString 메서드는 객체 내의 중요 정보를 전부 담아 반환해야 한다.
객체가 아주 크거나 문자열로 변환하기 까다로운 상태정보를 담은경우 요약정보를 반환하도록 한다.
척 보면 그 의미를 바로 알 수 있도록..
toString이 반환하는 문자열의 형식을 문서에 명시하는게 좋을까?
=> 안하는게 좋다.
명시한다고 했을 때,
만약 그 클래스가 널리 쓰인다면 그 형식을 바꾸지 못한다.
그 문자열을 파싱해서 객체만드는사람, 데이터저장하는사람 등이 있을 것인데,
형식을 바꾼다면 위에 작업들은 깨질 것이므로
명시하지 않으면 toString 문자열을 자유롭게 바꾸고 개선할 수 있다.
이게 자유롭게 바꾼다고해서 toString 가져다쓰는 프로그램들의 작업이 깨지지 않는다는 말이 아니라 내책임이 아니야!
라는 의미인것 같다.
"문자열은 언제든지 바뀔수 있어. 만약 바뀌면 너네 알아서 수습해!" 이런의미?
toString이 반환하는 문자열의 형식을 명시하건 그렇지 않건 간에, 어떤 의도인지는 문서에 분명하게 남겨야 한다.
문자열의 형식을 명시할 경우
/** * 전화번호를 문자열로 변환해서 반환한다. * 문자열은 "(XXX) YYY-ZZZ" 형식으로, 14개 문자로 구성된다. * XXX는 지역번호, YYY는 국번, ZZZ는 회선 번호다. 각 문자(X, Y, Z)는 * 하나의 숫자다. * * 전화번호의 각 필드가 주어진 자리를 다 채우지 못할 경우 필드 앞에는 * 0이 붙는다. 예를 들어, 회선 번호가 123일 경우, 위의 문자열 마지막 필드에 * 채워지는 문자열은 "0123"이 된다. * * 지역번호를 닫는 괄호와 국번 사이에는 공백이 온다는 것에 주의하자. */ @Override public String toString() { return String.format("(%03d) %03d-%04d", areaCode, prefix, lineNumber); }
문자열의 형식을 명시하지 않을 경우
/** * 물약(potion)의 내용을 간단히 설명하는 문자열을 반환한다. * 정해진 문자열 형식은 없으며, 바뀔 수 있다. * 하지만 대체로 아래와 같은 문자열이 반환된다. * * "[Potion #9: type=love, smell=turpentine, look=india ink]" */ @Override public String toString() { ... }
이런 toString 문자열의 형식에 의존적인 코드나 persistent 데이터를 만든 프로그래머는,
그 형식이 바뀌어서 문제가 생기면 스스로 책임져야 한다.
toString이 반환하는 문자열에 포함되는 정보들은 전부 프로그래밍을 통해서 가져올 수 있도록 하라.
예를들어 PhoneNumber클래스는 지역번호, 국번, 회선번호 등의 정보를 가져올 수 있는 접근자메서드를 포함해야 한다.
접근자 메서드가 없다면 toString 문자열을 파싱해야 할텐데,
이 경우 성능이 느려지고, 문자열 형식이 바뀌면 치명적인 오류가 생긴다.
toString 문자열 형식이 바뀔 수 있음에도 불구하고,
toString 메서드가 실질적인 API구실을 하게 되는 것이다.
'Old Posts > Effecttive Java' 카테고리의 다른 글
Item13. 클래스와 멤버의 접근 권한을 최소화하라 <이펙티브자바> (0) | 2018.03.17 |
---|---|
Item12. Comparable 구현을 고려하라 <이펙티브자바> (0) | 2018.03.13 |
Item09. equals를 재정의할 때는 반드시 hashCode도 재정의하라 (0) | 2018.03.07 |
Item08. equals를 재정의할 때는 일반 규약을 따르라 (0) | 2018.02.28 |
Item06. 유효기간이 지난 객체 참조는 폐기하라 (0) | 2018.02.25 |