Hello

[디자인 패턴] - Adapter

by 볼빵빵오춘기

Adapter

서로 다른 인터페이스를 가진 클래스들이 함께 동작할 수 있도록 중간에 '어댑터' 클래스를 두어 호환시켜주는 디자인 패턴이다. 즉, 호환되지 않는 인터페이스를 연결해주는 '변환기' 역할이다.

 

예제 코드

// 클라이언트가 원하는 인터페이스
interface Target {
    void request();
}

// 기존에 이미 만들어져 있는 클래스 (인터페이스가 다름)
class Adaptee {
    void specificRequest() {
        System.out.println("특정 기능 실행됨 (specificRequest)");
    }
}

// 어댑터: Target 인터페이스에 맞춰 Adaptee를 변환
class Adapter implements Target {
    private Adaptee adaptee;

    Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    public void request() {
        adaptee.specificRequest(); // 내부적으로 기존 메서드를 호출
    }
}

// 사용 예시
public class Main {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        Target target = new Adapter(adaptee); // 기존 클래스를 감싸서 사용
        target.request(); // 결과: "특정 기능 실행됨"
    }
}

 

Adapter 패턴의 장점

기존 코드를 변경하지 않고 재사용 가능

OCP(개방-폐쇄 원칙) 만족한다.

 

서로 다른 인터페이스 간의 호환성 확보

유연한 설계가 가능하다.

 

외부 라이브러리 통합이 쉬움

외부 API를 내 코드에 맞춰 깔끔하게 사용할 수 있다.

 

Adapter 패턴의 단점

구조가 많아지면 복잡해질 수 있음

너무 많은 어댑터가 생기면 유지보수 힘들 수 있다.

 

실행시간에 약간의 성능 저하 가능성이 있음

중간 계층(어댑터)을 거쳐야 하기때문이다.

 

어댑터 클래스의 의도 파악이 어려울 수 있음

명확한 문서화나 네이밍이 중요하다.

 

Adapter 은 언제 사용하나?

  • 기존 코드(클래스)를 변경하지 않고 재사용하고 싶을 때
    ex) 오래된 레거시 클래스와 새로운 코드 연결 
    ⇒ 레거시 코드를 수정하지 않고 새 코드에서 사용 가능
  • 클래스들의 인터페이스가 맞지 않아 함께 사용하지 못할 때
    ex) 기존 구조 변경 없이 시스템 확장
    시스템의 구조를 건드리지 않고 기능 추가 가능
  • 라이브러리나 외부 API를 내 코드에 맞춰 쓰고 싶을 때
    ex) 외부 API 사용 시 내 코드와 인터페이스 불일치
    외부 API를 내 코드에 맞춰서 포장

 

정리하자면

  • 외부 API, 레거시 코드, 인터페이스 불일치 상황에서 기존 코드 변경 없이 재사용하려고 서로 다른 인터페이스를 연결시켜주는 패턴이다.
  • 재사용성이 높으며 유연성이 증가한다. 
  • 구조 복잡도가 증가하며, 과용 시 혼란스럽다.

 

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기