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

Minjun Kang·2022년 8월 23일
0

Effective Java

목록 보기
6/6
post-thumbnail

item12. toString 을 항상 재정의하라

Object Class의 toString() 은 다음과 같은 형식으로 객체를 String으로 변환한다.

getClass().getName() + '@' + Integer.toHexString(hashCode());

즉, 클래스명@16진수의 해쉬코드 로 변환한다는 뜻이다.

toString()재정의의 필요성

toString()은 언제 이용될까?

  • 로그 및 디버깅 용
  • 인스턴스의 텍스트화

그 외 여러가지 상황에서 toString() 이 이용될 수 있겠지만, Object.toString() 은 우리가 원하는 세부 정보를 포함하지 않는다. 그렇기 때문에, 상황에 따라서 toString() 은 적절하게 재정의 되어야한다.

toString()을 잘 설계하는 방법

  • toString()은 용도에 맞게 필요한 모든 필드들을 기술해야한다.

  • 만약 String으로 정보를 표현하기 어렵다면, 해당 정보를 가시적으로 확인할 수 있는 요약정보를 제공해야한다.

  • toString()의 반환 값을 파싱하여 값을 가져오는 것은 비효율적이므로, getter API 를 따로 선언해주는것이 좋다.

  • toString()반환 값에 대한 의도를 분명하게 밝혀야한다.

  • 반환 결과를 포맷화할 것인지를 정해야한다.

포맷화된 toString()

항상 toString()은 이러한 형식으로 인스턴스를 String으로 변환한다는 형식을 정해둔 방식이다.

장점

  • 표준화
  • 명확하다
  • 파싱 로직은 반 고정적이기 때문에, 문자열과 객체를 상호변환하는 생성자나 정적 팩토리를 설계할 수 있다.

단점

  • 한번 정해놓은 포맷에 의존적 (추후에 개선이 어려울 수도 있음)

포맷화되지 않은 toString()

상세 형식이 정해지지 않고 추후 변경될 수도 있다.

장점

  • 포맷은 지속적으로 개선이 가능하다.

단점

  • 파싱 로직이 매번 바뀔수도 있으므로, 파싱 로직은 toString()의 반환값에 의존적이지 않아야한다.
profile
성장하는 개발자

0개의 댓글