1. 어댑터 패턴이란?
어댑터 패턴(Adapter Pattern)은 서로 호환되지 않는 인터페이스를 가진 두 개의 클래스를 연결하기 위해 사용하는 구조적 디자인 패턴이다. 
이 패턴을 통해 기존 클래스를 수정하지 않고도, 다른 클래스와 함께 동작하도록 할 수 있다. 즉, 어댑터는 하나의 인터페이스를 다른 인터페이스로 변환하여 호환되지 않는 클래스들이 함께 동작할 수 있게 하는것!
2. 어댑터 패턴의 주요 개념
- 타깃(Target) 인터페이스: 클라이언트가 사용하려고 하는 인터페이스. 예제에서는 Animal클래스가 이에 해당함.
- 어댑티(Adaptee): 기존에 클라이언트가 사용하려는 인터페이스와 호환되지 않는 클래스. 예제에서는 OuterRabbit클래스가 어댑티에 해당.
- 어댑터(Adapter): 타깃 인터페이스를 구현하고, 어댑티의 인터페이스를 타깃 인터페이스로 변환하는 클래스. 예제에서는 RabbitAdapter가 어댑터 역할을 함.
- 클라이언트(Client): 타깃 인터페이스를 통해 어댑터를 사용하는 코드. 예제에서는 Doorman클래스가 클라이언트.
3. 예제
먼저, 수정할 수 없는 외부 라이브러리의 클래스를 정의한다.
public class OuterRabbit {
    private String fullname = "토끼";
    public String getFullname() {
        return fullname;
    }
}기존에 
Animal 인터페이스를 구현한 클래스public abstract class Animal {
    abstract String getName();
}
public class Mouse extends Animal {
    private String name = "쥐";
    public String getName() {
        return name;
    }
}Doorman 클래스는 Animal 객체들을 받아 처리한다.public class Doorman {
    public void getOut(Animal a){
        System.out.println(a.getName()+" 저리가!");
    }
}
그러나 
OuterRabbit 클래스는 Animal을 상속받지 않기 때문에,
Doorman이 OuterRabbit 객체를 처리할 수 없다. 이 문제를 해결하기 위해 어댑터 패턴을 사용.
public class RabbitAdapter extends Animal {
    private OuterRabbit rabbit;
    public RabbitAdapter(OuterRabbit rabbit) {
        this.rabbit = rabbit;
    }
    @Override
    String getName() {
        return rabbit.getFullname();
    }
}RabbitAdapter는  Animal 과 is 관계가 아니지만 Rabbit 은 is 이기 때문에 상속을 받게된다.Aniaml 을 상속받게 됨에 따라 getName 을 오버라이드 하게 되고OuterRabbit 객체의 getFullname() 메서드를 호출한다. 
이를 통해 OuterRabbit 객체가 Animal 객체처럼 동작할 수 있게 된다.
public class App {
    public static void main(String[] args) {
        Mouse m1 = new Mouse();
        Doorman d1 = new Doorman();
        d1.getOut(m1); // "쥐 저리가!" 출력
        RabbitAdapter adapter = new RabbitAdapter(new OuterRabbit());
        d1.getOut(adapter); // "토끼 저리가!" 출력
    }
}이를 통해 
Doorman 은 토끼와 쥐를 내쫓을 수 있게 된다.Share article