[Effective Java] item12 - toString을 항상 재정의하라

신민철·2023년 4월 17일
1

Effective Java

목록 보기
12/23
post-thumbnail

Object의 기본 toString 메소드를 사용해서 객체를 출력하면 Address@abcdd 같이 클래스명@16진수_해시코드로 반환된다.

여기서 어떤 유익한 정보를 얻을 것 같은가? Address 클래스는 주소지를 알려주는 것이 훨씬 유익할 것이다.

심지어 toString의 규약은 “모든 하위 클래스에서 재정의하라!” 라고 한다.

toString을 재정의하게 된다면 장점은 많다.

객체를 println, printf, 문자열 연결(+), assert 구문에 넘길 때 자동으로 호출된다. 정말 편리한데 이런 toString을 재정의하지 않으면 그저 쓸모없는 메소드에 불과할 것이다.

{Shin=”서울특별시 광진구”} 와 {Shin=Address@abc12} 중에 어떤 것이 나을지는 답이 나와있는 것이다.

만약 객체가 가진 정보가 많다고 생각해보자.

Address 에서는 사람이 사는 주소지, 거주하는 사람의 전화번호, 이름 등이 있다고 생각해보자.

toString에서 어떤 특정 필드 예를 들어, 거주하는 사람의 이름만 반환하면 어떨까? 약간만 생각해봐도 모두 다 반환하는 것이 좋을 것이다.

하지만 객체가 엄청 거대하다면?

만약 서울특별시에 거주하는 사람의 Address 객체가 있다고 생각해보자. 이런 상황에서는 모든 사람의 정보를 표현하는 것이 정확하겠지만, 한눈에 보기에는 주소(총 1000만명) 이런식으로 표현되는 것이 편리할 것이다.

→ 즉 요약 정보를 담아야 한다.

그리고 toString을 구현할 때는 반환값의 포맷을 정해야 한다.

포맷은 CSV, TXT 등 이 되겠다.

포맷을 명시할거라면, 명시한 포맷에 맞게 문자열을 변환할 수 있는 정적 팩토리나 생성자를 제공해주면 좋을 것이다.

포맷을 명시하는 것에는 단점도 있는데, 한번 포맷을 명시하면 그 스펙에 맞춰 개발한 많은 프로그램에서 차후 릴리즈에 포맷을 변경하게 된다면 버그에 사람들이 절망할 것이다!

그래서 사실상 포맷을 한 번 정하게 되면 고착화되는 것이다.

반대로 포맷을 정하지 않는다면 유연성이 좋다는 뜻이다.

둘 다의 경우에서 개발한 의도는 밝혀야 한다.

모니터 클래스가 있다고 쳐보자.

반환 형식을 명시하지 않고 [모니터: 형태=커브드, 크기=24인치, 색상=검정색] 등으로 형식을 제안할 수도 있다. 이런 제안 사항을 따르는 것은 개개인 개발자의 몫이다.

그리고 또한 중요한 건 포맷 여부와 상관없이 객체의 데이터를 얻을 수 있는 API를 제공해야 한다.

만약 모니터에서 형태에 대한 정보를 얻고 싶은데 API가 없다면 toString 문자열을 파싱해서 정보를 추출내야 할 것이다.

게다가 이런 파싱 방식은 차후 포맷이 변경되게 된다면 시스템이 망가지게 된다.

마지막으로, 정적 유틸리티 클래스와 열거 타입은 toString의 재정의가 필요하지 않다.


핵심 정리
모든 클래스에서 toString을 재정의하자. 재정의할 때는 해당 객체에 대한 정보를 명확하게 전달해야만 할 것이다.

0개의 댓글