어댑터 패턴 (Adapter Pattern)

이번 시간부터 드디어 구조 개선을 위한 패턴들을 배워보도록 하겠습니다.
첫번째로 Adapter 패턴이네요.

2. 구조 개선을 위한 디자인 패턴
    ㅇ Adapter 패턴
ㅇ Bridge 패턴
    ㅇ Composite 패턴
    ㅇ Decorator 패턴
    ㅇ Facade 패턴
    ㅇ Flyweight 패턴
    ㅇ Proxy 패턴

여러분은 어댑터(Adapter)라는 용어를 많이 들어보셨을 겁니다. 기존의 무언가를 새로운 무언가와 함께 사용하기 위해 변환 과정을 중간에서 처리해주는 역할을 하는 것이죠. 부품 중에도 아답터라고 많이 사용하죠.

디자인 패턴에서도 어댑터는 같은 의미로 사용됩니다.
즉, Adapter 패턴은 "이미 개발되어 있는 모듈을 신규 기능에 재사용하기 위해 Adapter Class 를 이용하는 방식 - 기존 모듈을 재사용하는 방식에 대한 패턴"입니다.

프로젝트를 하다보니 신규기능에 대한 요청을 받았습니다.
그런데, 유사한 기능을 가진 모듈을 이미 다른 개발자가 개발해놓았네요. 그래서, 시간을 절약하기 위해 이 모듈을 재사용하기로 결정을 했습니다.
그런데, 난관이 하나 있네요.
내가 추가하려는 모듈과 기존 모듈의 인터페이스가 서로 다릅니다.
이럴 때 기존 모듈을 변경해달라고 하면 당연히 쉽지 않은 경우가 대부분입니다.
개발자의 사람 됨됨이가 안되서 거부하는 경우도 있을테고, 해당 인터페이스를 수정하면 다른 부분들에 줄줄이 파급이 되기 때문에 안되는 경우도 있을 것입니다.

이럴 때의 해결방법은 세가지입니다.

  1. Client 에서 알아서 상황을 판단하여 추가적인 기능이 필요할 때는 인터페이스를 달리하여 기존 모듈을 호출하는 방법
  2. Adater Class 모듈을 중간에 끼워넣어 Client 는 기존의 인터페이스로 계속 사용할 수 있게 하고 Adapter Class 내부에서 상황에 따라 변환 호출하는 방법 (Object Adapter 패턴)
  3. 양쪽 Class 모듈을 모두 상속한 Adapter Class 를 이용하는 방법 (Class Adapter 패턴)

첫번째는 누구나 생각할 수 있지만 가장 비효율적인 방법이겠죠.
Client 가 짜증을 좀 낼 것이고 확장성도 떨어집니다.

위에서 언급한 2 번과 3 번이 Adapter 패턴을 적용하는 2 가지 방식이 되겠습니다.
각각 어떤 방법인지 Class Diagram 을 통해 알아보죠.

첫번째 그림이 위의 2 번에 해당하는 Object Adapter 패턴입니다.
즉, Adapter Class 내에 Adaptee 를 가리키는 객체를 데이터 멤버(adaptee)로 가지고 있다가 필요할 때 호출해서 사용하는 방식입니다.

다음 그림은 Adapter Class 가 Target 및 Adaptee Class 를 다중상속해서 사용하는 Class Adapter 패턴 방식입니다.

책에 나온 아래 아래 그림이 위의 2 가지 경우를 아주 잘 설명해줄 수 있겠습니다.
제가 예제를 생각하려다가 잘 생각이 나지 않아서 책의 그림을 그대로 이용하였습니다.
아래 그림 중 [9-2] 가 Object Adater 패턴의 예이고 [9-3] 이 Class Adapter 패턴의 예입니다.
그래픽 편집기를 개발하고 있는 상황에서 기존에는 없던 Text 처리 기능을 기존의 Line 이나 Rectangle 처럼 똑같이 처리할 수 있도록 해달라고 사용자에게서 요구가 들어왔습니다.
그런데, 기존 모듈 중에서 인터페이스는 다르지만 TextView 라는 Class 가 있어서 이를 재사용하기로 결정하였습니다.

위에서 TextShape 이 Adapter 가 되고 TextView 가 Adaptee 가 되겠네요.
첫번째 그림에서는 TextShape 이 TextView 객체인 pText_ 를 가지고 있는 것을 볼 수 있습니다.
TextView 의 기능이 필요할 때는 이 객체를 통해 TextView Class 의 함수(GetExtent)를 호출하여 사용하는 것이죠.

두번째 그림에서는 TextShape Class 가 TextView Class 를 private 으로 상속하였음을 보여줍니다. 보통 기존 class 에 대한 사용은 외부에 노출할 필요가 없기 때문에 이렇게 private 으로 상속하는 것이 좋습니다.

자... 사용자는 아무런 변화없이 BoundingBox() 인터페이스 하나로 기존의 TextView 에 있던 기능까지 사용할 수 있게 되었습니다.

 

 

You may also like...

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x