오늘 공부할 패턴은 구조패턴 중 하나인 어댑터 패턴입니다.
어댑터는 우리 일생 생활에 사용하는 그 어댑터의 의미를 가져오면 됩니다.
어댑터의 정의는 다른 전기나 기계 장치를 서로 연결해서 작동할 수 있도록 만들어 주는 결합 도구 입니다.
위 정의를 빌려 객체에 대입해봅시다. 객체 어댑터는 서로 연결할 수 없는 두 객체를 서로 연결해서 작동할 수 있도록 만들어주는 구현 객체입니다. 예를 보면서 이해해봅시다.
아래 오리와 칠면서 인터페이스가 있습니다.
public interface Duck {
void sound();
void fly();
}
public interface Turkey {
void sound2();
void fly();
}
그리고 오리 인터페이스를 구현한 청둥오리 구현체와 칠면조 인터페이스를 구현한 야생 칠면조 구현체입니다.
public class Mallard implements Duck{
@Override
public void sound() {
System.out.println("꽥꽥");
}
@Override
public void fly() {
System.out.println("10m를 날아갔습니다!");
}
}
public class WildTurkey implements Turkey{
@Override
public void sound2() {
System.out.println("뾱뾱");
}
@Override
public void fly() {
System.out.println("5m를 날아갔습니다!");
}
}
여기까지 중요한 부분을 살펴보자면 서로 이어질 수 없는 (sound <-> sound2) 두 인터페이스가 있습니다. 그리고 그 인터페이스를 각각 구현한 구현체가 있습니다.
다음은 청둥오리와 야생칠면조를 실행시킬 메인 함수입니다.
public static void main(String[] args) {
Duck mallard = new Mallard();
mallard.sound();
mallard.fly();
Turkey wildTurkey = new WildTurkey();
wildTurkey.sound2();
wildTurkey.fly();
}

실행 결과는 위와 같습니다. 이제 도대체 어댑터를 언제 어떻게 사용하냐? 이런 생각이 드실겁니다.
어댑터를 사용하기 위해서는 다음과 같은 상황이 필요합니다. 청둥오리가 갑자기 죽게되었고 오리를 대체할 무언가가 필요하게 되었습니다. 지금 오리를 대체할 수 있는 것은 야생 칠면조 밖에 없습니다. 하지만 야생칠면조는 칠면조 인터페이스를 구현하고 있기 때문에 오리 인터페이스를 대체할 수 없습니다. 이런 문제를 해결하기 위해 어댑터 패턴이 등장합니다.
어댑터 패턴은 서로 다른 두 인터페이스 사이를 연결시켜줍니다. 위 상황의 경우 구현할 수 없는 오리 인터페이스를 야생 칠면조를 사용하여 구현합니다. 코드를 보며 이해해봅시다.
public class TurkeyAdapter implements Duck{
private Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
@Override
public void sound() {
turkey.sound2();
}
@Override
public void fly() {
turkey.fly();
turkey.fly();
}
}
칠면조 어댑터입니다. 중요한 부분은 우선 오리 인터페이스를 구현하였습니다. 그리고 Turkey 인터페이스를 멤버변수로 갖고 생성자로 받습니다. 그리고 Turkey 인터페이스를 활용하여 Duck의 기능들을 구현합니다. 다시 메인함수로 가봅시다.
public static void main(String[] args) {
Duck mallard = new Mallard();
mallard.sound();
mallard.fly();
Turkey wildTurkey = new WildTurkey();
wildTurkey.sound2();
wildTurkey.fly();
Duck adapterTurkey = new TurkeyAdapter(wildTurkey);
adapterTurkey.sound();
adapterTurkey.fly();
}

Duck을 구현한 adapterTurkey는 Duck이라고 알고있고 그 속이 어떻게 구현되어 있는지는 모릅니다. Turkey로 구현하여 오리소리를 내지못해도 Turkey 소리로 대체하고 10m나 날수있는 오리랑 비슷하게 날기위해 5m씩 두번 날라가게 구현한 걸 알 수 있습니다.
이렇게해서 서로 연결될 수 없었던 오리와 칠면조가 연결되어 구현할 수 있습니다.
장점
- 기존 코드를 변경하지 않고 구현할 수 있습니다.
단점
- 클래스를 증가시켜 복잡도가 늘어납니다.
- 대부분 코드를 다시 작성하기 때문에 효율적이지 못합니다.
'리팩토링 > 디자인패턴' 카테고리의 다른 글
| [디자인 패턴] 템플릿 메서드 패턴 (1) | 2022.12.10 |
|---|---|
| [디자인패턴] 퍼사드 패턴 (1) | 2022.11.26 |
| [디자인패턴] 팩토리 메서드 패턴, 추상 팩토리 패턴 (1) | 2022.10.30 |
| [디자인패턴] 싱글턴 패턴 (2) | 2022.10.24 |
| [디자인패턴] 옵저버 패턴 (4) | 2022.10.14 |