디자인 패턴

Adapter Pattern

내일도무사히 2022. 2. 25. 10:39

 

해당 책을 통해 공부한 내용을 정리하고 있습니다.

 


 

어댑터 패턴은 말 그대로 ‘어댑터’ 기능을 수행한다. 그렇다면 어댑터라는건 무엇일까? 어댑터는 흔히 생각하는 ‘돼지코’를 생각하면 편하다.

돼지코

 

 위 사진의 돼지코는 유럽이나 일본 등의 해외 가전을 구매할 때 전압을 변환시켜주는 기능을 하는 가전이다. 다른 기능은 하지 않고 오로지 ‘호환되지 않는’ 전압을 ‘호환 되도록’ 변환 시켜주는 기능을 하는게 어댑터의 역할이다.

 

 

 어댑터 패턴의 역할 또한 같다. 위와 같이 A라는 시스템이 있고 여기에 추가해야 하는 서브시스템인 B라는 시스템이 있다고 생각해보자. 이처럼 생긴 시스템들을 연결 할 인터페이스가 맞지 않는다고 할 때, 한 시스템을 다른 시스템에 맞추는 방법도 있겠지만, 노동이 많이 들어갈 것이다. 이를 아래와 같은 어댑터 패턴을 통해 해결 할 수 있다.

 

 

 위의 예제에서 A는 클라이언트, B는 어댑티라고 한다.

 

 

 


UML과 구현

책에서 소개하는 어댑터 패턴의 정의는 다음과 같다.

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

Adapter pattern - from: wikipedia

 

UML과 정의만 보고 이해하기 어려우니 바로 코드로 들어가보자.

class Client {
  Target target;

  ...

  void doSomething() {
    target.operation();
  }
}
class Adaptee {
  void specificOperation() {...} 
}
interface Target {
  public void operation();
}
class Adapter implements Adaptee {
  Adaptee adaptee;

  public Adaptee(Adaptee a) {
    this.adaptee = a;
  }

  public void operation() {
    adaptee.specificOperation();
  }
}

바로 위의 코드인 Adapter 코드를 보면 어떤 일을 해야하는 operation()이 들어왔을 때, 어댑터에서 특별한 처리를 하지 않고, adaptee에게 일임하는 것을 볼 수 있다. 이를 통해 클라이언트와 어댑티의 인터페이스를 호환시켜 줄 수 있다.

 


어댑터 패턴과 데코레이터 패턴의 차이

어댑터 패턴과 데코레이터 패턴은 어떠한 Wrapper로 클래스를 감싸고, 특정 행동을 한다는 유사성을 가진다. 하지만 큰 차이가 있는데, 데코레이터 패턴이 Wrapper로 감싼 뒤에 추가적인 행동을 하지만, 어댑터 패턴은 인터페이스 변환만 시켜줄 뿐 추가적인 일을 하지는 않는다.

 

 

 


Reference

 

https://www.youtube.com/watch?v=2PKQtcJjYvc