Design Pattern | Adapter Pattern (아답터 패턴)

Adapter 패턴이란?

  • Adapter라는 영어 단어는, 적합시키는 것이라는 의미가 된다.
  • Adapter 패턴은, 이미 제공되고 있는 것을 그대로 사용할 수 없는 것에 대해, 필요한 형태로 변환해 이용하기 위한 방식이다. 즉, 인터페이스의 변경하기 위한 방식이다.
  • 어댑터는 볼트 수가 맞지 않을 때 중간에 연결해주는 돼지코를 생각하면 된다.
  • 패턴도 양쪽에 서로 맞지 않은 인테페이스가 있다면 이 둘 간에 연결시켜줄 수 있는 Bridge를 만들어 주면 된다.
  • 상속을 이용한 방법과 위임을 이용한 방법이 있다.
    • 클래스에 의한 Adapter Pattern
      • 상속을 이용한 Adapter Pattern이다.
    • 인스턴스에 의한 Adapter Pattern
      • 위임을 사용한 Adapter Pattern이다.
  • 래퍼 패턴 이라고도 하다. 래퍼는 감싸는 것을 의미하다.
  • GoF의 디자인 패턴에서는 구조와 관련된 디자인 패턴으로 분류된다.

Adapter 패턴 예제 프로그램

학생의 이름과 나이를 표시하는 예제 프로그램이다.

1. 클래스 상속을 이용한 방법

Class Diagram
Adapter Pattern Class Diagram

1-1. Human 클래스

원래 제공된 클래스이다.

Human.java

package com.devkuma.designpattern.structural.adapter.ex1;

public class Human {

    private String name;
    private int age;

    public Human(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void printName() {
        System.out.println(name);
    }

    public void printAge() {
        System.out.println(age);
    }
}

1-2. Student 인터페이스

필요한 인터페이스이다.

Student.java

package com.devkuma.designpattern.structural.adapter.ex1;

public interface Student {
    void showName();

    void showAge();
}

1-3. HumanAdapter 클래스

Adapter 역할이 되는 클래스입니다.

HumanAdapter.java

package com.devkuma.designpattern.structural.adapter.ex1;

public class HumanAdapter extends Human implements Student {

    public HumanAdapter(String name, int age) {
        super(name, age);
    }

    public void showName() {
        printName();
    }

    public void showAge() {
        printAge();
    }
}

1-4. Main 클래스

메인 처리를 실행하는 클래스이다.

Main.java

package com.devkuma.designpattern.structural.adapter.ex1;

public class Main {
    public static void main(String[] args) {
        Student student = new HumanAdapter("devkuma", 25);
        student.showName();
        student.showAge();
    }
}

1-5. 실행 결과

devkuma
25

2. 위임을 이용한 방법

Adapter Pattern Class Diagram

2-1. Human 클래스

원래 제공된 클래스이다.

Human.java

package com.devkuma.designpattern.structural.adapter.ex2;

public class Human {

    private String name;
    private int age;

    public Human(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void printName() {
        System.out.println(name);
    }

    public void printAge() {
        System.out.println(age);
    }
}

2-2. Student 인터페이스

필요한 인터페이스이다.

Student.java

package com.devkuma.designpattern.structural.adapter.ex2;

public interface Student {
    void showName();

    void showAge();
}

2-3. HumanAdapter 클래스

Adapter 역할이 되는 클래스이다.

HumanAdapter.java

package com.devkuma.designpattern.structural.adapter.ex2;

public class HumanAdapter implements Student {

    private Human human;

    public HumanAdapter(String name, int age) {
        this.human = new Human("田中", 25);;
    }

    public void showName() {
        human.printName();
    }

    public void showAge() {
        human.printAge();
    }
}

2-4. Main 클래스

메인 처리를 실행하는 클래스이다.

Main.java

package com.devkuma.designpattern.structural.adapter.ex2;

public class Main {
    public static void main(String[] args) {
        Student student = new HumanAdapter("devkuma", 25);
        student.showName();
        student.showAge();
    }
}

2-5. 실행 결과

devkuma
25

Adapter 패턴의 장점

Adapter 패턴은 기존 클래스에 가죽을 씌우고 필요한 클래스를 만든다. 이 패턴을 사용하면 필요한 메소드 그룹을 신속하게 만들 수 있다.
만약 버그가 검출되었다고 해도, 기존의 클래스가 충분히 테스트되고 있다면, Adapter역의 클래스를 중점적으로 조사하면 좋게 되므로, 프로그램의 체크가 편해진다.
또한 Adapter 패턴을 사용하면 기존 클래스에 손을 추가하지 않고 기능을 구현할 수 있으므로 기존 클래스를 다시 테스트하는 번거로움을 줄일 수 있다.