[Design Pattern] Adapter Patter
Adapter Pattern은 wrapper라고도 많이 불립니다. 어댑터라는 용어는 많이 들어보셨을 겁니다. '돼지코' 를 크게 예로 들 수 있을텐데요. 위키피디아에 설명된 정의는 아래와 같습니다.
어댑터 패턴(Adapter pattern)은 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해준다.
Adapter 패턴은 기존에 지원하는 인터페이스 이외 다른 인터페이스 형태로 맞춰주기 위해 자주 사용됩니다. 클라이언트가 사용하는 타겟 인터페이스와 다른 인터페이스를 제공하는 모듈을 사용하고자 할 때 중간에 Adapter를 추가하여 기존에 사용하던 인터페이스와 동일한 형태로 제공받아 사용할 수 있습니다.
클라이언트는 어댑터를 타겟 인터페이스를 사용하기 위해 어댑터의 메소드를 호출하는 방식으로 사용하고 어댑터는 하나 또는 그 이상의 메소드 콜을 이용해 클라이언트의 요청을 처리합니다. 클라이언트는 어댑터가 변환해준 결과를 받게되지만 내부에 대해선 전혀 알지 못합니다.
Client -> Target Interface -> Adaptee Interface
다시 정리하면 어댑터 패턴은 클라이언트가 사용하려는 툴킷이나 라이브러리가 호환이 되지 않을 때나 라이브러리의 권한이 없어 수정할 수 없는 경우 어댑터 패턴을 사용하여 클라이언트에서 사용할 수 있습니다. 만약 라이브러리 수정 권한이 주어져있다고하여도 안정화된 라이브러리에 대해 코드 수정은 불필요하며 좋지 않은 결과를 야기시킬 수 있기에 어댑터 패턴을 사용합니다.
어댑터는 클래스 어댑터와 오브젝트 어댑터 두 부분으로 생각할 수 있습니다.
위는 클래스 어댑터의 클래스 다이어그램입니다. 클래스 어댑터는 다중상속을 지원하는 언어에서 주로 사용하는데요, Adapter 클래스가 Target과 Adaptee 클래스를 모두 상속받고 있습니다. 그럼으로 타겟 인터페이스의 메소드를 Adapter 내에서 쉽게 구현할 수 있습니다.
위는 오브젝트 어댑터의 클래스 다이어그램입니다. Composition과 Delegation을 이용합니다. Adapter는 Target Interface를 Implements 하고 Adaptee에 대해 Composition 관계 가짐으로써 Adapter는 Adaptee에 대한 메소드 콜로 Wrapping됩니다.
메소드 네임이나 아규먼트가 변경되는 수준은 매우 단순한 어댑터가 될 수 있지만, 그 외 복잡한 어댑터가 구현될 수 있습니다. 지금까지 말씀드린건 단방향의 어댑터인데요, 양방향의 복잡한 어댑터 구조도 충분히 가능합니다.
마지막으로 정리한다면 어댑터 패턴은 서로 상이한 인터페이스를 가진 클래스들이 서로 협력하지 못하고 한 쪽 클래스에 맞춰 변경이 어려운 경우 클라이언트가 중간에 어댑터를 둠으로써 쉽게 사용할 수 있도록 지원하는 것입니다.
감사합니다.