[디자인 패턴] 어댑터 패턴(Adapter Pattern)

James·2023년 8월 3일
1
post-thumbnail

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


개념 : 어댑터 패턴이란 코드를 재사용하기 위해 구조를 변경하는 패턴이다.

  • 호환되지 않는 인터페이스를 가진 객체들이 협업할 수 있도록 해주는 구조적 디자인 패턴이다.
  • 어댑터 패턴은 오래된 레거시 코드라이브러리를 재사용할 때 유용한 패턴이다. 또한 어댑터 패턴은 서로 호환되지 않는 인터페이스를 가진 코드를 결함 하여 응용 프로그램에서 동작할 수 있도록 도와준다.

어댑터 패턴 사용하는 이유?

  • 기존 코드 재사용: 이미 작성된 클래스를 다른 인터페이스와 함께 사용해야 할 때, 기존 코드를 수정하지 않고 재사용할 수 있습니다.

  • 인터페이스 호환성: 서로 다른 인터페이스를 가진 두 클래스를 통합할 때, 어댑터를 사용하여 호환성을 확보할 수 있습니다.


코드 예시

가정: 우리는 외부 라이브러리에서 제공하는 OldPrinter 클래스를 사용하고 있으며, 이를 기반으로 새로운 Printer 인터페이스를 사용하고자 합니다.

# 기존 외부 라이브러리의 클래스
class OldPrinter:
    def print_document(self, data):
        print("Old Printer: ", data)

# 새로운 Printer 인터페이스
class Printer:
    def print(self, data):
        pass

# OldPrinterPrinter 인터페이스에 맞추기 위한 어댑터 클래스
class PrinterAdapter(Printer):
    def __init__(self, old_printer):
        self.old_printer = old_printer

    def print(self, data):
       self.old_printer.print_document(data)

# 클라이언트 코드
def print_data(printer, data):
    printer.print(data)

old_printer = OldPrinter()
adapter = PrinterAdapter(old_printer)

printer = Printer()
print_data(printer, "This is a new printer.") # Output: (Nothing will be printed since the Printer interface is not implemented)

adapter_printer = adapter
print_data(adapter_printer, "This is an old printer adapted to the new interface.") # Output: Old Printer: This is an old printer adapted to the new interface.

위 코드는 OldPrinter 클래스를 사용하고 있지만, Printer 인터페이스를 따르도록 하기 위해 PrinterAdapter 클래스를 생성했습니다.
이제 OldPrinter 객체를 어댑터에 넣어 Printer 인터페이스를 따르도록 하고, 클라이언트 코드에서는 Printer 인터페이스를 통해 print_data 함수를 호출할 수 있게 됩니다. 이를 통해 OldPrinter 클래스를 기반으로 하는 코드를 수정하지 않고도 새로운 Printer 인터페이스와 함께 사용할 수 있게 되었다.

어댑터 패턴 장단점


장점

어댑터 패턴은 구조 패턴 중 하나로 기존 클래스를 감싼 새로운 클래스를 생성한다. 그리고 새로운 클래스로 객체의 인터페이스를 재구성한다.

  • 유연성 : 객체를 구성으로 결합하면 느슨한 연결 방식으로 보다 많은 유연성을 확보할 수 있다. 그리고 구성은 프로그램이 실행되는 도중에도 객체를 변경할 수 있다.
  • 코드 재사용 및 유지보수 용이성이 증가합니다.
  • 깔끔한 구조 : 어댑터는 복잡한 객체 구조를 깔끔하게 정리하는 데 유용하다.
  • 기존 코드를 수정하지 않고도 새로운 코드와 통합이 가능합니다.

단점

객체를 구성으로 결합하면 어댑터는 클라이언트에서 사용하는 인터페이스 방식으로 메서드를 새로 생성한다.

  • 어댑터가 새로운 메서드를 재구성할 때 추가 코드가 필요하다.
  • 복잡성 증가 : 프로젝트에서 어댑터 패턴을 적용한다고 코드의 성능이 개선되지는 않는다. 오히려 복잡성 증가할 수 있다.
  • 속도 저하 : 오히려 어댑터를 통해야 하므로 속도가 저하된다.

Reference & Additional Resources

profile
의미있는 성장의 태도, 긍정적인 사고를 지닌 Deveolper

1개의 댓글

comment-user-thumbnail
2023년 9월 6일

감사합니다 :)

답글 달기