java toString
참고 : http://dev2dev.bea.com/pub/a/2005/04/commons_lang.html
Java 로 프로그램을 작성하다 보면 Object 클래스의 toString() 메소드를 오버라이드 하는 경우가 많다. 그런데 10개 내외의 필드를 가진 클래스의 toString() 메소드를 구현하는 것은 시간도 적게 걸리고 해서 별 문제가 안되는데, 그 이상의 필드를 가진 클래스의 toString() 메소드를 예쁘게 오버라이드 하는 일은 상당히 귀찮은 일이 되어 버린다. 이클립스에 그런 기능이 들어있을 줄 알았는데, 내가 못찾는 건지....
이러한 상황에서 요긴하게 사용할 수 있는 외부 라이브러리가 바로 Jakarta Commons Lang 라이브러리이다. 지난번에 BaseObject라는 클래스를 상속받으면 toString() 메소드를 자동으로 오버라이드 해준다는 얘길 어디선가 얼핏 주워 듣고 써볼려고 했더니만 실패... -_-;;
그러다가 지난주 쯤에 이 기사를 보고, 이제서야 알게 됐다. 지금까지 손가락이 오그라들도록 일일이 수작업으로 작성했던 toString() 메소드여.. 이제 안녕.
기사에는 몇가지 유용한 Commons Lang 라이브러리의 기능들을 소개하고 있는데, 다른 건 잘 모르겠고 가장 간단한 toString()에 대해서만 우선 훑어보았다. 이런.. 너무 간단하자나!!!! -_-
이런 클래스가 있다고 치자.
public class Person {
private String firstName;
private String lastName;
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
toString() 메소드가 없으니깐 좀 아쉽다. 그냥 toString() 메소드를 구현하지 않고 Person 객체를 출력하면 대충 이렇게 나온다.
test.commons.Person@c17164
그렇다. 좀 없어보인다. 그래서 Commons Lang 라이브러리를 추가하고 소스의 마지막에 toString()을 다음과 같이만 구현해 준다.
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
이렇게 하면 출력결과가 이렇게 바뀐다.
이렇게 하면 출력결과가 각 "필드명=값"의 형태로 바뀐다. 많이 발전했다. 이번에는 ToStringStyle 클래스의 상수를 인자로 넘겨서 출력 형태를 좀 바꿔본다. 코드를 아래와 같이 수정해 본다.
@Override
public String toString() {
return ToStringBuilder.reflectionToString(
this, ToStringStyle.DEFAULT_STYLE
);
}
기본 스타일이라는 의미인데, 출력형태는 처음에 바꾸었던 형태이다. 그럼 이번에는 SIMPLE_STYLE로 바꿔본다.
@Override
public String toString() {
return ToStringBuilder.reflectionToString(
this, ToStringStyle.SIMPLE_STYLE
);
}
그러면 아래와 같이 출력형태가 바뀐다.
Dae-yeop,Lee
이번에는 MULTI_LINE_STYLE로 바꿔본다.
@Override
public String toString() {
return ToStringBuilder.reflectionToString(
this, ToStringStyle.MULTI_LINE_STYLE
);
}
그러면 여러줄로 출력결과가 바뀐다.
ㅎㅎ 나는 이게 가장 마음에 든다. 그 외에도 2가지 정도가 더 있는 것 같은데 자신이 마음에 드는 걸로 골라서 toString() 메소드를 구현해 주는 미덕을... :)
덧붙이자면 toString()을 구현하는 것이 다소 귀찮을지 몰라도 한번 구현해 놓으면 언제든지 객체의 필드가 어떤 값을 갖고 있는지 언제든지 확인할 수도 있고 상당히 유용하게 사용할 수 있다. Effective Java에서도 "Always Override toString"라는 지침으로 toString 메소드 구현을 권장하고 있다.