메서드 체이닝(Method Chaining)이란?
메서드 체이닝은 동일한 객체에 대해 여러 메서드를 연속으로 호출하는 프로그래밍 기법입니다. 핵심은 객체 참조를 딱 한 번만 사용한다는 점입니다. 코드가 간결해지고 가독성이 크게 향상되어 pandas, jQuery 등 다양한 라이브러리에서 널리 활용됩니다.
예를 들어, bar와 baz라는 두 개의 메서드를 가진 Foo 클래스가 있다고 가정해 보겠습니다.
foo = Foo()
체이닝 없이 호출하는 경우
메서드 체이닝을 사용하지 않으면, 객체 foo에서 두 메서드를 모두 호출하려면 다음과 같이 각각 따로 작성해야 합니다.
foo.bar() foo.baz()
메서드 체이닝을 사용하는 경우
반면 체이닝을 적용하면 다음처럼 한 줄로 깔끔하게 처리할 수 있습니다.
foo.bar().baz()
이렇게 하면 bar()가 반환하는 값을 대상으로 곧바로 baz()가 호출되는데, 이것이 가능한 이유는 각 메서드가 객체 자기 자신(self)을 반환하기 때문입니다.
Python으로 구현하는 메서드 체이닝
Python에서 메서드 체이닝은 매우 간단하게 구현할 수 있습니다. 핵심은 각 메서드 마지막에 return self를 추가하여 자기 자신을 반환하는 것입니다.
class Foo(object):
def bar(self):
print("Foo.bar called")
return self
def baz(self):
print("Foo.baz called")
return self
foo = Foo()
foo2 = foo.bar().baz()
print(" id(foo):", id(foo))
print("id(foo2):", id(foo2))실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
Foo.bar called Foo.baz called id(foo): 87108128 id(foo2): 87108128
동작 원리 정리
출력 결과에서 주목할 점은 id(foo)와 id(foo2)가 완전히 동일한 값이라는 것입니다. 이는 체이닝 과정에서 새로운 객체가 생성된 것이 아니라, 처음 생성한 foo 객체 그대로 계속 사용되었음을 의미합니다.
정리하면 다음과 같습니다.
- 각 메서드는 작업을 수행한 후
return self로 자기 자신을 반환합니다. - 반환된 객체에 대해 다음 메서드가 곧바로 호출되므로 참조 변수 없이 연속 호출이 가능합니다.
- 최종 결과도 같은 객체이므로 메모리 관점에서 효율적입니다.
이처럼 메서드 체이닝은 빌더 패턴(Builder Pattern)이나 설정 옵션을 연속적으로 지정하는 API 설계에서 특히 유용하게 활용됩니다.