
어댑터 패턴은 서로 다른 인터페이스를 가진 클래스들을 소스 코드를 변경하지 않고도 함께 동작하게 만들어 주는 패턴입니다. 이 패턴은 일상에서도 쉽게 볼 수 있는데, 안드로이드 폰과 아이폰의 충전 단자가 대표적인 예입니다.
아이폰은 라이트닝 단자를, 안드로이드는 마이크로핀 단자를 사용합니다. 둘은 서로 맞지 않지만, 변환기를 끼우면 한쪽 인터페이스를 다른 쪽이 기대하는 형태로 바꿔 줄 수 있습니다. 이 변환기 역할을 코드로 옮긴 것이 바로 어댑터입니다.
이런 상황을 TypeScript로 어떻게 구현할 수 있는지 코드 예제로 살펴보겠습니다.
typescriptinterface IIPhone { useLigthening:()=>void; } interface IAndroid { useMicroPin:()=>void; } class IPhone implements IIPhone { useLigthening() { console.log("being charged by lightening") } } class Galaxy implements IAndroid{ useMicroPin() { console.log("being charged by micro pin"); } } class LighteningToMicropinAdapter implements IAndroid{ iphone:IPhone; constructor(iphone:IPhone) { this.iphone = iphone } useMicroPin() { console.log("using micro pin, which is converting to lightening"); this.iphone.useLigthening(); } }
LighteningToMicropinAdapter는 IAndroid 인터페이스를 구현하므로 마이크로핀을 기대하는 쪽에서 그대로 사용할 수 있습니다. 내부적으로는 주입받은 IPhone 인스턴스의 useLigthening()을 호출해, 마이크로핀 요청을 라이트닝 동작으로 변환합니다. IPhone 클래스는 전혀 수정하지 않았다는 점이 핵심입니다.
어댑터 패턴은 이미 존재하는 클래스를 사용하고 싶지만 그 인터페이스가 우리가 필요로 하는 형태와 맞지 않을 때 유용합니다.
클래스를 전혀 변경하지 않고도 코드를 확장할 수 있고, 서로 다른 클래스들이 함께 동작하며 호환되도록 만들 수 있습니다. 이는 SOLID 원칙 중 하나인 개방-폐쇄 원칙(The Open-Closed Principle)과 관련이 있습니다.
// Comments