본문 바로가기

JAVA/디자인 패턴

[Design Pattern] Adapter(어댑터) 패턴이란?

반응형
구조 패턴(Structural Pattern)


어댑터 패턴(Adapter Pattern)은 객체지향 디자인 패턴 중 하나로, 두 개의 인터페이스 호환성을 제공하는 패턴입니다. 이 패턴은 기존 클래스나 라이브러리를 재사용하려는 상황에서 해당 클래스나 라이브러리의 인터페이스가 기존 시스템과 호환되지 않을 때, 새로운 시스템에서 기존 클래스나 라이브러리를 사용할 수 있도록 하기 위해 사용됩니다.

 

어댑터 패턴의 구성 요소는 다음과 같습니다.

 

  • Target Interface : 기존 시스템에서 사용하고 있는 인터페이스입니다. 이 인터페이스를 구현하면서 새로운 시스템에서 재사용하려는 클래스나 라이브러리를 사용할 수 있도록 합니다.
  • Adaptee Interface : 새로운 시스템에서 재사용하려는 클래스나 라이브러리의 인터페이스입니다. 이 인터페이스는 기존 시스템에서 사용하고 있는 인터페이스와 호환되지 않을 수 있습니다.
  • Adapter : Target 인터페이스를 구현하면서 Adaptee 인터페이스를 호출합니다. Adapter는 Target 인터페이스를 기존 시스템에서 사용하면서 Adaptee 인터페이스를 호출하고, 호출된 결과를 Target 인터페이스로 반환합니다.

어댑터 패턴은 다음과 같은 상황에서 사용됩니다.

 

  • 기존 클래스나 라이브러리를 재사용하려는 경우
  • 인터페이스를 새로 구현하거나 변경하는 것이 어려운 경우
  • 여러 클래스나 라이브러리를 통합해서 사용해야 하는 경우

어댑터 패턴은 다른 패턴과 함께 사용될 수 있습니다. 예를 들어, 어댑터 패턴과 함께 전략 패턴을 사용하면, Adapter가 전략 객체를 호출하면서 적절한 전략을 선택하게 할 수 있습니다. 또한, 어댑터 패턴은 프록시 패턴과도 유사합니다. 프록시 패턴은 기존 객체에 대한 접근을 제어하는 반면, 어댑터 패턴은 기존 객체를 새로운 인터페이스에 적합하도록 변환합니다.

 

 

Adapter 패턴 예제

Diagrams

 

이 예제에서는 Power 인터페이스가 Target Interface 역할을 합니다.

Adaptee 인터페이스는 Power220VInterface 역할을 하며, Power220V 클래스는 Power220VInterface를 구현한 Adaptee 클래스입니다.

PowerAdapter 클래스는 Adapter 역할을 하며, Power 인터페이스를 구현하면서 Power220VInterface를 사용하여 Power220V 클래스의 supplyPower220V() 메서드를 호출합니다.

Main은 Adapter를 사용하여 110V 전원을 220V 전원에 적용할 수 있도록 변환합니다.

 

// Target Interface
interface Power {
    void supplyPower(int voltage);
}

// Adaptee Interface
interface Power220VInterface {
    void supplyPower220V();
}

// Adaptee Class
class Power220V implements Power220VInterface {
    public void supplyPower220V() {
        System.out.println("220V Power Supplied");
    }
}

// Adapter Class
class PowerAdapter implements Power {
    private Power220VInterface power220V;

    public PowerAdapter(Power220VInterface power220V) {
        this.power220V = power220V;
    }

    @Override
    public void supplyPower(int voltage) {
        if (voltage == 110) {
            System.out.println("Adapter converts 110V to 220V");
            power220V.supplyPower220V();
        } else {
            System.out.println("Invalid Voltage");
        }
    }
}

// Client Code
public class Main {
    public static void main(String[] args) {
        // Adaptee
        Power220VInterface power220V = new Power220V();

        // Adapter
        Power power = new PowerAdapter(power220V);

        // Client
        power.supplyPower(110);
    }
}

 

위 예제를 실행하면, Power220V 객체의 supplyPower220V() 메서드가 호출되어 "220V Power Supplied"라는 출력이 나오게 됩니다.

반응형