티스토리 뷰

JAVA

toString은 재정의해서 사용하자

세댕댕이 2022. 7. 21. 13:27

* 이펙티브 자바 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을 따로 만들 필요가 없다.

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함