디자인패턴 - Adapter 패턴

code_able·3일 전
0

Adapter 패턴이란

호환되지 않는 인터페이스를 가진 클래스들이 함께 동작할 수 있도록 중간에 어댑터 역할을 하는 클래스를 두는 구조적 디자인 패턴입니다. 어댑터는 기존 클래스를 수정하지 않고 다른 인터페이스와 호환되도록 도와주기 때문에 기존 코드에 대한 수정이 필요 없고, 새로운 코드와 쉽게 통합할 수 있습니다.

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

  • 호환성 문제 해결: 서로 다른 인터페이스를 사용하는 클래스들이 함께 작동하도록 해줍니다.
  • 재사용성 증가: 기존 코드를 수정하지 않고도 새로운 요구사항이나 환경에 맞게 기존 클래스를 재사용할 수 있습니다.
  • 유연성 향상: 어댑터를 사용하면 코드 구조를 변경하지 않고 새로운 기능을 추가할 수 있습니다.

구조

  • Target (목표 인터페이스): 클라이언트가 기대하는 인터페이스입니다.
  • Client (클라이언트): Target 인터페이스를 사용해 필요한 작업을 수행하는 객체입니다.
  • Adaptee (적응 대상): 기존의 인터페이스를 가진 클래스입니다.
  • Target과 호환되지 않아 어댑터가 필요합니다.
  • Adapter (어댑터): Target 인터페이스를 구현하고, Adaptee를 감싸서 클라이언트가 Target을 통해 Adaptee의 기능을 사용할 수 있도록 합니다.

장점

  • 기존 코드를 수정하지 않고, 새로운 기능을 추가하거나 호환성을 확보할 수 있습니다.
  • 인터페이스가 맞지 않는 객체들을 함께 사용할 수 있습니다.
  • 코드 재사용성을 높이고, 시스템의 확장성을 증대시킵니다.

단점

  • 구조가 복잡해질 수 있으며, 너무 많은 어댑터를 사용하면 코드의 가독성이 떨어질 수 있습니다.
  • 시스템 내 의존성이 증가할 수 있습니다.

예제 코드

# Target Interface (클라이언트가 기대하는 인터페이스)
class EuropeSocket:
    def plug_in_european_socket(self):
        return "Using European socket power."

# Adaptee (기존에 존재하는 호환되지 않는 클래스)
class USAPowerPlug:
    def plug_in_usa_socket(self):
        return "Using USA socket power."

# Adapter (어댑터 클래스)
class USAToEuropeAdapter(EuropeSocket):
    def __init__(self, usa_plug: USAPowerPlug):
        self.usa_plug = usa_plug

    def plug_in_european_socket(self):
        # 호환되지 않는 인터페이스를 맞춰주는 어댑터 메서드
        return self.usa_plug.plug_in_usa_socket()

# Client Code (클라이언트 코드)
def charge_device(socket: EuropeSocket):
    print(socket.plug_in_european_socket())

# Usage Example
usa_plug = USAPowerPlug()
adapter = USAToEuropeAdapter(usa_plug)
charge_device(adapter)
# Output:
# Using USA socket power.

실제 사용 예

  • 라이브러리 통합: 기존 시스템에 새 라이브러리를 도입할 때, 새 라이브러리의 인터페이스가 기존 시스템과 맞지 않다면 어댑터를 사용해 인터페이스를 맞춥니다.
  • 레거시 코드 통합: 기존 레거시 시스템이 다른 인터페이스를 사용할 경우, 어댑터를 통해 새 시스템과 호환되도록 만들 수 있습니다.
profile
할수 있다! code able
post-custom-banner

0개의 댓글