개발/자바

[java] 어댑터(Adapter) 패턴

조용한닭 2024. 1. 11. 12:45
728x90
반응형

정의:

어댑터 패턴은 호환되지 않는 인터페이스를 가진 두 클래스를 함께 동작할 수 있도록 하는 디자인 패턴입니다. 쉽게 말해, 기존의 클래스를 수정하지 않고 새로운 인터페이스에 맞게 변환해주는 역할을 하는 패턴입니다.

장점:

  1. 재사용성 증가: 기존 클래스를 변경하지 않고 새로운 클래스에 적응시킬 수 있으므로 기존 코드를 재사용할 수 있습니다.
  2. 유연성 향상: 호환되지 않는 인터페이스를 갖는 클래스를 함께 사용할 수 있어서 시스템의 유연성을 향상시킵니다.
  3. 연동성 증가: 기존의 클래스를 새로운 클래스와 연동할 수 있게 해주어 기존 시스템을 새로운 기능과 연동시킬 수 있습니다.

단점:

  1. 성능 저하 가능성: 어댑터가 추가되면 성능 저하가 발생할 수 있습니다.
  2. 복잡성 증가: 어댑터 패턴이 과도하게 사용되면 코드의 복잡성이 증가할 수 있습니다.

언제 사용하는지:

  1. 기존 코드의 재사용: 이미 개발된 기존 클래스를 활용하고자 할 때 사용합니다.
  2. 호환되지 않는 인터페이스 통합: 서로 다른 인터페이스를 가진 클래스들을 함께 사용해야 할 때 사용합니다.
  3. 새로운 기능 추가: 새로운 인터페이스를 구현한 클래스를 기존 시스템에 통합시킬 때 사용합니다.

예시 코드

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

// Adaptee: 실제로 사용되는 클래스 (호환되지 않는 인터페이스를 가짐)
class Adaptee {
    void specificRequest() {
        System.out.println("호환되지 않는 메서드 호출");
    }
}

// Adapter: Target 인터페이스를 구현하면서 Adaptee를 포함시켜 호환성을 제공
class Adapter implements Target {
    private Adaptee adaptee;

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

    @Override
    public void request() {
        adaptee.specificRequest();
    }
}

// Client: 어댑터 패턴을 사용하는 클라이언트 코드
public class AdapterExample {
    public static void main(String[] args) {
        // 호환되지 않는 클래스를 어댑터를 통해 사용
        Adaptee adaptee = new Adaptee();
        Target adapter = new Adapter(adaptee);

        // 클라이언트는 Target 인터페이스를 통해 request 메서드를 호출
        adapter.request();  // 출력: 호환되지 않는 메서드 호출
    }
}

 

이 예제에서는 Adaptee 클래스의 specificRequest 메서드를 호출하는 클래스를 어댑터 패턴을 사용하여 Target 인터페이스를 구현한 Adapter 클래스로 변환합니다. 클라이언트 코드에서는 어댑터를 통해 호환되지 않는 메서드를 호출할 수 있게 됩니다.

728x90
반응형