728x90
Object.toString() 메서드 : [클래스이름]@[16진수로 표시한 해시코드] 포맷을 갖는다.
예시 ) PhnoneNumber@adbbd
1. toString() 규약
1) 간결하면서 사람이 읽기 쉬운 형태의 유익한 정보
2) 모든 하위 클래스에서 이 메서드를 재정의하라
=> 장점 : 사용하기 편하고, 디버깅하기 쉽다.
toString()은 자동으로 불린다 => 직접 호출하지 않아도 어딘가에서 쓰인다. (오류 메세지 효율적 로깅을 위해 필요!)
printf(), println(), assert구문, 문자열 연결 연산자(+), 디버거가 객체를 출력할때
toString()에서 반환할 것 : 객체가 가진 주요 정보 모두 (거대하다면 요약 정보)
2. toString() 문서화 포맷
ㄱ. 반환값의 포맷을 문서화하여 명시
- 값클래스는 문서화를 권한다 (ex: 전화번호, 행렬)
- 명시한 포맷에 맞는 문자열과 객체를 상호 전환할 수 있는 정적 팩터리나 생성자를 함께 제공하기
예시 ) Integer.toString(); / Integer.parseInt(string);
[장점]
- 표준적이고, 명확하고, 사람이 읽을 수 있다.
- 값 입출력 사용
- CSV 같이 데이터 객체 저장도 가능
[단점]
- 포맷을 한번 입력하면 영구적으로 해당 포맷에 얽매이게 된다.
ㄴ. 반환값의 포맷을 문서에 명시하지 않음
[장점]
- 향후 릴리즈에서 정보를 더 넣거나 포맷을 개선할 수 있는 유연성을 갖는다.
ㄷ. 포맷 명시 여부와 상관없이 toString()이 반환한 값에 포함된 정보를 얻어올 수 있는 API를 제공하자
- get() 메서드 등을 구현하라는 소리인 것 같다.
- 그렇지 않으면 프로그래머는 toString() 반환값을 파싱할 수 밖에 없다 (접근자를 제어하지 않아 포맷이 API의 역할을 한다.)
4. toString() 을 사용하는 경우
정적 유틸리티 클래스 / 부분 열거 타입은 toString을 재정의하지 않아도 된다.
하위 클래스들이 공유해야할 문자열 표현이 있다면 toString을 재정의한다.ex ) 컬렉션 구현체 : 추상 컬렉션 클래스의 toString() 메서드를 상속해서 사용한다.
'Dev Book Review > Effective Java' 카테고리의 다른 글
[Effective Java] item 14. Comparable을 구현할지 고려하라 (0) | 2020.04.19 |
---|---|
[Effective Java] item13. clone 재정의는 주의해서 진행하라 (0) | 2020.04.19 |
[Effective Java] item11. equals를 재정의하려거든 hashCode도 재정의하라 (0) | 2020.04.19 |
[Effective Java] item10. equals는 일반 규약을 지켜 재 정의하라 (0) | 2020.04.19 |
[Effective Java] Chapter 2 Summary : 객체 생성과 파괴 (0) | 2020.04.15 |