아아템 12. ToString을 항상 재정의하라

아아템 12. ToString을 항상 재정의하라

728x90

재정의가 필요하지 않는 경우를 제외하곤 모든 클래스에서

toString 을 재정의 하는게 좋다 toString 은 간결하면서도 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야 한다

toString 잘 구현하면 좋은점

사용하기에 훨씬 편함 해당 클래스를 사용한 시스템은 디버깅하기가 쉽다 println, printf , 문자열 연결 연산자 (+), assert 구문 넘길때 디버거가 객체 출력시 자동으로 불림

toString 은 객체가 가진 주요 정보 모두를 반환하는게 좋다

반환값의 포맷을 문서화 할지 정해야한다

포맷을 명시하면 객체는 표준적이고, 명확하고 사람이 읽을 수 있게 됨

입출력에 사용하거나 csv 파일처럼 사람이 읽을 수 있음

명시한 포맷에 맞는 문자열과 객체를 상호전환 할 수 정적 팩터리나 생성자를 함께 제공하면 좋다

예시 ) Integer.toString(); / Integer.parseInt(string);

반환값 포맷의 단점

한번 명시하면 평생 그 포맷에 얽매이게 됨 → 포맷을 변경하는 경우 사용하던 코드, 데이터들에 영향을 줄 수 있음

포맷을 명시하든 아니든 의도는 명확하게 밝히기

// 포맷을 정확하게 명시한 예시 /** * 이 전화번호의 문자열 표현을 반복한다 * 이 문자열은 "XXX-YYY-ZZZZ" 형태의 12글자로 구성한다.. */ @Override public String toString() { return String.format("%03d-%03d-%04d", areaCode, prefix, lineNum); } // 포맷을 명시하지 않은 예시 /** * 이 약물에 관한 대략적인 설명을 반환한다. * 다음은 이 설명의 일반적인 형태이나, * 상세 형식은 정해지지 않았으며 향후 변경될 수 있다. * * "[약물 #9: 유형=사랑, 냄새=테레빈유, 겉모습=먹물]" */ @Override public String toString() { ... }

포맷 명시와 상관없이 toString 이 반환한 값에 포함된 정보를 얻어올 수 있는 API 제공

get 메서드

정적 유틸리티 클래스는 toString 을 제공할 이유가 없다

대부분의 열거 타입도 자바가 이미 완벽한 toString 을 제공하기 때문에 따로 재정의하지 않아도 된다.

하지만 하위 클래스이 공유해야할 문자열 표현이 있는 추상 클래스면 재정의 해줘야함

ex) 컬렉션 구현체는 추상 컬렉션 클래스들의 toString 메서드를 상속해서 쓴다

Lombok을 사용한 toString

@AllArgsConstructor @ToString(exclude = {"modelName"}) public class Laptop { private String modelName; @ToString.Exclude private String company; public static void main(String[] args) { Laptop laptop = new Laptop("노트북1", "삼성"); System.out.println("laptop = " + laptop); } }

요약

로그를 찍을 일이 있을것 같으면 귀찮아하지 말고 toString을 override 하자.

전부 다 toString으로 찍지 말고, 필요한 것 위주로 작성하라.

Lombok은 toString을 마들기 귀찮은 개발자들이 성실하게 toString을 구현하도록 유인할 수 있다.

Lombok 사용 시 주요 옵션은 공식 홈페이지에서 확인할 것.

728x90

from http://development-record.tistory.com/93 by ccl(A) rewrite - 2021-11-15 20:27:42