티스토리 뷰
* 이펙티브 자바 2/E를 읽고 공부하기 위해 기록한 게시글입니다.
10. toString은 항상 재정의하라
잘 만들어놓은 toString은 클래스를 좀 더 쾌적하게 사용할 수 있도록 도움을 준다.
- 가능하면 toString 메서드는 객체 내의 중요 정보를 전부 담아 반환해줘야 한다.
toString을 따로 재정의하지 않으면 Object에 정의된 toString 메서드가 사용되는데 이는..
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
- 클래스 이름@16진수 해시코드가 출력되게 된다. 썩 마음에 들지가 않는다
- 모든 하위 클래스는 이 메서드를 재정의함이 바람직하다. 사람이 읽기 쉬운 정보를 제공해 주는 것이 좋다.
toString 메서드는 println이나 printf와 같은 문자열 연결 연산자, 디버거 등에 객체가 전달될 시에 자동으로 호출된다
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
////
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
- println 메서드는 Object 객체를 받은 뒤 String.valueOf 메서드를 통해 문자열로 변환 후 출력
-> valueOf 메서드는 Object의 toString 메서드를 사용한다. (재정의된 메서드가 있다면 그걸 사용)
toString을 구현할 때 중요한 사항 중 하나는 toString이 반환하는 문자열의 형식을 문서에 명시할 것이냐는 것이다
- 값 클래스라면 형식을 명시하는 것이 좋다
- 형식을 규정해 둔 경우라면, 문자열로부터 객체를 만드는 정적 팩토리 메서드나 생성자를 통해 편리하게 사용할 수 있다.
-> 문자열을 객체로, 객체를 문자열로 자유롭게 사용할 수 있다. 자바 기본 라이브러리인 BigInteger나 Wrapper 클래스들 대부분이 위와 같은 형식을 따른다.
- 형식을 명시한 경우, 나중에 형식을 변경하려고 하면 정말 골치아파진다. 처음에 만들 때 신중하게 만드는 것이 좋다.
* 형식을 명시해두지는 않더라도 주석은 꼭 달아두는 것이 좋다!!
* toString이 반환하는 문자열에 포함되는 정보들은 전부 프로그래밍을 통해서 가져올 수 있도록 하라 (getter 등..)
- 접근자가 없다면 문자열을 일일히 파싱해서 사용해야 하고 이는 문제를 일으킬 가능성이 참 많다.
(+) lombok의 @ToString 애노테이션을 이용하면 toString을 자동으로 만들어준다.
- 클래스 이름, non-static 필드명과 그 값을 잘 정리해서 만들어준다.
- JPA에서 양방향 연관관계에 있는 객체들이 @ToString을 사용하면 순환참조 문제가 발생한다.
(+) 정적 유틸리티 클래스(java.lang.Math, java.lang.String 등..), Enum 등은 toString을 따로 만들 필요가 없다.
'JAVA' 카테고리의 다른 글
자연적 순서가 있는 객체는 Comparable 구현 (0) | 2022.07.22 |
---|---|
객체 복제가 필요하다면 복사 생성자/팩토리 (0) | 2022.07.21 |
equals를 재정의할 때는 hashCode도 같이 재정의하자 (0) | 2022.07.18 |
equals 메서드 정의는 일반 규약을 따르자 (0) | 2022.07.18 |
종료자 사용을 피하자 (0) | 2022.07.17 |