Home 구조패턴 - 어댑터 패턴
Post
Cancel

구조패턴 - 어댑터 패턴

Adapter Pattern

디자인 패턴이란?

디자인 패턴이란?

  • 디자인 패턴은 소프트웨어 공학의 소프트웨어 설계에서 공통으로 발생하는 문제를 자주 쓰이는 설계 방법을 정리한 패턴이다.
  • 디자인 패턴을 참고하여 개발하면 효율성과 유지보수성, 운용성이 높아지며, 프로그램 최적화가 된다고 한다.  

디자인 패턴을 목적과 범위로 나눌수 있다

구분유형설명
 생성객체 인스턴스 생성에 관여, 클래스 정의와 객체 생성 방식을 구조화, 캡슐화를 수행
목적구조더 큰 구조 형성 목적으로 클래스나 객체의 조합을 다루는 패턴
 행위클래스나 객체들이 상호작용하는 방법과 역할 분담을 다루는 패턴
범위클래스클래스간 관련성(상속), 컴파일 시 정적으로 결정
 객체객체 간 관련성을 다루는 패턴, 런타임 시 동적으로 결정

 

기존의 시스템에 새로운 써드파티 라이브러리를 추가하거나 레거시 인터페이스를 새로운 인터페이스로 교체하는 경우 다른 인터페이스를 자신의 인터페이스 스타일로 변경하겠다.

Facade 패턴과의 차이: 복잡한 기능을 중간에서 감추고 심플하게 단방향 통신하겠다

어댑터 패턴이란?

해외 여행 어댑터

우리가 해외여행을 가면 220V를 110V에 바로 전기를 꼽지못하지만 사용할 수 있도록 도와주는 친구가 어댑터다.
이 개념을 똑같이 코드에 가져가서 생각하면된다.

상황

img

Object 어뎁터

Client는 Target 인터페이스를 구현한 Adaptee가 필요하다.
Adaptee는 Target인터페이스를 구현하지 않고 있다.
Adaptee는 이미 개발이 완료되어 사용중이다.
Adaptee를 변경하는 것이 적절하지 않은 상황이다.

1
2
3
4
5
6
7
8
9
10
// Adaptee는 이미 개발이 완료되어 사용중이고 변경하는 것이 적절하지 않음.
public interface Plugin {
    public void connect();
}

public class Plugin220V implements Plugin {
    @Override
    public void connect() {
        System.out.println("220V");
    }

해결 방법 (많은 사람들이 사용하는 방식인 Object Adapter 방식으로 구현)
대부분의 코드를 구현해야하지만 Composition을 사용하기에 유연함으로 많은사람이 채택함.
Adapter

1
2
3
4
// 어뎁터 클래스를 만든다.
public interface PluginAdapter {
    public void connect();
}

client

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Adapter110V implements PluginAdapter {
    private Plugin plugin;
	
    public Adapter110V(Plugin plugin) {
        this.plugin=plugin;
    }
    
    @Override
    public void connect() {
        System.out.println("110v convert");
        this.plugin.connect();
    }

//main
public class AdapterPattern {
    public static void main(String[] args) {
        PluginAdapter plugin = new Adapter110V(new Plugin220V());
        plugin.connect();
    }
}

기존에 생성된 클래스를 재사용할 수 있도록 중간에서 맞춰주는 역할을 하는 인터페이스를 만드는 패턴으로써
상속을 이용하는 클래스 패턴과 위임을 이용하는 인스턴스 패턴의 두 가지 형태로 사용되는 디자인 패턴이다.
인터페이스가 호환되지 않는 클래스들을 함께 이용할 수 있도록 다른 클래스의 인터페이스를 기존 인터페이스에 덧씌운다.

Class 어댑터에서는 어댑터를 만들 때 타겟과 어댑티 모두의 서브 클래스로 만들고,
Object 어댑터 에서는 구성을 통해서 어댑티에 요청을 전달한다는 점을 제외하면 별다른 차이점이 없다

결론

변경할 수 없는 내부 구현, 라이브러리 등에 추가적인 기능을 만들고 싶을 때 유용하게 활용할 수 있다. 사용해야하는 인터페이스가 현재의 시스템과 호환되지 않는다고 해서 굳이 현존하는 시스템을 호환되도록 변경할 필요는 없다.

참고자료

Source Ⅰ
Head First 디자인패턴
면접을 위한 CS 전공지식노트

This post is licensed under CC BY 4.0 by the author.