본문 바로가기
Effective JAVA 2판

Item10 toString은 항상 재정의하라

by BroBroBro 2015. 4. 27.
커피주문을 하면 커피를 만들어주고 싶다고 했을때, 생성된 커피는 커피가 무슨종류인지(아메리카노, 카페라떼) 그리고 샷추가의 정보가 들어있다고 할때 아래와 같이 만들어봣다.
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package org.effectivejava.examples.chapter03.item10;
 
public class CoffeeToString10 {
  private final String coffee;
  private final int shots;
  CoffeeToString10(String coffee, int shot){
    this.coffee = coffee;
    this.shots = shot;
  }
  @Override
  public String toString(){
    String mark="+";
    for(int i =1;i<shots;i++){
      mark +="+";
    }
    return String.format("(%s)%s", mark,coffee);
  }
  public String toString2(){
    return super.toString();
  }
  
  public static void main(String[] args) {
    CoffeeToString10 orderCoffee = new CoffeeToString10("lattee"2);
    System.out.println(orderCoffee.toString2());
    System.out.println(orderCoffee.toString());
    System.out.println(orderCoffee);
  }
}
cs

결과를 보도록 하자.
1
2
3
Result : org.effectivejava.examples.chapter03.item10.CoffeeToString10@17db660
2)lattee
2)lattee
cs
12 라인은 재정의를 해서 이쁘게 나온다.

하지만 15라인은 재정의를 안한 super 즉 Object의 Method toString이다. 
패키지명을 포함한 Class의 이름과 @ 그리고 hash값을 기본적으로 보여주고있다.
아래의 코드를 충실히 수행하고있는거다.

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

보통은 + 표시로 샷추가를 표시한다면 아래와 같은코드가 더 적합할것이다. 가능하다면 아래의 코드만 보고 결과가 어떻게 출력될지 한번 생각해보자...??(귀찮죠?)

1
2
3
4
5
6
7
8
 @Override
  public String toString(){
    String mark="+";
    for(int i =1;i<shot;i++){
      mark +="+";
    }
    return String.format("(%s)%s", mark,coffee);
  }
cs


책에서는 이런 이야기들을 하고 있다.

-toString을 잘 만들어 놓으면 클래스를 좀 더 쾌적하게 사용할 수 있다.
-가능하다면 toString메서드는 객체 내의 중요 정보를 전부 담아 반환해야한다.
-toString이 반환하는 문자열에 포함되는 정보들은 전부 프로그래밍을 통해서 가져올 수 있도록(programmatic access)하라.
위예제에서 shot, coffee등을 개별적으로 가져올수있게 하라는 간단한 이야기이다.

equals와 hashCode의 일반 규약을 지키는 것보다는 덜 중요하지만 쾌적하덴다...쾌적....사용하자...


ps. prims의 highlight기능을 써서 code를 이쁘게 보일려고 posting를 오랜만에 해본다. 근데 뭔가 꺽쇠(<) 라던가 암튼 이모저모 불편하네? 코드는 이쁘게 보이는군^^;;
http://colorscripter.com 이걸로 바꾸었더니 훨씬더 편하네요^^ ~! ㅎㅎㅎ 설치도 필요없고^^~!