[디자인패턴] 구조패턴(1) - Adapter Pattern (어댑터 패턴)

Study/Software Architecture · 2023. 5. 22. 23:24

디자인 패턴 총정리 시리즈의 여섯 번째 패턴은 Adapter Pattern입니다.

 

소프트웨어를 설계할 때 종종 호환되지 않는 두 개 이상의 컴포넌트를 연결해야 할 일이 발생합니다. Adapter 패턴은 이러한 상황에서 호환되지 않는 컴포넌트 인터페이스 간 bridge 역할을 할 수 있습니다. 이러한 특징은 서로 다른 파트에서 개발한 소프트웨어를 연결하여 프로그램을 수성할 때 원할한 협업을 가능하게 해주는 장점을 가집니다.

 

해당 게시물에서 이러한 Adapter 패턴에 대한 간단한 개념과 사용 예시, 장/단점을 알아보겠습니다.

 

1. 개요

Prototype 패턴은 호환되지 않는 클래스 간에 가교 역할을 하는 중개자입니다. 해당 패턴은 한 클래스(Adaptee)의 인터페이스를 다른 클래스(Target)에 호환될 수 있도록 하는 인터페이스로 변환해줍니다.

 

해당 패턴은 Adapter, ConcreteAdapter, Adaptee, Client 4가지 주요 컴포넌트로 구성되어 있습니다.

 

 

 

2. 예시 - Car Factory

다음은 Adapter 패턴을 사용하여 특정 인쇄 방법(Legacy)을 가진 Printer 클래스를, Document 클래스와 통합하는 시나리오를 생각해보겠습니다. 

// Target interface
class Document {
public:
    virtual void print() = 0;
};

// Adaptee class with incompatible interface
class Printer {
public:
    void printLegacy() {
        // Legacy printing implementation
    }
};

// Adapter class
class PrinterAdapter : public Document {
private:
    Printer* printer;

public:
    PrinterAdapter(Printer* p) : printer(p) {}

    void print() override {
        printer->printLegacy();
    }
};

// Client code
int main() {
    Printer legacyPrinter;
    PrinterAdapter adapter(&legacyPrinter);
    
    Document* doc = &adapter;
    doc->print();
    
    return 0;
}

PrinterAdapter 클래스는 Document 클래스를 상속 받고, Printer 클래스 인스턴스를 멤버 변수로 갖고 있습니다.

이때 PrinterAdapter 클래스는 print 메서드 내부에 Printer 클래스의 메서드를 구현하여, Document 클래스에서 Printer 클래스의 메서드를 사용할 수 있는 인터페이스를 제공합니다.

 

3. 장점

Interface compatibility: Adapter 패턴을 사용하면 호환되지 않는 인터페이스를 가진 컴포넌트를 원활히 연결할 수 있습니다.

Reusability: Adapter 패턴을 사용할 때 어댑터 클래스를 재사용하여 다양한 종류의 어댑터를 동일한 대상 인터페이스에 적용하여 활용할 수 있습니다.

Modularity: Adapter 패턴은 어댑터 내의 로직을 캡슐화 하여 코드 모듈화 및 유지 보수성을 높일 수 있습니다.

 

4. 단점

Increased complexity:  어댑터가 늘어감에 따라 코드가 복잡해질 수 있습니다.

Runtime overhead: Adapter 패턴은 메서드 호출 로직이 변하기 때문에 프로그램에 약간의 부하가 추가될 수 있습니다. (PrinterAdapter 클래스에 print 메서드 내부에 Print 클래스의 메서드를 가져온 부분!)

 

5. 결론

Adapter 패턴은 호환되지 않는 서로 다른 컴포넌트의 인터페이스를 통합하기 위한 방법을 제공할 수 있습니다. 해당 패턴을 사용하면 개발자는 기존 코드를 변경하지 않고, 서로 다른 클래스 간에 원활한 bridge를 만들어 줄 수 있습니다. 

반응형