관리 메뉴

IT.FARMER

java toString 본문

JAVA

java toString

아이티.파머 2010. 5. 12. 11:04
반응형
펌 : http://decoder.tistory.com/44

참고 : 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);

}


이렇게 하면 출력결과가 이렇게 바뀐다.
test.commons.Person@a62fc3[firstName=Dae-yeop,lastName=Lee]

이렇게 하면 출력결과가 각 "필드명=값"의 형태로 바뀐다. 많이 발전했다. 이번에는 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

);

}

 
그러면 여러줄로 출력결과가 바뀐다.
test.commons.Person@a62fc3[
  firstName=Dae-yeop
  lastName=Lee
]

ㅎㅎ 나는 이게 가장 마음에 든다. 그 외에도 2가지 정도가 더 있는 것 같은데 자신이 마음에 드는 걸로 골라서 toString() 메소드를 구현해 주는 미덕을... :)

덧붙이자면 toString()을 구현하는 것이 다소 귀찮을지 몰라도 한번 구현해 놓으면 언제든지 객체의 필드가 어떤 값을 갖고 있는지 언제든지 확인할 수도 있고 상당히 유용하게 사용할 수 있다. Effective Java에서도 "Always Override toString"라는 지침으로 toString 메소드 구현을 권장하고 있다.
반응형