본문 바로가기

Dev Book Review/Effective Java

[Effective Java] Item12. toString을 항상 재정의하라

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() 메서드를 상속해서 사용한다.