개발
home
🔌

[디자인 패턴] Adapter Pattern. 어댑터 패턴 Java

Created
2022/03/04
Tags
Design Pattern
Adapter Pattern
Java
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
복사

Ref.