Uknow's Lab.
article thumbnail

 

 

 

어댑터

 

일본 여행을 갈 때 필요한 준비물 중 하나는 전기 어댑터(Adapter/Adaptor)입니다.

한국은 220V를 쓰지만 일본은 110V를 쓰기 때문에, 플러그 모양이 서로 다릅니다.

때문에 220V를 110V으로 바꿔주는 어댑터가 필요합니다.

 

객체지향 프로그래밍과 디자인 패턴에서 사용되는 어댑터 패턴 역시 이와 비슷합니다.

기존의 클래스 인터페이스를 새로운 인터페이스에 맞추고자 사용하죠.

서로 호환되지 않는 두 클래스를 연결할 때 사용합니다.

 

 

업체에서 제공한 클래스를 사용해야 할 때, 이 클래스의 인터페이스가 기존에 사용하던 인터페이스와 꽤나 다릅니다.

 

 

 

 

기존 코드를 바꾸기 어려울 때,

기존의 사용하던 코드를 새 업체의 코드에 맞게 적응시켜주는 클래스를 만듬으로써,

서로 호환되는 형태의 요청으로 만들어 줄 수 있습니다.

 

 

 

전원 플러그로 알아보기

Plug 인터페이스와 220V

public interface PlugInterface {
    void plugIn();
}

전원 플러그를 꽂기 위한 PlugInterface를 정의하였습니다.

 

 

public class Plug220V implements PlugInterface {
    @Override
    public void plugIn() {
        System.out.println("110V 전원 연결");
    }
}

그리고 이를 구현한 220V 플러그가 있네요.

 

 

 

110V... 낯설다...

public class Plug110V {
    void plugIn110V() {
        System.out.println("220V 전원 연결");
    }
}

하지만 110V의 인터페이스와 서로 맞지 않습니다...!

 

 

 

Adaptor 클래스로 적응시켜주기

public class PlugAdaptor implements PlugInterface {

    private Plug110V plug110V;

    public PlugAdaptor(Plug110V plug110V) {
        this.plug110V = plug110V;
    }

    @Override
    public void plugIn() {
        plug110V.plugIn110V();
    }
}

 

PlugInerface를 implements한 PlugAdpater를 만들어주고, 생성자로써 Plug110V를 받습니다.

plugIn()를 오버라이딩 하는 부분에 plug110V의 plugIn110V()를 호출하여,

PlugInterface의 plugIn() 메서드로 Plug110V를 제어할 수 있게 됩니다.

 

 

public class Main {
    public static void main(String[] args) {
        Plug110V plug110V = new Plug110V();
        PlugInterface plug110V_adept = new PlugAdaptor(plug110V);
        plug110V_adept.plugIn();

        PlugInterface plug220V = new Plug220V();
        plug220V.plugIn();

        plugInTest(plug110V_adept);
        plugInTest(plug220V);
    }

    static void plugInTest(PlugInterface plugInterface) {
        plugInterface.plugIn();
    }
}

 

PlugInterface를 파라미터로 받는 plugInTest()에서도 잘 작동이 되는군요.

 

 

 

Plug110V를 PlugAdaptor로써 PlugInterface에 맞게 변환(Adapt) 시켜줬기 때문에,

PlugInterface라는 통일된 인터페이스로 Plug110V, Plug220V를 다룰 수 있게 되었네요.

 

 

 

 

Adaptor 패턴의 장단점

장점

Adaptor 패턴의 가장 큰 장점은 호환성인 것 같네요.

호환되지 않는 클래스간에 서로 호환할 수 있다는 것은 큰 장점으로 다가옵니다.

기존 코드를 재사용하고, 중복을 제거할 수 있죠. 클래스간의 결합도 역시 낮아집니다.

 

단점

아무래도 어댑터 클래스를 또 작성해야 하기에 소스 코드/파일이 늘어나게 됩니다.

어댑터에서 객체를 변환하는 작업도 규모가 커진다면 성능 이슈가 발생할 수도 있고요.

과도하게 사용할 경우 오히려 클래스 간의 관계가 복잡해질 수도 있습니다.

 

 

저세한 코드는 아래 레포지토리를 확인해주세요

https://github.com/yoon6763/design-pattern

 

GitHub - yoon6763/design-pattern: 재밌지만 심오한 디자인 패턴 마을 탐험 일지

재밌지만 심오한 디자인 패턴 마을 탐험 일지. Contribute to yoon6763/design-pattern development by creating an account on GitHub.

github.com

 

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.