Java Method Chaining

메소드 체이닝 실습부터 살펴본다.

실습 코드는 값을 누적해서 더하는 클래스만 있으며 add 메소드와 멤버변수 값을 반환하는 getter 메소드만 있다.

public class AddrValue {
    private int value;

    public AddrValue add(int add) {
        value += add;
        return this; // 나 자신을 반환한다.

    }

    public int getValue() {
        return value;
    }
}
  • add 메소드 호출마다 자신의 멤버변수로 값을 누적해서 더한다.
  • add 메소드 반환은 this 자신을 참조 값을 반환하고 있다.

새로운 클래스를 만들었으니 사용해보도록 한다.


public class Main {

    public static void main(String[] args) {
        AddrValue adder = new AddrValue();
        adder.add(1);
        adder.add(1);
        adder.add(1);
        System.out.println("result = " + adder.getValue());

        AddrValue adder2 = adder.add(1);
        AddrValue adder3 = adder.add(1);
        AddrValue adder4 = adder.add(1);
        System.out.println("result = " + adder4.getValue());
    }
}

result = 3
result = 6

실행 결과
첫 번째 3까지 누적 코드에서 메소드만으로 누적하여 출력한 것을 볼 수 있다.
두 번째 6까지 출력하는 코드 또한 AddrValue 변수로 선언하여 값을 누적하여 사용하였다. 사용에는 문제 없지만 코드가 간결하지 않고 읽히지 않아 가독성 문제가 있다.

다음으로 메소드 체이닝을 이용하여 출력 코드를 살펴본다.


public class Main {

    public static void main(String[] args) {
        AddrValue adder = new AddrValue();
        adder.add(1);
        adder.add(1);
        adder.add(1);
        System.out.println("result = " + adder.getValue());

        AddrValue adder2 = adder.add(1);
        AddrValue adder3 = adder.add(1);
        AddrValue adder4 = adder.add(1);
        System.out.println("result = " + adder4.getValue());

        int result = adder4.add(1).add(1).add(1).getValue();
        System.out.println("result = " + result);
    }
}

result = 3
result = 6
result = 9

int result = adder4.add(1).add(1).add(1).getValue();

세 번째는 add 메소드를 이어서 한줄로 한 것을 볼 수 있다. 끝으로는 getter 메소드를 불려와 실제 값을 result로 할당하였다.

이것이 가능한 원리는 add 메소드 반환을 객체 주소 반환하도록 this 키워드로 리턴한 것을 기억하자. 반환된 주소 값은 add 메소드를 다시 호출할 수 있고, 메소드를 연결할 수 있으므로 이어서 붙이는 형태가 된다.
이를 마치 체인처럼 엮어 메소드 체인닝이라 한다.

이전의 두 번째 누적한 코드보다 간결하고 읽기가 쉬워 가독성이 높아졌다.

자바에서 자주 사용되고 Builder 패턴에서 사용되므로 손에 익도록 한다.


StringBuilder

자바 기본으로 제공되는 클래스에서 StringBuilder의 append 메소드를 살펴보자.

public StringBuilder append(String str) {
    super.append(str);
    return this;
}

이 메소드 또한 리턴 값을 this 하고 있다. append() 뿐 아니라 insert(), delete(), reverse() 메소드도 마찬가지다.

다음 코드에서 StringBuilder 참고 예시이다.

public class Main {
    public static void main(String[] args) {
        String ret = new StringBuilder()
            .append("Hello? World")
            .insert(7, "Java ")
            .delete(5,6)
            .toString();
        System.out.println(ret);
    }
}

Hello Java World