서론에서 언급했듯이 보통 어댑터를 전압에 따라 교체합니다. 스마트폰 충전기도 태블릿이냐 노트북이냐에 따라서 20w 어댑터로 교체하고 50w 어댑터로 교체하기도 하고 하죠. 이처럼 어댑터를 우리 입맛에 맞춰서 바꿔서 이용합니다. 이처럼 어댑터 패턴
도 인터페이스를 사용자의 입맛에 맞춰서 쓸 수 있게 해줍니다.
어댑터 패턴
은 인터페이스를 사용자가 원하는 기능에 맞도록 변화시켜주는 패턴입니다. 위의 예시에서 콘센트와 전자 제품은 객체고 어댑터가 인터페이스가 되는 것 입니다. 콘센트 객체에 맞춰 110v 인터페이스를 넣으면 110v로 이용할 수 있게 되고, 220v 인터페이스를 넣으면 220v로 이용할 수 있게 해줍니다. 어댑터 패턴
은 구조 패턴에 포함됩니다.
어댑터 패턴
이 어떻게 원하는 기능에 맞춰 변화시키는지 구현을 하며 확인해보겠습니다.
제 경험을 소개하자면, 삼성과 애플사의 휴대전화, 웨어러블 기기를 모두 사용했었습니다. 그러다보니 웨어러블 기기의 호환성이 문제가 됐었는데요. 두 회사 모두 자사의 웨어러블 기기는 알아서 작동이 되지만, 타사의 웨어러블 기기를 이용하기 위해서는 특정 어플을 이용해서 연동을 해야했습니다. 그래서 이 주제를 가지고 어댑터 패턴을 구현해보겠습니다.
우선 애플과 삼성의 워치 클래스를 만들었습니다.
public class AppleWatch {
public AppleWatch() {
System.out.println("애플워치");
}
public void appleFitness() {
System.out.println("애플워치로 운동 측정");
}
}
public class GalaxyWatch {
public GalaxyWatch() {
System.out.println("갤럭시워치");
}
public void galaxyFitness() {
System.out.println("갤럭시워치 운동 측정");
}
}
이처럼 같은 기능을 하더라도 두 제품의 메소드명이 다름을 알 수 있죠. 그래서 우리는 아이폰에서 갤럭시 워치를 쓰기 위해 어댑터를 이용해야합니다.
public interface GalaxyWatchInterface {
void galaxyFitness();
}
public class GalaxyWatchAdapter extends GalaxyWatch implements GalaxyWatchInterface {
public GalaxyWatchAdapter(){
System.out.println("아이폰에 갤럭시워치 연결");
}
@Override
public void galaxyFitness() {
super.galaxyFitness();
}
}
갤럭시워치 클래스의 galaxyFitness 클래스를 이용하기 위해서 인터페이스를 설계했습니다. 이 과정을 통해 추후에 어댑터 패턴을 사용해서 아이폰에서 갤럭시 워치의 galaxyFitness를 이용할 수 있게 됩니다.
어댑터 결과를 보기위해 아이폰 클래스도 만들어봐야겠죠? 다음 코드를 보시면 어댑터 클래스를 통해서 galaxyFitness에 접근했음을 알 수 있습니다.
public class IPhone {
public IPhone() {
AppleWatch appleWatch = new AppleWatch();
appleWatch.appleFitness();
}
public void pairingGalaxyWatch() {
GalaxyWatchAdapter galaxyWatchAdapter = new GalaxyWatchAdapter();
galaxyWatchAdapter.galaxyFitness();
}
}
마지막으로 메인 메소드와 결과입니다.
public class AdapterMain {
public static void main(String[] args) {
IPhone iPhone = new IPhone();
System.out.println();
iPhone.pairingGalaxyWatch();
}
}
어댑터 패턴은 세부적으로 다시 두가지로 나뉩니다. 하나는 클래스 어댑터
라고 하고 다른 하나는 객체 어댑터
라고 합니다. 클래스 어댑터는, 상속을 이용한 방식이고, 객체 어댑터는 구성을 사용한 방식입니다. 위에서 본 예시는 상속으로 어댑터를 만들었으니 클래스 어댑터라고 할 수 있습니다.
두 어댑터의 차이를 간단히 표로 만들었습니다.