|  |  |
|
객체의 문자열 표현
Object의 기본 toString 구현은 객체의 완전히 명시된 이름(fully qualified name)에 @ 문자를 붙이고 그 객체의 해시 코드 값을 추가한 문자열을 돌려준다. 그리고 이미 알고 있겠지만 이는 객체를 서로 구분하는 데 그다지 큰 도움이 되지 않는다. Commons Lang은 편리한 ToStringBuilder 클래스를 제공하는데, 더 읽을 만한 toString 결과를 만드는 데 도움이 된다.
toString 구현하기
아마 다들 toString 메서드를 한번 이상은 구현해 봤을 것이다. 나도 마찬가지다. 이 메서드는 그리 복잡하지 않고 잘못 구현하기도 어렵다. 하지만 toString을 구현하는 것은 성가신 일이 되기도 한다. 그리고 Account 객체가 이미 Commons Lang 라이브러리를 사용하고 있기 때문에 일단 ToStringBuilder가 어떻게 사용되는지를 보자.
ToStringBuilder는 앞서 다룬 세 클래스와 같은 방식으로 동작한다. 객체를 생성한 다음 프로퍼티들을 추가하고 toString을 부른다. 그게 전부다.
이제 toString 메서드를 재정의해 Listing 24에 보인 코드를 추가해 보자.
Listing 24. ToStringBuilder 사용하기
public String toString() {
return new ToStringBuilder(this).append("id", this.id).
.append("firstName", this.firstName)
.append("lastName", this.lastName)
.append("emailAddress", this.emailAddress)
.append("creationDate", this.creationDate)
.toString();
}
|
늘 그렇지만 Listing 25에 보인 것처럼 리플렉션을 활용할 수도 있다.
Listing 25. ToStringBuilder의 리플렉션 API 사용하기
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
|
ToStringBuilder를 어떻게 사용할지를 선택하는 것과 무관하게 toString을 호출하면 한층 읽기 편한 String이 나온다. 예를 들어 Listing 26의 객체를 보자.
Listing 26. 특정 Account 객체
new Account(10, "Andrew", "Glover", "ajg@me.com", now);
|
Listing 27에서 보는 것처럼 출력 결과가 꽤 읽을 만하다.
Listing 27. ToStringBuilder에서 나온 출력
com.acme.app.Account@47858e[
id=10,firstName=Andrew,lastName=Glover,emailAddress=ajg@me.com,
creationDate=Tue Nov 11 17:20:08 EST 2008]
|
자신의 객체에 대해 이런 형태의 String 표현이 맘에 들지 않는 경우를 위해 Commons Lang 라이브러리는 원하는 출력을 만드는 데 도움이 되는 도움 클래스를 몇 개 제공한다. 어쨌든 ToStringBuilder를 사용하면 예를 들어 로그 파일 내 객체에 대해 일관된 형태의 표현을 기록할 수도 있다.
|  |
|