[Java] 디자인패턴 : 어댑터(Adapter) 패턴

어댑터 패턴(Adapter Pattern)은 서로 호환되지 않는 인터페이스를 가진 두 개의 클래스를 연결하기 위해 사용하는 구조적 디자인 패턴이다.
HootJem's avatar
Aug 13, 2024
[Java] 디자인패턴 : 어댑터(Adapter) 패턴

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을 상속받지 않기 때문에, DoormanOuterRabbit 객체를 처리할 수 없다. 이 문제를 해결하기 위해 어댑터 패턴을 사용.
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

[HootJem] 개발 기록 블로그