-
구조 패턴 - 어댑터(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. 어댑터 패턴의 사용 예시
어댑터 패턴은 다양한 상황에서 활용될 수 있습니다. 예를 들어, 레거시 시스템과 새로운 시스템을 통합하거나, 데이터 형식을 맞추기 위해 사용할 수 있습니다.
반응형'Java > 디자인패턴' 카테고리의 다른 글
생성패턴 - 팩토리 메소드(Factory Method) 패턴 (0) 2024.11.12 구조 패턴- 브릿지(Bridge) 패턴 (0) 2024.11.11 행위 패턴 - 상태 패턴 (State Pattern) (0) 2024.11.09 생성 패턴 - Singleton 패턴 (0) 2024.11.08 템플릿 메소드 패턴(Template Method Pattern) (0) 2024.11.07