개념
: 어댑터 패턴이란 코드를 재사용하기 위해 구조를 변경하는 패턴이다.
기존 코드 재사용
: 이미 작성된 클래스를 다른 인터페이스와 함께 사용해야 할 때, 기존 코드를 수정하지 않고 재사용할 수 있습니다.
인터페이스 호환성
: 서로 다른 인터페이스를 가진 두 클래스를 통합할 때, 어댑터를 사용하여 호환성을 확보할 수 있습니다.
가정
: 우리는 외부 라이브러리에서 제공하는 OldPrinter 클래스를 사용하고 있으며, 이를 기반으로 새로운 Printer 인터페이스를 사용하고자 합니다.
# 기존 외부 라이브러리의 클래스 class OldPrinter: def print_document(self, data): print("Old Printer: ", data) # 새로운 Printer 인터페이스 class Printer: def print(self, data): pass # OldPrinter를 Printer 인터페이스에 맞추기 위한 어댑터 클래스 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 인터페이스와 함께 사용할 수 있게 되었다.
어댑터 패턴은 구조 패턴 중 하나로 기존 클래스를 감싼 새로운 클래스를 생성한다. 그리고 새로운 클래스로 객체의 인터페이스를 재구성한다.
유연성
: 객체를 구성으로 결합하면 느슨한 연결 방식으로 보다 많은 유연성을 확보할 수 있다. 그리고 구성은 프로그램이 실행되는 도중에도 객체를 변경할 수 있다.- 코드 재사용 및 유지보수 용이성이 증가합니다.
깔끔한 구조
: 어댑터는 복잡한 객체 구조를 깔끔하게 정리하는 데 유용하다.- 기존 코드를 수정하지 않고도 새로운 코드와 통합이 가능합니다.
객체를 구성으로 결합하면 어댑터는 클라이언트에서 사용하는 인터페이스 방식으로 메서드를 새로 생성한다.
- 어댑터가 새로운 메서드를 재구성할 때 추가 코드가 필요하다.
복잡성 증가
: 프로젝트에서 어댑터 패턴을 적용한다고 코드의 성능이 개선되지는 않는다. 오히려 복잡성 증가할 수 있다.속도 저하
: 오히려 어댑터를 통해야 하므로 속도가 저하된다.
감사합니다 :)