티스토리 뷰

아래의 자료를 번역 및 요약

10 Tips to override toString() method in Java


자바의 toString 메서드는 객체의 명확하고 간결한 정보를 사람이 읽을 수 있는 형식으로 제공하는데 이용된다.
올바르게 override된 toString 메서드는 가치있고 의미있는 정보를 제공하여, 프로그램의 로깅과 디버깅에 도움을 준다.
toString은 java.lang.Object 클래스에 정의되어 있기 때문에, 충분한 정보를 제공하지 않는다. 따라서 서브클래스에서 override하는것이 좋다.

기본적으로 toString은 package.class@hashCode의 형태를 출력한다. ex) test.Country@18e2b22
예를 들어, 네트워크 관련 클래스의 경우 toString을 통해 단순히 hashCode보다 호스트 이름이나 포트를 출력시키는 것이 더 유용할 것이다.

toString을 재정의하는 방법에는 여러가지가 있다.
IDE를 이용해 생성할수도 있으며, Apache commons의 ToStringBuilder를 이용할수도있고, 물론 수동으로 생성할수도 있다.

이제 toString을 override할 때 기억해야할 몇가지 팁을 제공한다.

  1. Print formatted date e.g. dd-MM-yy instead of raw date (원시 날짜 대신 dd-MM-yy처럼 형식화된 날짜를 출력하라)
    java.util.Date 클래스의 toString은 기본적으로 형식화된 날짜를 출력하지않고, 불필요한 세부정보를 포함한다.
    DateFormat 등을 이용해 형식화하여 출력하자.
    How to Convert Date to String in Java with Example 참고

  2. Document toString format (toString 형식 문서화)
    toString이 field=value 관점에서 데이터를 출력하지 않는다면, toString 형식을 문서화하라 (직역)

    예를 들어, Employee의 toString은 "name-id-department-contact"보다 "John-101-Sales-123123"처럼 구체적인 값을 출력시킨다. 단, 이때 toString에서 데이터를 추출하지 못하게 하고, 그에 상응하는 getter를 제공한다. toString으로 데이터를 추출하는 것은 객체를 취약하고 오류가 발생하기 쉽게 한다.

  3. Use StringBuilder to generate toString output (결과물을 만드는데 StringBulder를 사용하라)
    연산자보다, StringBuilder와 append()를 사용하라

  4. Use @Override annotation (@Override 어노테이션을 사용하라)
    overriding method에 @Override 어노테이션을 붙이는 것은 자바의 좋은 습관중 하나다.

  5. Print contents of Array instead of printing array object (배열 객체 대신 배열의 내용을 출력하라)
    배열은 자바 객체지만 toString을 override하지 않고, 별로 도움이 되지않는 기본 형식으로 출력된다.
    (논외로, 이것은 char[] 배열이 암호같은 민감한 데이터를 저장할 때, String보다 선호되는 이유이기도 하다)
    배열 객체 자체보다 배열의 내용을 출력하는 것이 더 도움이 되는지 고민해본 뒤, 납득이 되면 내용을 출력하라.
    성능상의 이유를 제외하면, 배열보다 ArrayList, HashSet같은 Collection이 더 선호되긴한다.

Bonus Tips

  1. 길이에 따라 한줄 또는 여러줄로 출력하라
  2. 혼동을 피하기 위해 package.class와 같은 전체 클래스명을 포함시켜라
  3. null 값을 스킵하거나 보여줄수도 있다. 때론 NPE같은 상황에 null을 출력시키는 것이 유용할 때도 있으므로
  4. 대부분의 IDE들이 따르듯이, member.name = member.value같은 키값 형식을 사용하라
  5. 하위 클래스의 정보를 표현해야한다면, 상속받은 멤버도 포함한다.
  6. 때로는 객체가 수많은 선택적/필수적인 파라미터들을 가지며, 의미있는 모든 정보들을 표현하기 어려울수도 있다. (예를 들어 Builder패턴처럼)

언제 toString 메서드가 호출되는가

toString은 println(), printf(), loggers, assert문, IDE의 디버거, collections의 출력과정 등 다양한 자바 API들에 의해 호출된다.
서브클래스가 toString을 재정의하지 않는 경우, Object의 디폴트 구현이 수행되고 많은 개발자들이 Log4J같은 로깅 API에서 사용하듯이, logger.info("Customer not found : " + customer)와 같은 상황에서 customerId, customerName 같은 의미있는 정보들이 전달되지 않을 수도 있다.

  • 앞으로 서버를 본격적으로 다루고, 로깅을 하다보면 더더욱 중요성을 알게될듯하다.
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함