어댑터 패턴

이종찬·2023년 2월 4일
0
post-custom-banner

📖 어댑터 패턴?

Adapter패턴은 호환성이 없는 기존 클래스의 인터페이스를 변환하여 재사용할 수 있도록 해줍니다. 따라서 SOLID원칙인 개방 폐쇄 원칙을 따릅니다. 실생활에서 예시를 들면 변환 젠더나 충전 케이블 같이 서로 호환이 안되지만 usb-c타입에서 hdmi로 변경해주거나, usb-c타입에서 usb-A타입으로 변환해주는 것과 같습니다.

🤔 써야 하는 이유?

위의 예시와 비슷하게 기존에 쓰던 코드 및 라이브러리를 필수적으로 변경해야 하는 경우 외부에 영향을 미치지 않을 수 없습니다. 기존의 것을 최대한 변경하지 않고 구현할 수 있어야 합니다. Adapter 패턴을 사용하게 되면 기존 코드를 변경하지 않아도 되는 장점과 변경하지 않아도 되기 때문에 재활용성도 증가시킬 수 있습니다.

😮 사용되는 사례

기존 클래스를 감싼 새로운 클래스를 생성하고 인터페이스를 재구성하기 때문에 많은 사람들이 이용하는 프로그램에는 Adapter를 자주 볼 수 있습니다. RecyclerViewAdapter, ListAdpater 등등

🤔 문제가 되는 경우는?

  • 클래스 어댑터의 경우 상속을 용하기 때문에 특정 클래스에만 적용이 가능하며 다중상속이 지원되는 언어에서만 활용 가능하다. -> 유연하지 못하다.
  • 객체 어댑터의 경우 어댑터 객체를 만들어야 사용이 가능하다. -> 대부분의 코드를 다시 작성해야 한다.

공통적으로 어댑터는 추가 코드가 많이 필요하다. 즉, 복잡도가 증가하며 속도가 저하된다. 어댑터에 기능을 추가하는거 보다 기존 코드의 인터페이스를 수정하는 것도 좋은 선택이 될 수도 있다.

👨‍💻구현

Adapter

interface Type8 {
    public void connect();
}

interface TypeC {
    public void connect();
}

구현

class Galaxy implements TypeC {
    @Override
    public void connect() {
        System.out.println("Type C 연결됨");
    }
}

class IPhone implements Type8 {
    @Override
    public void connect() {
        System.out.println("Type 8 연결됨");
    }
}


public class Main {
    public static void main(String[] args) {
        Galaxy galaxy = new Galaxy();
        IPhone iPhone = new IPhone();

        typeC_connect(galaxy);
        type8_connect(iPhone);

        Type8toTypeCAdapter adapter = new Type8toTypeCAdapter(iPhone);
        typeC_connect(adapter);
    }

    static void typeC_connect(TypeC typeC) {
        typeC.connect();
    }

    static void type8_connect(Type8 type8) {
        type8.connect();
    }
}

실행결과

Type C 연결됨
Type 8 연결됨
Type 8 연결됨

profile
왜? 라는 질문이 사라질 때까지
post-custom-banner

0개의 댓글