1. 어댑터 패턴
어댑터 패턴(Adapter Pattern)은 객체지향 디자인 패턴 중 하나로, 호환되지 않는 인터페이스를 가진 클래스들이 서로 상호작용할 수 있도록 도와주는 패턴이다.
마치 어댑터(전자기기에서 사용하는 변환기)가 서로 다른 규격을 맞춰주는 것처럼, 어댑터 패턴은 기존 클래스를 수정하지 않고도 다른 인터페이스를 사용할 수 있게 해준다.
1-1. 어댑터 패턴을 사용하는 경우
어댑터 패턴을 사용하는 두 가지 경우가 있다.
1. 이미 만들어진 무언가가 우리 시스템에 호환이 안될 때, 어댑터를 사용한다.
2. 아직 안만들었는데, 어댑터 틀을 만들어놓고 여기 규격에 맞게 만들어~ 라고도 할 수 있다.
순서가 얘가 먼저 만들어져야 그 다음 것을 만들 수 있는 경우,
내가 마냥 기다리고 있을 순 없잖아
내가 어댑터 만들어 놨으니까 이렇게 만들어~ 라고 할 수도 있는 것.
어댑터 패턴을 사용 할 때에는 첫번째 경우가 더 많다.
다른 사람이 만든 라이브러리를 내가 끌어다 쓸 건데, 호환이 안될 때. 그 때 어댑터를 만든다.

외부에서 만든 OuterRabbit 이 존재 할 경우,
내가 만든 것이 아니니, 기존에 있는 Mouse 나 Tiger 처럼 Animal 로 추상화 해서 연결 할 수가 없다.
package ex03;
// 쥐
public class Mouse extends Animal {
private String name = "쥐";
// 재정의됨
public String getName() {
return name;
}
}
외부에서 만든다면 위와 같은 getName() 이 없을 것이다. 협업의 관계면 규칙에 맞게 만들라 할 수 있지만, 먼 나라의 누군가가 가져다 쓴다면 그렇지 않을 것.
package ex03.lib;
public class OuterRabbit {
private String fullname = "토끼";
public String getFullname() {
return fullname;
}
}
이럴 때, 사용하는 것이 어댑터(Adapter).
RabbitAdapter (어댑터)를 사용하여, OuterRabbit 을 감싸서 호환이 가능하도록 한다. 어댑터라고 이름 붙인거지, 사실 Rabbit 인 셈.
package ex03;
import ex03.lib.OuterRabbit;
// 컴퍼지션(Composition) : has-a
public class RabbitAdapter extends Animal {
private OuterRabbit rabbit; // 컴퍼지션
public RabbitAdapter(OuterRabbit rabbit) {
this.rabbit = rabbit;
}
@Override
String getName() { // 호환시키는 코드
return rabbit.getFullname(); // 그 안에다 호환안되는 코드를 넣어주면 됨
}
}
이미 만들어진 무언가를 호환 시킬 때, 위와 같은 방법을 이용한다.
외부에서 만든 new OuterRabbit() 를 어댑터가 감싸주는 방법으로, 호환이 가능케 한다.
package ex03;
import ex03.lib.OuterRabbit;
/*
Animal 생성(abstract)
타입 일치(다형성) = 쥐(동물), 호랑이(동물)
문지기한테 DIP 만 지켜주면 됨
*/
public class App {
public static void main(String[] args) {
Animal mouse = new Mouse();
Animal tiger = new Tiger();
Doorman d1 = new Doorman();
d1.쫒아내(tiger);
RabbitAdapter rabbit = new RabbitAdapter(new OuterRabbit());
// 외부에서 만든 new OuterRabbit() 를 넣어서 어댑터가 감싸주는 것
// 호환이 안되는 것을 얘가 해결해줌.
d1.쫒아내(rabbit);
}
}
출력 되는 내용은 아래와 같다.

1-2. 그 외의 역할도 해주는 어댑터
메서드 이름이 동일해야 동적 바인딩이 되는데,
어떤 경우에는 강제성을 다 부여할 필요 없이 1개만 부여해도 되는 경우가 있단 말이지?
이 때, Adapter 를 만들어서 안쓰일것들을 걸러내는 역할도 해준다.
자바 8 부터는 default 메서드를 사용하여,
2. 정리
외부 라이브러리 당겨와서 쓰고 싶어, 근데 우리랑 맞지 않아.
그러면 어댑터 패턴을 이용하여 끼워 맞춰 주는 것.
Share article