본문 바로가기

프로그래밍언어/Java

[Java 중급] 메서드 체이닝 - Method Chaining

메서드 체이닝 - Method Chaining


메서드 체이닝에 대해서 코드를 통해서 알아보자. 

public class ValueAdder {

    private int value;

    public ValueAdder add(int addValue) {
        value += addValue;
        return this;
    }

    public int getValue() {
        return value;
    }
}

 

=> 단순히 값을 누적해서 더하는 기능을 제공하는 클래스이다. 

자기 자신(this)의 참조값을 반환한다. 

 

public class MethodChainingMain1 {

    public static void main(String[] args) {
        ValueAdder adder = new ValueAdder();
        adder.add(1);
        adder.add(2);
        adder.add(3);

        int result = adder.getValue();
        System.out.println("result=" + result);
    }
}

=> 실행결과 6이 나온다. 이번에는 ValueAdder 메서드의 반환값을 사용해보자. 

 

public class MethodChainingMain2 {

    public static void main(String[] args) {
        ValueAdder adder = new ValueAdder();
        ValueAdder adder1 = adder.add(1);
        ValueAdder adder2 = adder.add(2);
        ValueAdder adder3 = adder.add(3);

        int result = adder3.getValue();
        System.out.println("result=" + result);

        System.out.println("adder=" + adder);
        System.out.println("adder1=" + adder1);
        System.out.println("adder2=" + adder2);
        System.out.println("adder3=" + adder3);
    }
}

=> 이번에도 결과는 6이 나온다.  참조값을 확인해보자. 

 

=> 자기 자신을 반환하므로 참조값이 모두 똑같다. 

처음 방식보다 불편하고, 코드도 잘 안읽힌다. 왜 이런 방식을 사용하는걸까?

int result = adder.add(1).add(2).add(3).getValue();

add() 메서드를 호출하면 ValueAdder 인스턴스 자신의 참조값이 반환된다. 이 반환된 참조값을 변수에 담아두지 않아도 되나. 대신에 반환된 참조값을 즉시 사용해서 바로 메서드를 호출할 수 있다. 

메서드 호출의 결과로 자기 자신의 참조값을 반환하면, 반환된 참조값을 사용해서 메서드 호출을 계속 이어갈 수 있다. 이러한 기법을 메서드 체이닝이라 한다. 

 

메서드 체이닝 방식은 메서드가 끝나는 시점에 바로 .을 찍어서 변수명을 생략할 수 있다. 

메서드 체이닝이 가능한 이유는 자기 자신의 참조값을 반환하기 때문이다. 메서드 체이닝을 사용하면 코드를 간결하게 작성할 수 있다. 

 

StringBuilder와 메서드 체인(Chain)


StringBuilder는 메서드 체이닝 기법을 제공한다. 

append() 메서드를 보면 자기 자신의 참조값을 반환한다. 

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

 

이전에 만들었던 StringBuilderMain 코드를 살펴보자. 

StringBuilder sb = new StringBuilder();
sb.append("h");
sb.append("e");
sb.append("l");
sb.append("l");
sb.append("o");

 

다음과 같이 변경할 수 있다. 

StringBuilder sb = new StringBuilder();
sb.append("A").append("B").append("C").append("D")
			.insert(4, "Java")
            .delete(4, 8)
            .reverse()
            .toString();

 

 

 

 

* 인프런 '김영한의 실전 자바 - 중급 1편'을 참고하여 작성하였습니다.