Post

어댑터 패턴 이해해보기: 호환성 문제를 해결하는 구조적 패턴

어댑터 패턴이 뭘까??


어댑터 패턴은 서로 호환되지 않는 클래스를 이어주는 역할이라고 생각하면 이해하기가 쉽다! 예를 들어서 Galaxy24 class 안에 samsunginternet 이 있고 Iphone interface 안에 safari가 있을때를 생각해보자

1
2
3
4
5
6
7
8
9
class Galaxy24 {
    public void samsungInternet() {
        System.out.println("삼성인터넷");
    }
}

interface Iphone {
    public void safari();
}

그럼 이대 Galaxy24 는 Iphone 안에 들어 갈 수가 없다 왜냐면 safari 가 없으니까! 퍼즐 조각이 안맞는것과 같은 느낌이다. 이걸 해결하기위해서는 둘사이를 채워줄 adapter 가 하나 필요하다!

1
2
3
4
5
6
7
8
9
10
11
12
class Galaxy24Adapter implements Iphone {
    private Galaxy24 galaxy24;

    public Galaxy24Adapter(Galaxy24 galaxy24) {
        this.galaxy24 = galaxy24;
    }

    @Override
    public void safari() {
        galaxy24.samsungInternet();
    }
}

그리고 실제로 사용 할 때는 이렇게 사용하면 된다!

1
2
3
Galaxy24 galaxy24 = new Galaxy24();
Iphone iphone = new Galaxy24Adapter(galaxy24);
iphone.safari();

언제 사용하고 장점이 뭘까 ?


사실 처음 어댑터 패턴을 마주했을때 뭔가 기이한 형태라고 생각했다. 저걸 두개를 꼭 이어야해? 라는 생각이 들었다. 하지만 실 사용예를 보니 이해가 되었다. 어댑터 패턴은 이럴 때 사용 할 수 있다.

  1. 레거시 코드가 있는데 이게 인터페이스가 다른 경우!
  2. 외부 라이브러리를 사용 하려고 하는데 인터페이스가 다른 경우! 이 두가지 경우에 adapter 패턴을 사용하면 코드에 많은 수정없이 우리가 원하는 대로 사용이 가능해진다!

단점은 뭘까 ?


어댑터 클래스가 많으면 많아질수록 복잡성이 증가하게 된다. Galaxy24 class처럼 점점 저런 애들이 많아지면 adapter 도 따라서 많아지기 때문에 계속 증가하게 된다면 Class 분류는 다시 생각해서 그림을 다시 그려보는게 좋을 것 같다!

This post is licensed under CC BY 4.0 by the author.

© 병욱. Some rights reserved.