이번장은 Object 클래스의 toString 메서드를 재정의하는 이야기를 다룬다. 이에 대해서 재정의 해야 하는 이유에 대한 내용에 대해서 먼저 설명하고 사용하기 전에 꼭 명심해야 할 것에 대해서 설명하면서 글을 정리하도록 하겠다.
toString을 왜 재정의해야 하는가?
만약 toString을 재정의하지 않는다면 어떻게 될까?
모두가 알고 있듯이 호출한 클래스의 주소가 출력된다.
/**
* Project : FourTeamEffectiveJavaStudy
*
* @author : jwdeveloper
* @comment :
* Time : 10:37 오후
*/
public class ToStringExample {
public static void main(String[] args) {
A a = new A();
System.out.println(a);
}
}
class A {
}
toString을 재정의하지 않아도 기본적으로 객체 호출 시 혹은 디버깅 시에 자동으로 toString이 호출된다.
이제 본격적으로 toString을 재정의해야 하는 이유에 대해서 살펴보자!
해당 이유에 대해서 다음과 같이 두가지 이유가 존재한다.
- toString을 잘 구현한 클래스는 사용하기 훨씬 편하고 해당 클래스를 디버깅하기 쉬워진다
- toString을 제대로 정의했다면 호출 만으로 문제를 진단할 수 있어진다.
System.out.println(phoneNumber + "에 연결할 수 없습니다.");
만약 재정의 하지 않았다면 주소만이 출력되어 그 다지 의미 없는 메시지가 출력되었을 것이다.
toString을 사용하기 전에 이것만은 알아두자!
1. 스스로를 완벽하게 설명할 수 있는 문자열로 표현하자
해당 클래스에 대해서 완벽하게 설명할 수 있는 문자열은 다른 말로 해당 객체가 가지고 있는 주요 속성들을 전부 담는 것을 의미한다.
- 객체의 요약 정보같은 느낌으로 작성
2. 포맷을 문서화 할지를 결정하라
포맷을 문서화 한다는 의미는 프로젝트에서 toString 이러한 형식으로 정의해야한다는 일종의 voucher를 제공하는 것이다.
포맷을 명시한다는 말이 무척 좋은말 같지만 달리 생각하여 만약 포맷이 바뀌어 버린다면 어떻게 될까?
toString을 재정의한 객체가 100개가 넘는다면 포맷이 바뀌었다는 이유만으로 모든 toString을 바뀌어진 포맷으로 바꿔야한다는 것이다.
하지만 포맷을 명시하던 안하던 의도는 명확하게 하는 것이 좋다.
- 포맷을 명시할 때
/**
* 이 전화번호의 문자열 표현을 반환한다.
* 이 문자열은 "XXX-YYY-ZZZZ" 형태의 12글자로 구성된다.
* XXX는 지역 코드, YYY는 프리픽스, ZZZZ는 가입자 번호다.
* 각각의 대문자는 10진수 숫자 하나를 나타낸다.
*
* 전화번호의 각 부분의 값이 너무 작아서 자릿수를 채울 수 없다면,
* 앞에서부터 0으로 채워나간다. 예컨대 가입자 번호가 123이라면
* 전화번호의 마지막 네 문자는 "0123"이 된다.
*/
- 포맷을 명시하지 않을 때
/*
* 이 약물에 관한 대략적인 설명을 반환한다.
* 다음은 이 설명의 일반적인 형태이나,
* 상세 형식은 정해지지 않았으며 향후 변경될 수 있다.
*
* "[약물 #9: 유형=사랑, 냄새=태레빈유, 겉모습=먹물]"
* */
Ref
![]() |
|
'자바' 카테고리의 다른 글
(이펙티브 자바) 아이템 10. equals는 일반 규약을 지켜 재정의하라 (0) | 2020.08.04 |
---|---|
(이펙티브 자바) 아이템 09. try-finally보다는 try-with-resouce를 사용하라 (0) | 2020.08.03 |
(이펙티브 자바) 아이템 05. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2020.07.28 |
(이펙티브 자바) 아이템 07. 다 쓴 객체 참조를 해제하라 (0) | 2020.07.28 |
(이펙티브 자바) 아이템 06. 불필요한 객체 생성을 피하라 (0) | 2020.07.27 |