Java를 다루어 본 분들이라면 잘 알다시피
toString은 객체를 println printf, 문자열 연결 연산자, assert, 디버거 등의 메소드가 호출했을 때
객체의 정보를 표현하기 위해 자동으로 호출되는 메소드 입니다.
재정의 하지 않는다면 객체를 문자열 관련 메소드로 호출했을 때
PhoneNumber@163b91 과 같이 ' 클래스 이름 + @ + 16진수로 표현된 해시코드 '로 구성된 문자열이 리턴됩니다.
이 toString은 객체를 손쉽게 표현하기 위해 재정의해주는 게 좋습니다.
toString의 일반규약에는 이런 구절도 있습니다.
"모든 하위 클래스는 이 메소드를 재정의함이 바람직하다."
이펙티브 자바에서는 이 toString을 재정의 할 때 신경써야할 점을 꼽고 있습니다.
1. toString 메소드는 객체 내의 중요 정보를 전부 담아 반환해야 한다.
객체를 표현하는데 중요 정보가 빠져선 안되겠죠? 만약 객체가 아주 크거나 문자열로 변환하기 까다로운 상태정보를 담고 있을 때에는
요약정보를 담아 리턴하도록 합시다.
2. toString이 반환하는 문자열의 형식을 명시하건 그렇지 않건, 의도는 문서에 남기자
형식을 명시하면 객체에 대한 체계적이고 깔끔한 정보를 모든 사용자가 공통적으로 확인 할 수 있지만,
자유롭게 수정하지 못한다는 점에서 단점도 있습니다. 때문에 명시하는 것이 무조건 좋고, 명시하지 않는 것이 무조건 나쁘다고 말할 수 없는데요.
toString이 반환하는 문자열의 형식이 고정이라고 생각해서 중요한 코드로 사용하는 프로그래머가 있을 수 있습니다.
toString의 반환값을 json 파싱에 사용한다던지, 지속적 데이터의 일부로 저장한다던지.. 이런 경우 toString의 정의가 바뀌게 된다면
코드 전부가 다 깨지는 끔찍한 경험을 할 수 있습니다.
때문에 문서에 의도를 써놓아야 합니다.
만약 문서에 '객체의 내용을 간단히 표현하는 문자열을 반환한다. 정해진 문자열은 없으며 바뀔 수 있다' 라고 명시되어있다면
프로그래머가 toString의 반환값을 프로그래밍의 중요정보로 사용하지는 않겠지요?
3. toString이 반환하는 문자열에 포함되는 정보들은 전부 프로그래밍을 통해서 가져올 수 있도록 하자.
toString에서 반환되는 값은 중요정보입니다. 만약 이 중요 정보를 얻을 수 있는 문이 toString이 유일하다면
프로그래머는 toString의 문자열을 파싱하려 할 것입니다. 성능도 느려지고 프로그래머가 할일도 많아지고 오류도 생기기 쉽습니다.
때문에 getter와 같은 접근자를 구현해서 toString 이외의 접근방법을 만들어 놓는 것이 좋습니다.
'프로그래밍 > Java' 카테고리의 다른 글
이펙티브 자바 규칙 12 - Comparable 구현을 고려하라 (0) | 2018.02.08 |
---|---|
디자인 패턴 - 전략 패턴(Strategy pattern) 예시 / 예제 (0) | 2018.02.06 |
이펙티브 자바 규칙 9 - equal 메소드를 재정의 할 때 hashCode()도 재정의 하자 (1) | 2018.02.05 |