본문 바로가기

프로그래밍/디자인패턴

[디자인패턴] 어댑터 패턴 (Adapter Patten)


어댑터 패턴이란,





A는 원래 존재하던 클래스 혹은 시스템입니다. 이것을 클래스 B에 적용시키려고 했더니 인터페이스가 달라 호환이 복잡해지게 생겼습니다. A와 B클래스는 변경이 불가능하고 둘은 연결시켜야 합니다. 어떻게 해야할까요?


이때 두 클래스를 연결시키려고 사용하는 것이 어댑터입니다. 


정의는 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환하는 것으로 어댑터를 이용해 인터페이스 호환성 문제때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있습니다.



쉬운 예로 들어봅시다. 예전에는 모두 아날로그 방송이였습니다. 하지만 지금은 디지털 방송으로 바뀌었지요? 디지털 방송을 예전 티비로 보기위해선 SetTop Box를 설치해야 합니다. 이 SetTop Box가 어댑터로 아날로그 티비와 디지털 방송을 호환되게 하는 기기입니다.



어댑터 패턴에는 크게 2가지 종류가 있습니다. 

하나는 클래스 어댑터 패턴이고, 다른 하나는 객체 어댑터 패턴입니다.



먼저 클래스 어댑터 패턴의 코드를 




cShape, cRectangleView, cRectangle 세 개의 클래스가 있습니다.


클래스 어댑터 패턴을 쓰려면 다중 상속으로 어댑터를 만들 때 Target( 우리가 사용할 클래스 : cShape)과 Adaptee(적용될 클래스 : cRectangleView) 모두를 상속받습니다. 



어댑터는 Target을 사용해 메소드를 호출해 어댑터를 사용합니다. 어뎁터는 Adpatee를 사용하여 호출된 메소드를 변환해주기때문에 값 호출이 가능한 것입니다.



다음은 객체 어댑터 클래스입니다. 




달라진 부분은 Target인 cShape은 상속받고, Adaptee인 cRectangleView는 포함해 필요한 요청을 전달한다는 것입니다.


객체 어댑터는 포함을 사용하기 때문에 해당 Adaptee 클래스 뿐만 아니러 그 하위 클래스에 대해서도 어댑터 역할을 할 수 있어 보다 유연한 코드가 됩니다. 반면에, 클래스 어댑터 패턴에서는 cRectangle은 Adaptee의 하위 클래스이기 때문에 메소드를 오버라이드 할 수 있습니다.




어댑터 패턴을 퍼사드 패턴과 비교해보면, 

어댑터는 하나 이상의 클래스의 인터페이스를 클라이언트가 요구하는 (우리가 사용할 수 있게) 인터페이스로 변환합니다. 퍼사드도 여러 클래스를 감싸야하는 것은 아닙니다.


둘의 차이는 감싸는 클래스의 개수가 아니라 용도에 있습니다.

어댑터 패턴은 인터페이스를 변경해 클라이언트에서 필요로 하는 인터페이스로 만들기 위한 용도이고, 퍼사드 패턴은 하위 클래스에 의해 보다 간단한 인터페이스를 제공하기 위함입니다.