본문 바로가기

이펙티브 자바

[이펙티브 자바] 아이템 12. toString을 항상 재정의하라

toString() 메서드객체를 문자열 표현으로 반환해주는 메서드이다.

toString() 메서드는 기본적으로 '클래스이름@hashcode' 문자열을 반환해준다. 예를들면 PhoneNumber@abbaa 이런식이다.

이런 형태는 객체의 상태나 값에 대한 유용한 정보를 제공하지 않기때문에 재정의해 의미있게 표현해야한다.

 

예를들어 이러한 클래스가 있다고 예시를 들어보자 : 

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 객체의 문자열 표현을 반환합니다.
     * 이 문자열 표현은 객체의 주요 정보를 요약하여 제공하며,
     * 디버깅과 로깅 목적으로 유용합니다.
     * 
     * 반환되는 문자열의 포맷은 "Person{name='이름', age=나이}" 입니다.
     * 여기서, '이름'과 '나이'는 각각 객체의 name과 age 필드의 현재 값을 나타냅니다.
     * 
     * @return 객체의 문자열 표현
     */
    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}

// 사용 예:
Person person = new Person("John Doe", 30);
System.out.println(person.toString()); // 출력: Person{name='John Doe', age=30}

 

예시처럼 toString()을 재정의 했을 경우 Person{name='John Doe', age=30} 같이 반환된다.

Person 객체에 담긴 name, age같은 정보가 출력되어 디버깅, 로깅시 유용하다.

만약 이를 재정의하지 않았을경우 출력값은 Person@b58a 이런식으로 출력됬을것이다.

 

그리고 예시처럼 반드시 반환값의 포맷을 명시하든 아니든 재정의 하려는 의도를 반드시 명확하게 밝혀야 한다.

구글의 AutoValue같은 프레임워크로 toString 재정의시 각 필드의 내용등을 설명해주긴 한다. 하지만 개발자가 원하는 클래스의 '의미'까지는 알지는 못. 개발자가 원하는 의도에 맞게 작성해주자.

 

결론 : toString() 메서드는 재정의해주자. 재정의시 의도를 명확하게 작성해주자. 재정의해 디버깅시 유용하게 사용하자. 재저