어댑터 패턴 이해해보기: 호환성 문제를 해결하는 구조적 패턴
어댑터 패턴이 뭘까??
어댑터 패턴은 서로 호환되지 않는 클래스를 이어주는 역할이라고 생각하면 이해하기가 쉽다! 예를 들어서 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();
언제 사용하고 장점이 뭘까 ?
사실 처음 어댑터 패턴을 마주했을때 뭔가 기이한 형태라고 생각했다. 저걸 두개를 꼭 이어야해? 라는 생각이 들었다. 하지만 실 사용예를 보니 이해가 되었다. 어댑터 패턴은 이럴 때 사용 할 수 있다.
- 레거시 코드가 있는데 이게 인터페이스가 다른 경우!
- 외부 라이브러리를 사용 하려고 하는데 인터페이스가 다른 경우! 이 두가지 경우에 adapter 패턴을 사용하면 코드에 많은 수정없이 우리가 원하는 대로 사용이 가능해진다!
단점은 뭘까 ?
어댑터 클래스가 많으면 많아질수록 복잡성이 증가하게 된다. Galaxy24 class처럼 점점 저런 애들이 많아지면 adapter 도 따라서 많아지기 때문에 계속 증가하게 된다면 Class 분류는 다시 생각해서 그림을 다시 그려보는게 좋을 것 같다!
This post is licensed under CC BY 4.0 by the author.