어댑터 패턴(Adapter Pattern)은 서로 다른 인터페이스를 가진 클래스들이 함께 작동할 수 있도록 중간에서 변환 작업을 해주는 디자인 패턴입니다. 이 패턴을 사용하면 기존 코드를 수정하지 않고도, 새로운 코드와 호환성을 유지할 수 있습니다.
주요 개념:
- 타겟 인터페이스(Target Interface): 클라이언트가 사용하려고 하는 인터페이스입니다.
- 어댑티(Adaptee): 기존 클래스이며, 타겟 인터페이스와 호환되지 않는 인터페이스를 가지고 있습니다.
- 어댑터(Adapter): 어댑티의 인터페이스를 타겟 인터페이스에 맞게 변환하는 클래스입니다.
간단한 예시:
- 상황: 클라이언트는
USB
포트를 사용하는데, 우리가 가진 장치는Lightning
포트를 가지고 있습니다.
- 해결:
USB
를Lightning
으로 변환하는 어댑터를 만들어, 클라이언트가 원하는 포트에 장치를 연결할 수 있게 합니다.
장점:
- 호환성 유지: 기존 코드를 수정하지 않고도 새로운 인터페이스와 호환될 수 있습니다.
- 재사용성: 기존 클래스를 재사용하면서, 새로운 인터페이스에 맞게 사용할 수 있습니다.
단점:
- 복잡성 증가: 어댑터 클래스가 추가됨에 따라 코드가 복잡해질 수 있습니다.
어댑터 패턴은 특히 레거시 시스템을 현대화하거나, 서로 다른 시스템 간의 통합을 할 때 유용하게 사용됩니다.
1. 어댑터 패턴 연습 예제 및 해설
App
package ex03;
import ex03.lib.OuterRabbit;
/**
*
* Animal 생성 (abstract)
* 타입 일치(다형성) = 쥐(동물), 호랑이(동물)
* 문지기한테 DIP만 지켜주면 됨
*/
public class App {
public static void main(String[] args) {
Mouse m1 = new Mouse();
Tiger t1 = new Tiger();
Doorman d1 = new Doorman();
d1.쫒아내(m1);
d1.쫒아내(t1);
RabbitAdapter rabbit = new RabbitAdapter(new OuterRabbit());
d1.쫒아내(rabbit);
}
}
- ‘Mouse’,’Tiger’,’Aniaml’을 상속 받아 각각 ‘쫓아내’ 메소드를 구현한다.
- ‘Doorman’은 ‘Animal;’ 객체를 처리하는 클래스이다.
- ‘RabbitAdapter’는 ‘OuterRabbit’을 ‘Animal’ 타입을 변환하는 Adapter 클래스이다.
- ‘OuterRabbit은 ‘Animal’ 타입을 직접 구현하지 않는 기존 클래스다.
- ‘RabbitAdapter’를 사용하여 ‘OuterRabbit’을 ‘Animal’ 타입으로 변환하고 이를 ‘Doorman’을 통해 처리한다.
- 이 프로그램은 Adapter 클래스 패턴을 활용해서 ‘OuterRabbite’ 객체를 ‘Animal’ 인터페이스에 맞게 변환하고, 각각의 동물 객체를 처리 할 수 있다.
RabbitAdapter
package ex03;
import ex03.lib.OuterRabbit;
public class RabbitAdapter extends Animal {
private OuterRabbit rabbit;
public RabbitAdapter(OuterRabbit rabbit) {
this.rabbit = rabbit;
}
//호환시키는 코드
@Override
public String getName() {
return rabbit.getFullname();
}
}
- ‘Animal’을 상속받아 ‘ OuterRabbit’ 객체를 감싸는 Adapter 클래스이다.
- ‘OutRabbit’의 ‘getFullname’ 메소드를 호출하여 ‘Animal’의 ‘getName’ 메소드로 호환 되도록 한다.
- 이 클래스는 Adapter 패턴을 사용하여 기존 ‘OuterRabbit’ 클래스의 메소드를 새로운 인터페이스 맞게 변환한다. 이를 통해 ‘OuterRabbit’을 ‘Aniaml’타입으로 사용 할 수 있게 만들어, 다양한 코드와 호환성을 제공한다.
OuterRabbit
package ex03.lib;
public class OuterRabbit {
private String fullname = "토끼";
public String getFullname() {
return fullname;
}
}
- ‘OuterRabbit’클래스는 ‘Fullname’이라는 이름의 ‘String’ 필드를 가지고 있으면, 이 필드의 값을 반환하는 ‘getFullname’메소드를 제공합니다.
- ‘fullname’필드는 ‘토끼’라는 값을 기본으로 가지고 있고 ‘getFullname’메소드를 통해 외부에서 값을 가져 올 수 있다.
- 이 클래스는 Adapter 패턴을 사용될 때, ‘RabbitAdapter’ 클래스를 통해 ‘Aniaml’ 인터페이스와 호환되로록 변환된다. ‘OuterRabbit’ 자체는 단순히 이름을 저장하고 반환하는 역활을 한다.
Share article