본문 바로가기
Programming/디자인 패턴

어댑터 패턴 Adapter 패턴

by Bam_t 2021. 9. 19.
728x90

다른 패턴 이름들과 다르게 어댑터라는 이름은 실생활에서도 많이 들어봤을 것입니다. 특히 110v 전압을 쓰는 나라에 여행을 가게 될 때는 우리가 110v어댑터라는 것을 껴서 우리가 사용하는 220v에서 전환을 합니다.


1. 어댑터 패턴 소개

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

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

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

 

 

2. 어댑터 패턴 구현

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

 

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

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 class GalaxyWatchAdapter extends GalaxyWatch implements GalaxyWatchInterface {
    public GalaxyWatchAdapter(){
        System.out.println("아이폰에 갤럭시워치 연결");
    }

    @Override
    public void galaxyFitness() {
        super.galaxyFitness();
    }
}
public interface GalaxyWatchInterface {
    void 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();
    }
}

 

 

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

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

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

클래스 어댑터 오브젝트 어댑터
상속만으로 구현된다 구성으로 구현된다
요구하는 인터페이스를 어댑터가 구현한다 어댑터는 기존 클래스 객체를 생성자의 인수로 받아서 인터페이스로 구현한다
기존의 클래스로부터 상속받아 확장하고 구현한다 기존 클래스 객체를 요구하는 인터페이스가 구현된 어댑터에 담아서 사용한다

https://github.com/Bam-j/DesignPattern/tree/master/src/Adapter

 

GitHub - Bam-j/DesignPattern: 디자인 패턴 블로그 기재

디자인 패턴 블로그 기재. Contribute to Bam-j/DesignPattern development by creating an account on GitHub.

github.com

 

728x90

댓글