2022-03-04 @이영훈
어댑터 패턴
클래스의 인터페이스를 사용자가 기대하는 인터페이스 형태로 변환시킵니다. 서로 일치하지 않는 인터페이스를 갖는 클래스들을 함께 동작시킵니다.
어댑터 패턴의 장점
•
기존의 코드를 수정하지 않고 어댑터를 만들어 서로 다른 인터페이스를 동작시킵니다
동물과 물고기 예시
Animal 인터페이스와 그 구현체인 Cat과 Dog가 있습니다.
// Animal.java
public interface Animal {
void walk();
}
Java
복사
// Cat.java
public class Cat implements Animal {
@Override
public void walk() {
System.out.println("Cat walks");
}
}
Java
복사
// Dog.java
public class Dog implements Animal {
@Override
public void walk() {
System.out.println("Dog walks");
}
}
Java
복사
그리고 다른 인터페이스를 사용하는 Fish가 있습니다.
Fish는 swim 기능이 있습니다. Animal과 인터페이스가 달라 문제가 생깁니다. 
// Fish.java
public class Fish {
public void swim() {
System.out.println("Fish swims");
}
}
Java
복사
코드를 실행해보면 에러가 발생합니다.
public class AdapterApplication {
public static void main(String[] args) {
Cat cat = new Cat();
cat.walk();
Dog dog = new Dog();
dog.walk();
// ⭐️ 원하는 기능: fish를 걷게 하고 싶다 (동일한 인터페이스를 사용하고 싶다)
Fish fish = new Fish();
fish.walk(); // 😛 당연히 에러
}
}
Java
복사
인터페이스를 맞추는 방법
위의 문제를 해결하는 방법을 생각해보면,
1.
기존 코드(Fish.java)를 수정한다.
2.
기존 코드(Fish.java)를 건드리지 않고 수정한다.
이렇게 두 가지가 있습니다.
첫 번째 방법, 기존 코드(Fish.java)를 수정해서 해결하는 방법은 간단합니다. Fish에 walk 기능을 추가하면 됩니다.
그런데 요구 사항이 계속 추가되면 기존 코드를 계속 수정해야합니다.
인터페이스를 맞추기 위해 기존 코드를 계속 수정하는 게 바람직하지 않습니다.
•
Fish의 핵심 로직, 핵심 기능을 이해하기 힘들어진다.
◦
외부 인터페이스를 맞추기 위해 작성한 코드가 핵심 로직, 핵심 기능보다 더 많아질 가능성이 있다.
•
내부 코드를 수정하지 못하는 경우도 있을 수 있다. (라이브러리, 시스템)
두 번째 방법, 기존 코드(Fish.java)를 건드리지 않고 인터페이스를 맞추는 방법이 어댑터 패턴 (Adapter Pattern)입니다.
어댑터 패턴은 서로 다른 인터페이스를 어댑터를 사용해서 중간에서 맞춰줍니다.
public class FishAdapter implements Animal {
private Fish fish;
public FishAdapter(Fish fish) {
this.fish = fish;
}
@Override
public void walk() {
fish.swim();
}
}
Java
복사
이를 다이어그램으로 나타내면 다음과 같습니다
어댑터 패턴 코드에 적용하기
FishAdapter에 fish 인스턴스를 파라미터로 넣어서 인터페이스가 맞춰진 (adapted) fish를 생성합니다.
adaptedFish는 walk 기능이 있으니 정상적으로 동작합니다.
public class AdapterApplication {
public static void main(String[] args) {
Cat cat = new Cat();
// "Cat walks"
cat.walk();
Dog dog = new Dog();
// "Dog walks"
dog.walk();
Fish fish = new Fish();
FishAdapter adaptedFish = new FishAdapter(fish);
// "Fish swims"
adaptedFish.walk(); // ✅ 인터페이스가 맞춰진 fish는 걸을 수 있다
}
}
Java
복사