ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 구조 패턴 - 어댑터(Adapter) 패턴
    Java/디자인패턴 2024. 11. 10. 21:15
    반응형

    어댑터(Adapter) 패턴은 주로 **구조 패턴(Structural Pattern)**으로 분류되며, 서로 호환되지 않는 인터페이스를 가진 클래스들 사이에서 호환성을 제공하는 패턴입니다. 즉, 클라이언트가 원하는 인터페이스와 실제 사용하려는 객체의 인터페이스가 다를 때, 그 둘을 중개해주는 역할을 합니다. 이 패턴을 통해 기존 코드를 수정하지 않고 새로운 인터페이스를 추가할 수 있어 재사용성과 유연성을 높이는 데 도움이 됩니다.

    1. 어댑터 패턴의 목적

    어댑터 패턴의 주된 목적은 호환되지 않는 인터페이스를 가진 클래스들을 함께 사용할 수 있게 하는 것입니다. 이를 통해 기존 코드의 수정 없이 필요한 인터페이스를 구현하여 재사용할 수 있습니다.

    2. 어댑터 패턴의 구성 요소

    • 클라이언트(Client): 어댑터 패턴을 사용하는 주체입니다. 클라이언트는 사용하고자 하는 서비스가 자신이 기대하는 인터페이스를 따르지 않는 경우 어댑터를 통해 서비스에 접근합니다.
    • 타겟(Target): 클라이언트가 기대하는 인터페이스입니다.
    • 어댑터(Adapter): 타겟 인터페이스와 구체적인 서비스 인터페이스 간의 중개 역할을 합니다. 타겟 인터페이스를 구현하며, 실제 서비스 인터페이스의 메서드를 호출하여 그 결과를 클라이언트에게 제공합니다.
    • 어댑티(Adaptee): 클라이언트가 사용하고자 하는 기존 클래스입니다. 기존 인터페이스가 클라이언트가 기대하는 인터페이스와 다르기 때문에 어댑터 패턴을 사용해 중개하게 됩니다.

    3. 어댑터 패턴의 예제 (Java)

    예를 들어, USB 포트를 사용하는 USBDevice와 Micro-USB 포트를 사용하는 MicroUSBDevice가 있다고 가정합니다. 클라이언트는 USBDevice만을 인식할 수 있는 환경에서 MicroUSBDevice를 사용하려고 합니다. 어댑터 패턴을 통해 MicroUSBDevice를 USBDevice처럼 사용할 수 있도록 구현할 수 있습니다.

    코드 예제

    // Target 인터페이스: USBDevice
    interface USBDevice {
        void connectWithUSB();
    }
    
    // Adaptee 클래스: MicroUSBDevice
    class MicroUSBDevice {
        public void connectWithMicroUSB() {
            System.out.println("Micro-USB 장치가 연결되었습니다.");
        }
    }
    
    // Adapter 클래스: MicroUSBToUSBAdapter
    class MicroUSBToUSBAdapter implements USBDevice {
        private MicroUSBDevice microUSBDevice;
    
        public MicroUSBToUSBAdapter(MicroUSBDevice microUSBDevice) {
            this.microUSBDevice = microUSBDevice;
        }
    
        @Override
        public void connectWithUSB() {
            System.out.println("어댑터를 통해 USB에 연결됩니다.");
            microUSBDevice.connectWithMicroUSB(); // Micro-USB 장치를 USB에 연결된 것처럼 사용
        }
    }
    
    // 클라이언트 코드
    public class AdapterPatternExample {
        public static void main(String[] args) {
            USBDevice device = new MicroUSBToUSBAdapter(new MicroUSBDevice());
            device.connectWithUSB();
        }
    }

    코드 설명

    • USBDevice는 클라이언트가 기대하는 인터페이스입니다.
    • MicroUSBDevice는 어댑티로서 USBDevice와 다른 인터페이스를 가지고 있으며, 어댑터를 통해 연결될 대상입니다.
    • MicroUSBToUSBAdapter는 USBDevice 인터페이스를 구현하여 MicroUSBDevice의 메서드를 호출할 수 있도록 중개합니다.
    • 클라이언트 코드에서는 USBDevice 인터페이스를 통해 MicroUSBDevice를 사용할 수 있습니다.

    4. 어댑터 패턴의 유형

    • 클래스 어댑터: 다중 상속을 사용하여, 타겟 인터페이스와 어댑티를 동시에 상속받는 방식입니다. 자바는 다중 상속을 지원하지 않기 때문에 클래스 어댑터 방식은 어렵습니다.
    • 객체 어댑터: 객체를 구성(Composition)하여 어댑티와 타겟 인터페이스를 중개합니다. 일반적으로 자바에서는 이 방식을 사용합니다.

    5. 어댑터 패턴의 장점과 단점

    장점

    • 인터페이스 호환성 문제를 해결해 코드 재사용성을 높입니다.
    • 기존 클래스를 수정하지 않고도 새로운 환경에서 사용할 수 있습니다.

    단점

    • 어댑터 클래스가 많아지면 코드가 복잡해질 수 있습니다.
    • 코드가 늘어나고 구조가 복잡해지면 디버깅이 어려울 수 있습니다.

    6. 어댑터 패턴의 사용 예시

    어댑터 패턴은 다양한 상황에서 활용될 수 있습니다. 예를 들어, 레거시 시스템과 새로운 시스템을 통합하거나, 데이터 형식을 맞추기 위해 사용할 수 있습니다.

    반응형

    댓글

Designed by Tistory.