어댑터 패턴 Adapter Pattern

Bam·2022년 3월 5일
0

Design Pattern

목록 보기
7/13
post-thumbnail
post-custom-banner

어댑터 패턴

서론에서 언급했듯이 보통 어댑터를 전압에 따라 교체합니다. 스마트폰 충전기도 태블릿이냐 노트북이냐에 따라서 20w 어댑터로 교체하고 50w 어댑터로 교체하기도 하고 하죠. 이처럼 어댑터를 우리 입맛에 맞춰서 바꿔서 이용합니다. 이처럼 어댑터 패턴도 인터페이스를 사용자의 입맛에 맞춰서 쓸 수 있게 해줍니다.

어댑터 패턴은 인터페이스를 사용자가 원하는 기능에 맞도록 변화시켜주는 패턴입니다. 위의 예시에서 콘센트와 전자 제품은 객체고 어댑터가 인터페이스가 되는 것 입니다. 콘센트 객체에 맞춰 110v 인터페이스를 넣으면 110v로 이용할 수 있게 되고, 220v 인터페이스를 넣으면 220v로 이용할 수 있게 해줍니다. 어댑터 패턴은 구조 패턴에 포함됩니다.

어댑터 패턴이 어떻게 원하는 기능에 맞춰 변화시키는지 구현을 하며 확인해보겠습니다.

어댑터 패턴 구현

제 경험을 소개하자면, 삼성과 애플사의 휴대전화, 웨어러블 기기를 모두 사용했었습니다. 그러다보니 웨어러블 기기의 호환성이 문제가 됐었는데요. 두 회사 모두 자사의 웨어러블 기기는 알아서 작동이 되지만, 타사의 웨어러블 기기를 이용하기 위해서는 특정 어플을 이용해서 연동을 해야했습니다. 그래서 이 주제를 가지고 어댑터 패턴을 구현해보겠습니다.

우선 애플과 삼성의 워치 클래스를 만들었습니다.

public class AppleWatch {
    public AppleWatch() {
        System.out.println("애플워치");
    }

    public void appleFitness() {
        System.out.println("애플워치로 운동 측정");
    }
}

public class GalaxyWatch {
    public GalaxyWatch() {
        System.out.println("갤럭시워치");
    }

    public void galaxyFitness() {
        System.out.println("갤럭시워치 운동 측정");
    }
}

이처럼 같은 기능을 하더라도 두 제품의 메소드명이 다름을 알 수 있죠. 그래서 우리는 아이폰에서 갤럭시 워치를 쓰기 위해 어댑터를 이용해야합니다.

public interface GalaxyWatchInterface {
    void galaxyFitness();
}
public class GalaxyWatchAdapter extends GalaxyWatch implements GalaxyWatchInterface {
    public GalaxyWatchAdapter(){
        System.out.println("아이폰에 갤럭시워치 연결");
    }

    @Override
    public void galaxyFitness() {
        super.galaxyFitness();
    }
}

갤럭시워치 클래스의 galaxyFitness 클래스를 이용하기 위해서 인터페이스를 설계했습니다. 이 과정을 통해 추후에 어댑터 패턴을 사용해서 아이폰에서 갤럭시 워치의 galaxyFitness를 이용할 수 있게 됩니다.

어댑터 결과를 보기위해 아이폰 클래스도 만들어봐야겠죠? 다음 코드를 보시면 어댑터 클래스를 통해서 galaxyFitness에 접근했음을 알 수 있습니다.

public class IPhone {
    public IPhone() {
        AppleWatch appleWatch = new AppleWatch();
        appleWatch.appleFitness();
    }

    public void pairingGalaxyWatch() {
        GalaxyWatchAdapter galaxyWatchAdapter = new GalaxyWatchAdapter();
        galaxyWatchAdapter.galaxyFitness();
    }
}

마지막으로 메인 메소드와 결과입니다.

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

        System.out.println();

        iPhone.pairingGalaxyWatch();
    }
}

클래스 어댑터와 객체 어댑터

어댑터 패턴은 세부적으로 다시 두가지로 나뉩니다. 하나는 클래스 어댑터라고 하고 다른 하나는 객체 어댑터 라고 합니다. 클래스 어댑터는, 상속을 이용한 방식이고, 객체 어댑터는 구성을 사용한 방식입니다. 위에서 본 예시는 상속으로 어댑터를 만들었으니 클래스 어댑터라고 할 수 있습니다.

두 어댑터의 차이를 간단히 표로 만들었습니다.

post-custom-banner

0개의 댓글