Java | toString

yeonk·2023년 4월 6일
0

java

목록 보기
3/3
post-thumbnail

서론


우아한테크코스 레벨1 마지막 미션인 체스 미션에서 DB에 값을 넣기 위해 toString() 을 재정의하여 사용하였다.

리뷰어인 네오에게 "toString을 DB 저장을 위해 사용할 경우 생길 수 있는 문제가 없을까요?" 라는 질문을 받았다.

이 질문에 대한 답을 찾기 위해 toString 에 대해 공부하게 되었고, 공부한 내용을 정리해보려고 한다.

이 글에서는 toString() 이 무엇인지, 어떻게 사용해야할지를 알아본다.






toString 이란?


java.lang 패키지의 Object 클래스에 toString 메소드가 정의되어 있으며 아래와 같은 특징을 가진다.

  • toString은 Object의 문자열 표현을 반환한다.

  • 간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야 한다.

  • 모든 하위 클래스가 이 메서드를 재정의해야 한다.

  • 기본 toString 메소드는 아래와 같이 구현되어 있으며, 클래스_이름@16진수로_표시한_해시코드 를 반환한다.

getClass().getName() + '@' + Integer.toHexString(hashCode())






toString의 사용


toString() 은 디버깅 용도로 설계 되었다.
특이한 케이스를 제외하면 toString()은 디버그만을 위해 사용되어야 한다.

toString을 잘 구현한 클래스를 사용한 시스템은 디버깅하기 쉽다.
toString()은 직접 호출하지 않아도 아래와 같이 다양한 곳에서 자동 호출된다.

  • 객체를 println, printf 로 출력할 때

  • 문자열 연결 연산자(+)를 사용하여 문자열 변환을 할 때

  • assert 구문에서 사용할 때

  • (IDE 툴에서) 디버거가 객체를 출력할 때






toString 재정의


toString을 재정의할 때는 아래 내용들을 참고하면 좋다.

  • 객체가 너무 거대하지 않고 문자열로 표현하기 적합하다면, toString은 그 객체가 가진 주요 정보 모두를 반환하는 것이 좋다.

  • toString을 구현할 때는 반환값의 포맷을 문서화할지 정해야 한다.

    • 장점: 그 객체는 표준적이고, 명확하고, 사람이 읽기 용이하다.
    • 단점: 포맷을 한번 명시하면 평생 그 포맷에 얽매이게 된다.
      (상대적으로 유연성이 떨어질 수 있다)
    • 포맷을 명시한다면, 포맷에 맞는 문자열과 객체를 상호 전환할 수 있는 팩터리나 생성자를 제공해주면 좋다.
  • 포맷을 명시와 관계없이 의도는 명확히 밝혀야 한다.

  • toString 이 반환한 값에 포함된 정보를 얻어올 수 있는 API를 제공해야 한다.

  • 하위 클래스들이 공유해야 할 문자열 표현이 있는 추상 클래스라면 toString을 재정의해줘야 한다.

  • 열거 타입은 이미 완벽한 toString을 제공하고 있다.






결론


  • toString은 간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야 한다.

  • 모든 구체 클래스에서 toString을 재정의 하자.

  • 상위 클래스에서 이미 알맞게 재정의한 경우에는 예외적으로 판단한다.

  • toString을 재정의한 클래스는 사용한 시스템을 디버깅하기 쉽게 한다.






참고 자료


이펙티브 자바 3판 3장 아이템 12. toString을 항상 재정의하라

Class Object

Is it ok to add toString() to ease debugging?

toString을 오버라이딩 하는이유가 궁금합니다.

Java 에서 toString 메소드의 올바른 사용 용도에 대하여

0개의 댓글