본문 바로가기
Language/Java

이펙티브 자바 - toString 재정의

by ocwokocw 2021. 10. 4.

- 이 글은 Effective Java 를 기반으로 작성되었습니다.

- toString 의 default 구현

toString 을 별도로 재정의 하지 않고 그냥 사용하게 될 경우 기본형은 클래스명@16진수와 같은 형태를 띄게 된다. 프로그램에 특별히 해를 끼치는것은 아니지만 사람이 보기에 그다지 유용한 정보는 아니다.

 

/**
     * Returns a string representation of the object. In general, the
     * {@code toString} method returns a string that
     * "textually represents" this object. The result should
     * be a concise but informative representation that is easy for a
     * person to read.
     * It is recommended that all subclasses override this method.

.......

public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

 

위는 Object 의 toString 메소드 정의 부분이다. 결과는 간결해야하며 가독성이 좋아야 한다고 쓰여있지만 "클래스명@16진수" 의 형태는 사람이 읽고 정보를 취하기에 좋지는 않다. 그래서 다음 문장에서 곧바로 이 메소드를 모든 하위 클래스에서 재정의 하기를 권고하고 있다.

 

프로그래머들은 일반적으로 객체를 출력하거나, 정보를 볼 때 아래와 같이 코딩한다.

 

public class ToStringTest {

	private String name;
	
	public static void main(String[] args) {
		
		ToStringTest testObj = new ToStringTest();
		
		System.out.println("ToStringTest info.: " + testObj);
	}
}

 

println 뿐만 아니라 문자열 연산, assert 등에서도 호출 되기 때문에 한번 재정의 해놓으면 다양한곳에서 사용될 수 있다.


- 어떤 정보를 반환해야 하는가?

toString 을 재정의할 때 반드시 객체 내의 모든 정보를 반환해야할 필요는 없다. 객체가 아주 크거나 문자열로 표현하기 난해한 정보도 존재하기 때문에 중요정보만 반환하면 된다.

 

이렇게 toString 에서 반환할 정보를 결정했다면 해당 형식을 문서화 할 것인지 생각해보아야 한다. 대부분의 값 클래스 같은 경우 문서에 형식을 명시해주고 있다. 무조건 명시를 해주는것이 좋을 것 같지만 만약 명시를 하고 난 뒤 해당 클래스가 널리 사용되고 있을 때 반환할 정보를 변경해야 한다면 난감해진다. 어떤 사용자들은 해당 문자열의 정보를 파싱해서 사용하고 있을 수도 있기 때문이다.

 

형식을 남기는것은 때에 따라 다르지만 형식을 남기는 유무와 상관없이 의도는 기술해주는것이 좋다. 이럴 경우 어떤 정보에 대한 문자열을 반환하며 형식은 변할 수 있고 대략적으로 어떤 정보를 반환하는지정도는 써주는것이 좋다.


- 접근자 제공범위

toString 을 재정의하면서 제공하는 정보들은 그에 대한 접근자를 제공해주는 것이 좋다. toString 에는 있는 정보인데 해당 접근자(getter)를 제공해주지 않으면 사용자는 해당 문자열을 파싱해서 사용하기 시작한다. 이는 성능상의 문제 뿐만 아니라 오류가 발생할 가능성이 커지므로 toString 에서 반환하는 정보에 대한 접근자는 제공해주도록 하자.

댓글