해당 밈을 모르는 사람은 여기를 참고하세요ㅎㅎ
아파트에서 강아지 짖는 소리가 계속 들려 한 남성이 화가 단단히 나 창문을 열고 소리질렀다. 야!! 개 짖는 소리 좀 안 나게하라!!!
그러자 잠시 후 남성의 집 초인종이 눌려 문을 열자 아뇨, 전 개가 아니라 고양인데요?라고 강아지 처럼 생긴 고양이가 말을 했다.
이게 무슨 소리인가 싶겠지만, 어댑터 패턴을 사용하면 가능하다! (사실 아무말 대잔치 맞음)
어댑터 패턴에는 Target, Adapter, Adaptee가 존재한다.
Target은 변경할 대상이 변경될 인터페이스이다.Adapter은 Adaptee를 필드로 가지고 Target을 구현하여 연결해주는 역할을 수행하는 클래스이다.Adaptee는 변경할 대상이다.Target 부터 살펴보자.
public interface Cat {
void meow();
}
public class KoreanShortHairCat implements Cat {
@Override
public void meow() {
System.out.println("나는 코숏이다옹~");
}
}
public interface Dog {
void bark();
}
public class MalteseDog implements Dog {
@Override
public void bark() {
System.out.println("나는 말티즈다 멍!");
}
}
우리는 강아지를 고양이로 변신시킬 것이므로 Cat은 Target, Dog는 Adaptee에 해당된다.
고양이는 meow(), 강아지는 bark()로 다르지만 비슷한 메소드를 가진다.
public class DogAdapter implements Cat {
private Dog dog;
public DogAdapter(Dog dog) {
this.dog = dog;
}
@Override
public void meow() {
dog.bark();
}
}
대망의 Adapter!
필드에 Adaptee를 가져 Target을 구현할 때 bark()를 meow()로 바꿔치기 해준다.
그럼 이제 psvm에서 개 같은(욕 아님) 고양이를 살펴보자.
public class Main {
public static void main(String[] args) {
Cat koreanShortHairCat = new KoreanShortHairCat();
Cat malteseDog = new DogAdapter(new MalteseDog());
koreanShortHairCat.meow();
malteseDog.meow();
}
}
말티즈를 DogAdater를 통해 고양이로 만들어 주었다.
출력 결과는 다음과 같다.

Java에는 초기 컬렉션에서 Iterator 대신 Enumeration을 썼고, 후자에는 remove()가 존재하지 않지만 나머지 메소드가 비슷하다.
따라서 Eumeration을 Iterator로 변환해줄 수 있는 어댑터 패턴을 사용하여 클라이언트는 Iterator라는 추상적인 반복자만 사용할 수 있게 된다.
즉, 어댑터 패턴은 서로 다른 두 인터페이스를 하나로 추상화하여 사용하는 것을 가능하게 해준다.
모든 소스코드는 여기에서 확인할 수 있다.