Lee's Grow up

[디자인패턴/Design Pattern] Adapter 패턴 / 어뎁터 패턴 / Wrapper 패턴 본문

PROGRAMMING/디자인패턴

[디자인패턴/Design Pattern] Adapter 패턴 / 어뎁터 패턴 / Wrapper 패턴

효기로그 2019. 11. 21. 13:57
반응형

관련 내용은 [자바 언어로 배우는 디자인 패턴 입문]이라는 책의 공부 내용을 개인적으로 정리한 내용입니다.
처음 배우는 부분이기 때문에 틀린 부분이 있으면 지적해주시면 감사하겠습니다.

1. Adapter 패턴이란?


말 그대로 'adapt(개조)' 시키는 것으로, 220V의 한국 기기를 외국의 110V에서 쓸 수 있게 하는것 처럼
한 클래스의 인터페이스를 사용하고자 하는 다른 인터페이스로 변환할 때 주로 사용하며, 이를 이용하면 인터페이스 호환성이 맞지 않아 같이 쓸 수 없는 클래스를 연관 관계로 연결해서 사용할 수 있게 해주는 패턴입니다.

이번 포스팅에서는 2가지의 어댑터 패턴을 소개합니다.

  1. class에 의한 Adapter 패턴 ( 상속을 사용한 Adapter 패턴 )
  2. 인스턴스에 의한 Adapter 패턴 ( 위임을 사용한 Adapter 패턴 )

2. Adapter 패턴의 등장 인물


이번 포스팅에서 사용될 요소들의 역할입니다.

  • Target(대상)의 역할
    1. 지금 필요한 메소드를 결정합니다.
  • Client(의뢰자)의 역할
    1. Target 역할의 메소드를 사용해서 로직을 처리합니다.
  • Adaptee(개조되는 쪽)의 역할
    1. 이미 준비되어 있는 메소드를 가지고 있는 역할입니다.
    2. Adaptee역의 메소드가 Target 역할의 메소드와 일치하면 다음 Adapter의 역할은 필요 없습니다.
  • Adpater의 역할
    1. Adaptee 열할의 메소드를 사용해서 Target 역할을 만족시키기 위한 역할입니다.
    2. class에 의한 Adapter 패턴의 경우 '상속'을 사용한 Adaptee의 역할을 이용합니다.
    3. instance에 의한 Adapter 패턴의 경우 '위임'을 사용한 Adpatee의 역할을 이용합니다.
Adapter 패턴의 클래스 다이어그램

3. 예제 (1) 상속을 사용한 Adapter 패턴


앞서 설명한 2가지 방법중 상속을 사용한 Adapter 패턴에 대한 내용을 설명하겠습니다.

예제에 사용될 클래스 다이어그램

3-1-1. Banner 클래스

기존의 클래스입니다. 처음 설명에서 220V의 기기라고 생각하시면 됩니다. 즉 Adapter 패턴 클래스 다이어그램의 Adaptee에 해당합니다.

public class Banner {
    private String string;

    public Banner(String string) {
        this.string = string;
    }

    public void printBanner() {
        System.out.println("(" + string + ")");
    }
}

3-1-2. Print 클래스

Adapter가 구현해야할 인터페이스입니다. 즉 Adapter 패턴 클래스 다이어그램의 Target Interface에 해당합니다.

public interface Print {
    public abstract void printWeak();
    public abstract void printStrong();
}

3-1-3. PrintBanner 클래스

Adapter입니다. 즉 Adapter 패턴 클래스 다이어그램의 Adapter에 해당합니다.

Banner클래스를 상속 받았기 때문에 인스턴스 없이 printBanner()메소드를 사용할 수 있습니다.

public class PrintBanner extends Banner implements Print {
    public PrintBanner(String string) {
        super(string);
    }

    @Override
    public void printStrong() {
        // TODO Auto-generated method stub
        System.out.println("********************");
        printBanner();
        System.out.println("********************");
    }

    @Override
    public void printWeak() {
        // TODO Auto-generated method stub
        printBanner();
    }
}

3-1-4. Main 클래스

Adapter 패턴 클래스 다이어그램의 Client에 해당합니다.

public class Main {
    public static void main(String[] args) {
        Print p = new PrintBanner("Lee's Grow Up 디자인 패턴 공부입니다.");
        System.out.println("=== Weak배너 ===");
        p.printWeak();
        System.out.println("=== Strong배너 ===");
        p.printStrong();
    }
}
출력 결과
=== Weak배너 ===
(Lee's Grow Up 디자인 패턴 공부입니다.)
=== Strong배너 ===
********************
(Lee's Grow Up 디자인 패턴 공부입니다.)
********************

위와 같이 기존의 Banner클래스의 기존 메소드를 Banner클래스를 수정없이 변경해야할 경우 사용한다고 보시면 됩니다.

3. 예제 (2) 위임을 사용한 Adapter 패턴


위 코드에서 상속이 아닌 instance를 사용한 방식을 설명합니다.

내용은 간단합니다. 위 코드를 기준으로 adapter에 해당하는 Printbanner클래스를 조금 수정해주시면 됩니다.

public class PrintBanner implements Print {
    Banner banner ;
    public PrintBanner(String string) {
        banner = new Banner(string);
    }

    @Override
    public void printStrong() {
        // TODO Auto-generated method stub
        System.out.println("********************");
        banner.printBanner();
        System.out.println("********************");
    }

    @Override
    public void printWeak() {
        // TODO Auto-generated method stub
        banner.printBanner();
    }
}

위방식 처럼 상속이 아닌 인스턴스를 통해 메소드에 접근하는 방식이 차이점입니다.

그렇다면 사용 이유는 무엇일까?
  1. 위에도 설명했지만 이처럼 Adapter 패턴은 이미 존재하는 클래스, 특히 그 클래스가 충분한 테스트를 받아서 버그가 적으며, 실제로 지금까지 사용된 실적이 있다면 그 클래스를 새로 정의하는 행위보다, 해당 클래스를 부품으로써 재이용하기 위함입니다.
  2. Adapter 패턴은 기존 클래스를 개조해서 필요한 클래스를 만들기 때문에, 필요한 메소드를 빠르게 구현가능하고, 디버그도 새로 정의한 Adapter 클래스를 기준으로 하면 되기 때문에 비교적 복잡한 로직의 클래스에 새로운 기능을 추가해도 검사가 상당히 쉬워진다는 장점이 있습니다.

4. 관련 패턴


  1. Bridge 패턴 : Adapter처럼 서로 다른 클래스를 연결하는 패턴이 아닌, 기능의 계층과 구현의 계층을 연결시키는 패턴입니다.
  2. Decorator 패턴 : Adapter 패턴의 차이를 조정하기 위한 패턴, 인터페이스를 수정하지 않고 기능을 추가하는 패
    턴입니다. link

5. 비교하기


디자인 패턴을 배우다 보니까 Adapter , Decorator, Facade 가 얼핏 보면 비슷하다고 느낌이 들어서 차이점을 정리합니다.

  • Adapter : 관계가 없는 인터페이스(API)를 연결할 때 사용, 호환성 link
  • Decorator : 인터페이스(API)를 바꾸지 않고 기능을 추가. 확장성 link
  • Facade : 인터페이스(API)를 간편하게 사용. 간편함 link
반응형
Comments