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