한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환시키는 패턴
서로 다른 인터페이스를 가진 두 클래스를 어댑터 클래스로 인터페이스를 통일시킵니다.
왜 클라이언트는 직접 Adaptee가 아닌 Target에 접근해서 Apdater로의 변환을 거치는 것일까요?
110V를 사용하는 전자제품 A, 220V를 사용하는 전자제품 B가 있습니다.
Client에서 A, B를 한 멀티탭에 꽂아 작동할 것입니다. 하지만 둘 중 하나는 변환이 필요합니다.
A에 어댑터를 이용해서 서로 다른 인터페이스를 사용하는 A, B를 같이 사용해봅시다.
위의 main대로 하면 오류가 발생합니다.
Exception in thread "main" java.lang.ClassCastException: class MachineA cannot be cast to class Volt220
Adapter 없이 110V A를 220V 멀티탭에 꽂으면 오류가 나죠? 그것처럼 호환이 안 되는 문제가 발생합니다.
저 부분을 주석처리하고 돌렸을 때의 콘솔창입니다.
B: 220v
Adapter use!(220V)
오류 없이 잘 나왔습니다.
어댑터 패턴은 돼지코(변환기)처럼 사이에서 변환 역할을 해주는 것입니다. 어렵지 않은 예제로 살펴보았습니다.
저희가 예시까지 본 구조는 Object Adapter입니다. class adapter와는 차이가 있습니다.
Class Adapter는 위처럼 다중상속을 이용합니다.
Adaptee와 Target을 다중상속하는 Adapter입니다. Adaptee를 상속이 아닌 조합(Composition)으로 사용하는 Object Adapter와는 차이가 있습니다.
두 가지를 비교해 보았습니다.
장점 | 상속이 아닌 조합(Composition)을 이용하기 때문에 유연합니다. | Adaptee의 모든 서브클래스에 대해 어댑터 사용 가능합니다. | ||
단점 | Adaptee 객체를 변수로 저장해야하기 때문에 객체를 생성해야 합니다. |
상속보다 조합 활용해야 하는 부분은 다음 링크를 참조해주세요. 상속보다는 조합(Composition)을 사용하자.
장점 | Adapter가 Adaptee의 서브클래스이기 때문에 Adaptee의 객체를 생성하지 않아도 됩니다. |
단점 | 상속을 이용하기 때문에 한 Adapter 클래스가 특정 Adaptee 클래스에만 적용됩니다. |
참고
감사합니다.
Text by Chaelin. Photographs by Chaelin, Unsplash.