어댑터 패턴은 객체지향 디자인 패턴 중 하나로, 호환되지 않는 인터페이스를 가진 클래스들이 서로 상호작용할 수 있도록 도와주는 패턴입니다. 마치 전자기기의 어댑터가 서로 다른 규격을 맞춰주는 것처럼, 어댑터 패턴은 기존 클래스를 수정하지 않고도 다른 인터페이스를 사용할 수 있게 해줍니다.
■ 1. 어댑터 패턴을 사용하는 경우
- 이미 만들어진 무언가가 우리 시스템에 호환되지 않을 때
- 외부에서 가져온 라이브러리나 클래스가 우리 시스템의 인터페이스와 맞지 않을 때, 어댑터를 사용해 호환성을 맞춥니다.
- 아직 구현되지 않은 인터페이스에 대한 틀을 만들어놓고 개발할 때
- 시스템에 필요한 인터페이스를 미리 정의해 두고, 그에 맞는 어댑터를 만들어서 이후에 개발될 클래스를 호환되도록 유도할 수 있습니다.
■ 2. 예제 코드
// Animal 클래스 정의
package ex03;
public abstract class Animal {
abstract String getName();
}
// 쥐 클래스 정의
public class Mouse extends Animal {
private String name = "쥐";
@Override
public String getName() {
return name;
}
}
// 외부에서 제공된 클래스
package ex03.lib;
public class OuterRabbit {
private String fullname = "토끼";
public String getFullname() {
return fullname;
}
}
// 어댑터 클래스 정의
package ex03;
import ex03.lib.OuterRabbit;
public class RabbitAdapter extends Animal {
private OuterRabbit rabbit;
public RabbitAdapter(OuterRabbit rabbit) {
this.rabbit = rabbit;
}
@Override
String getName() {
return rabbit.getFullname();
}
}
// 어댑터 패턴 사용 예제
package ex03;
import ex03.lib.OuterRabbit;
public class App {
public static void main(String[] args) {
Animal mouse = new Mouse();
Animal tiger = new Tiger();
Doorman d1 = new Doorman();
d1.쫒아내(tiger);
d1.쫒아내(mouse);
RabbitAdapter rabbit = new RabbitAdapter(new OuterRabbit());
d1.쫒아내(rabbit);
}
}
- 이 예제에서
OuterRabbit
클래스는 기존의Animal
클래스와 호환되지 않지만,RabbitAdapter
클래스를 통해OuterRabbit
을Animal
처럼 사용할 수 있게 됩니다. 어댑터 패턴을 사용하면 기존 클래스를 수정하지 않고도 새로운 클래스를 시스템에 통합할 수 있습니다.
■ 3. 정리
어댑터 패턴은 외부 라이브러리를 끌어와 사용하고 싶은데, 시스템과 맞지 않는 경우 이를 호환시켜 주는 패턴입니다. 마치 220V 전압을 5V로 낮춰주는 어댑터와 같은 역할을 합니다.
■ 어댑터 패턴을 사용하는 시점
- 이미 만들어진 클래스가 시스템에 호환되지 않을 때.
- 아직 만들어지지 않았지만, 특정 규격에 맞게 만들 필요가 있을 때.
■ 알아두어야 할 것
- 어댑터 패턴은 기존에 호환되지 않는 무언가가 있을 때 사용됩니다.
- 프록시 패턴은 기존 클래스에 부가 기능을 추가할 때 사용됩니다.
정리 사이트 참고
Share article