아이템 12 toString을 항상 재정의하라
toString 메서드는 객체의 정보를 사람이 읽기 쉽게 반환해야 한다. 잘 재정의된 toString 메서드는 객체의 주요 정보를 쉽게 확인할 수 있게 해주며, 특히 디버깅에 매우 유용하다. 따라서, 모든 하위 클래스에서 toString을 재정의하는 것이 권장된다.
좋은 toString 작성 방법
- 주요 정보를 포함하라: toString 메서드는 그 객체가 가진 핵심 정보를 포함하는 문자열을 반환해야 한다. 이는 그 객체를 설명할 수 있는 충분한 정보가 들어있어야 한다.
- 명확한 의도: 반환할 문자열의 포맷을 주석으로 명시하거나 문서화해서 다른 개발자들이 그 형식을 이해하고 사용할 수 있게 해야 한다.
- 대체 API 제공: toString이 단순히 디버깅용이어야지, 이를 데이터 추출에 사용하는 것은 바람직하지 않다. 만약 toString 외에 데이터를 얻어올 API가 없다면, 개발자들은 toString의 결과를 파싱해서 데이터를 추출하려 할 것이다. 이는 코드의 유지보수성을 해치고, 버그를 유발할 수 있다. 따라서, 명확한 값을 반환하는 메서드를 별도로 제공해야 한다.
toString을 재정의하지 않아도 되는 경우
- 유틸리티 클래스: toString이 큰 의미가 없는 정적 메서드만 포함하는 클래스나, 매우 간단한 클래스는 재정의하지 않아도 된다. 예를 들어, 컬렉션 유틸리티 클래스처럼 단순히 여러 정적 메서드를 제공하는 경우에는 굳이 toString을 재정의할 필요가 없다.
- enum 타입: 대부분의 enum 타입은 상수 이름 자체가 의미를 충분히 설명하기 때문에 toString을 재정의할 필요가 없다. enum의 기본 toString 구현은 상수 이름을 반환하므로, 일반적으로 이 자체로 충분히 유용하다.
- 상위 클래스에서 이미 알맞게 재정의된 경우: 만약 상위 클래스에서 충분히 유용한 toString 메서드를 재정의했다면, 하위 클래스에서 굳이 다시 재정의할 필요는 없다.
좋은 toString 구현 예시
public class Person {
private String name;
private int age;
private String email;
public Person(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + ", email='" + email + "'}";
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getEmail() {
return email;
}
public static void main(String[] args) {
Person person = new Person("Alice", 30, "alice@example.com");
System.out.println(person.toString()); // "Person{name='Alice', age=30, email='alice@example.com'}"
}
}
핵심 정리
모든 구체 클래스에서 Object의 toString을 재정의하자. 상위 클래스에서 이미 알맞게 재정의한 경우는 예외다. toString을 재정의한 클래스는 사용하기도 즐겁고 그 클래스를 사용한 시스템을 디버깅하기 쉽게 해준다. toString은 해당 객체에 관한 명확하고 유용한 정보를 읽기 좋은 형태로 변환해야 한다.
'Java' 카테고리의 다른 글
이펙티브 자바(Effective Java) 2장 - 아이템 14 Comparable을 구현할지 고려하라 (0) | 2024.12.03 |
---|---|
이펙티브 자바(Effective Java) 2장 - 아이템 13 clone 재정의는 주의해서 진행하라 (0) | 2024.12.03 |
이펙티브 자바(Effective Java) 2장 - 아이템 11 equals를 재정의하려거든 hashCode도 재정의하라 (0) | 2024.12.03 |
이펙티브 자바(Effective Java) 2장 - 아이템 10 equals는 일반 규약을 지켜 재정의하라 (0) | 2024.12.03 |
이펙티브 자바(Effective Java) 2장 - 아이템 9 try-finally보다는 try-with-resources를 사용하라 (0) | 2024.12.03 |
아이템 12 toString을 항상 재정의하라
toString 메서드는 객체의 정보를 사람이 읽기 쉽게 반환해야 한다. 잘 재정의된 toString 메서드는 객체의 주요 정보를 쉽게 확인할 수 있게 해주며, 특히 디버깅에 매우 유용하다. 따라서, 모든 하위 클래스에서 toString을 재정의하는 것이 권장된다.
좋은 toString 작성 방법
- 주요 정보를 포함하라: toString 메서드는 그 객체가 가진 핵심 정보를 포함하는 문자열을 반환해야 한다. 이는 그 객체를 설명할 수 있는 충분한 정보가 들어있어야 한다.
- 명확한 의도: 반환할 문자열의 포맷을 주석으로 명시하거나 문서화해서 다른 개발자들이 그 형식을 이해하고 사용할 수 있게 해야 한다.
- 대체 API 제공: toString이 단순히 디버깅용이어야지, 이를 데이터 추출에 사용하는 것은 바람직하지 않다. 만약 toString 외에 데이터를 얻어올 API가 없다면, 개발자들은 toString의 결과를 파싱해서 데이터를 추출하려 할 것이다. 이는 코드의 유지보수성을 해치고, 버그를 유발할 수 있다. 따라서, 명확한 값을 반환하는 메서드를 별도로 제공해야 한다.
toString을 재정의하지 않아도 되는 경우
- 유틸리티 클래스: toString이 큰 의미가 없는 정적 메서드만 포함하는 클래스나, 매우 간단한 클래스는 재정의하지 않아도 된다. 예를 들어, 컬렉션 유틸리티 클래스처럼 단순히 여러 정적 메서드를 제공하는 경우에는 굳이 toString을 재정의할 필요가 없다.
- enum 타입: 대부분의 enum 타입은 상수 이름 자체가 의미를 충분히 설명하기 때문에 toString을 재정의할 필요가 없다. enum의 기본 toString 구현은 상수 이름을 반환하므로, 일반적으로 이 자체로 충분히 유용하다.
- 상위 클래스에서 이미 알맞게 재정의된 경우: 만약 상위 클래스에서 충분히 유용한 toString 메서드를 재정의했다면, 하위 클래스에서 굳이 다시 재정의할 필요는 없다.
좋은 toString 구현 예시
public class Person { private String name; private int age; private String email; public Person(String name, int age, String email) { this.name = name; this.age = age; this.email = email; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + ", email='" + email + "'}"; } public String getName() { return name; } public int getAge() { return age; } public String getEmail() { return email; } public static void main(String[] args) { Person person = new Person("Alice", 30, "alice@example.com"); System.out.println(person.toString()); // "Person{name='Alice', age=30, email='alice@example.com'}" } }
핵심 정리
모든 구체 클래스에서 Object의 toString을 재정의하자. 상위 클래스에서 이미 알맞게 재정의한 경우는 예외다. toString을 재정의한 클래스는 사용하기도 즐겁고 그 클래스를 사용한 시스템을 디버깅하기 쉽게 해준다. toString은 해당 객체에 관한 명확하고 유용한 정보를 읽기 좋은 형태로 변환해야 한다.
'Java' 카테고리의 다른 글
이펙티브 자바(Effective Java) 2장 - 아이템 14 Comparable을 구현할지 고려하라 (0) | 2024.12.03 |
---|---|
이펙티브 자바(Effective Java) 2장 - 아이템 13 clone 재정의는 주의해서 진행하라 (0) | 2024.12.03 |
이펙티브 자바(Effective Java) 2장 - 아이템 11 equals를 재정의하려거든 hashCode도 재정의하라 (0) | 2024.12.03 |
이펙티브 자바(Effective Java) 2장 - 아이템 10 equals는 일반 규약을 지켜 재정의하라 (0) | 2024.12.03 |
이펙티브 자바(Effective Java) 2장 - 아이템 9 try-finally보다는 try-with-resources를 사용하라 (0) | 2024.12.03 |