어뎁터 Adapter
🙈

어뎁터 Adapter

Created
Apr 22, 2024 06:07 AM
Last edited time
Last updated April 22, 2024
Tags
CS
Language
URL

Intro::

디자인 패턴 중 구조 패턴에 해당하는 어뎁터에 대해 알아봅시다.
 

어뎁터란?

💡
어댑터 패턴(Adapter Pattern)은 호환되지 않는 인터페이스를 가진 객체를 어댑터를 통해 클라이언트가 기대하는 인터페이스로 변환하는 것입니다. 이 변환 과정을 통해 기존의 코드는 그대로 유지하면서, 다른 인터페이스 요구사항을 충족할 수 있게 됩니다.

구성 요소

  1. Target: 클라이언트가 사용하길 기대하는 인터페이스입니다. 이 인터페이스에 맞춰 구현해야 할 기능을 정의합니다.
  1. Adapter: Target 인터페이스를 구현하면서 내부적으로 Adaptee 인터페이스를 사용하여 요구 사항을 충족시킵니다.
  1. Adaptee: 실제로 사용되는 기존 클래스의 인터페이스를 가지고 있으며, Adapter를 통해 Target 인터페이스에 맞게 호출될 수 있습니다.
  1. Client: Target 인터페이스를 통해 작업을 수행하는 사용자 또는 시스템입니다.

작동 방식

어댑터 패턴의 핵심은 Adapter 클래스가 Target 인터페이스를 구현하는 것이며, 내부적으로 Adaptee 클래스의 인스턴스를 갖고 있어 해당 인스턴스의 메소드를 호출합니다. 클라이언트는 Target 인터페이스를 통해 작업을 요청하고, Adapter는 이 요청을 받아 Adaptee의 인터페이스로 변환하여 처리합니다.
 

장점

  1. 호환성 문제 해결: 어댑터 패턴은 호환되지 않는 인터페이스를 가진 클래스들이 서로 상호작용할 수 있게 해 줍니다. 이를 통해 기존의 코드를 재사용할 수 있으며, 시스템의 일관성을 유지할 수 있습니다.
  1. 재사용성 증가: 이미 개발된 코드나 외부 시스템의 기능들을 변경하지 않고도 새로운 환경이나 시스템에 적용할 수 있습니다. 이는 개발 시간과 비용을 절약할 수 있게 해줍니다.
  1. 변경의 유연성: 클라이언트 코드와 외부 시스템 사이의 결합도를 낮추어, 한 쪽의 변경이 다른 쪽에 미치는 영향을 최소화합니다. 이로 인해 시스템의 유지보수가 용이해집니다.

단점

  1. 시스템 복잡성 증가: 어댑터를 사용하면 시스템 내에 추가적인 추상화 레이어가 생기기 때문에 전체적인 시스템 구조가 복잡해질 수 있습니다. 이로 인해 코드의 이해와 관리가 어려워질 수 있습니다.
  1. 성능 저하: 어댑터 클래스를 통해 메소드 호출이 이루어질 때 추가적인 인다이렉션(indirection) 레이어가 생기므로, 이는 성능 저하를 일으킬 수 있습니다. 특히 시스템의 성능이 중요한 경우, 이 부분은 고려해야 할 요소입니다.
  1. 오버헤드 증가: 어댑터 클래스를 구현하고 유지보수하는 데 추가적인 노력이 필요할 수 있습니다. 특히 여러 어댑터가 필요한 경우, 각각의 어댑터를 관리하면서 발생하는 오버헤드가 증가할 수 있습니다.
 

코드 예시

// Target 인터페이스 interface KoreanPlug { void provideElectricity(); } // Adaptee 클래스 class AmericanPlug { void provide110V() { System.out.println("Providing 110V electricity from American plug"); } } // Adapter 클래스 class PlugAdapter implements KoreanPlug { private AmericanPlug americanPlug; public PlugAdapter(AmericanPlug americanPlug) { this.americanPlug = americanPlug; } @Override public void provideElectricity() { americanPlug.provide110V(); System.out.println("Adapter converts 110V to 220V for Korean appliances."); } } // Client 클래스 class PlugUser { public static void main(String[] args) { AmericanPlug americanPlug = new AmericanPlug(); KoreanPlug adapter = new PlugAdapter(americanPlug); adapter.provideElectricity(); // 클라이언트는 한국 콘센트 인터페이스를 사용하여 전기를 사용 } }

References::

Loading Comments...