모든 구체 클래스에서 toString을 재정의하자
toString 메서드는 객체를 문자열로 변환하는 메서드이다.
toString 메서드를 호출하지 않아도, println, printf, 문자열 연결 (+), assert 구문 등에서 자동으로 호출될 수 있다.
따라서 객체의 내용을 보기를 원하거나, 원하는 포맷이 있는 경우 반드시 재정의해야한다.
기본 toString을 사용하는 경우 클래스명@주소값 형태로 출력된다.
public class Person {
String name;
int age;
}
System.out.println(new Person()); // Person@1234
디버깅용 로그를 찍거나 할 때 System.out.println(객체) 이런식으로 많이 호출하기 때문에 toString을 올바르게 재정의하는 것이 좋다.
추상 클래스에서 공통 필드나 정보 기반으로 toString()을 재정의해 두면, 자식 클래스는 굳이 toString()을 재정의하지 않아도 된다
올바른 toString 재정의
해당 객체가 가진 주요 정보를 모두 반환하는 것이 좋다.
@Override
public String toString() {
return "이름: " + name + ", 나이: " + age;
}
포맷이 필요한 경우, 의도를 문서화해서 남겨야한다.
/*
전화번호 문자열 표현을 반환한다.
문자열은 XXX-YYY-ZZZZ 형태의 12글자로 구성된다.
XXX는 지역 코드, YYY는 프리픽스, ZZZ는 가입자 번호다.
각각의 대문자는 10진수 숫자 하나를 나타낸다.
*/
@Override public String toString(){
return String.format("%03d-%03d-%04d", areaCode, prefix, lineNum);
}
toString에서 정보를 직접 꺼내서 사용하는 것은 (파싱) 위험하다.
포맷을 바꾸면 시스템이 망가질 수 있기 때문에, 접근용 API를 제공하는 것이 중요하다.
Person person = new Person("철수", 20);
// 잘못된 예시
String info = person.toString();
String name = info.split(",")[0].split(":")[1];
// 올바른 예시
String name = person.getName();
재정의 하지 않아도 되는 경우
- 정적 유틸리티 클래스: 필드가 없으므로 toString을 통해 상태를 보여주는 경우가 없음
- Enum 등의 열거 타입: 자바에서 toString 이미 제공
아래와 같은 경우 Enum 이름이 아니라 라벨을 출력하고자하므로 toString을 재정의할 수도 있다.
public enum Status {
WAITING("대기 중"),
RUNNING("실행 중"),
DONE("완료");
private final String label;
Status(String label) {
this.label = label;
}
@Override
public String toString() {
return label;
}
}
반응형
'도서 > 이펙티브 자바' 카테고리의 다른 글
| [이펙티브 자바] 11. equals를 재정의하려거든 hashCode도 재정의하라 (2) | 2025.07.21 |
|---|---|
| [이펙티브 자바] 10. equals는 일반 규약을 지켜 재정의하라 (1) | 2025.07.17 |
| [이펙티브 자바] 9. try-finally 보다는 try-with-resources를 사용하라 (0) | 2025.04.15 |
| [이펙티브 자바] 8. finalizer 와 cleaner 사용을 피하라 (0) | 2025.03.23 |
| [이펙티브 자바] 7. 다 쓴 객체 참조를 해제하라 (0) | 2025.03.21 |