꼬꼬마 블로그

꼬꼬마의 기술 블로그

객체지향 디자인 패턴 중 하나인 어댑터 패턴에 대해 알아보겠습니다.

사용되는 예제는 모두 타입스크립트로 작성되었습니다.

뭘 하고싶은 걸까요?

어댑터 패턴을 통해 해결하고 싶은 문제는 무엇일까요?

interface Printer {
  print();
}

interface ColorPrinter {
  printColor();
}

class BasicPrinter implements Printer {
  print() {
    console.log('기본 프린터가 출력 중 입니다');
  }
}

class RGBPrinter implements ColorPrinter {
  printColor() {
    console.log('색상 프린터가 출력 중 입니다');
  }
}

const printers: Printer[] = [
  new BasicPrinter(),
  new RGBPrinter(), // 오류 발생
]

for (const printer of printers) {
    printer.print();
}

위의 예제는 new RGBPrinter()에서 오류가 발생합니다. 그 이유는 printersPrinter[] 타입입니다.
하지만 예상과는 달리 RGBPrinterColorPrinter를 상속 받으며 Printer와는 아무런 연관이 없습니다.

 

음.. 이름만 보면 당연히 될것 같은데 말이죠. 이런 상황을 해결하기 위해 어댑터 패턴이 사용됩니다.

어댑터 패턴

위키백과

어댑터 패턴(Adapter pattern)은 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해준다.

 

Printer 예제를 생각하며 의미를 살펴보면 더 쉽게 이해할 수 있습니다.

 

그렇다면 위의 예제를 어댑터 패턴을 통해 해결해보겠습니다.

interface Printer {
  print();
}

interface ColorPrinter {
  printColor();
}

class BasicPrinter implements Printer {
  print() {
    console.log('기본 프린터가 출력 중 입니다');
  }
}

class RGBPrinter implements ColorPrinter {
  printColor() {
    console.log('색상 프린터가 출력 중 입니다');
  }
}

class Adapter implements Printer {
  constructor(private colorPrinter: ColorPrinter) { }

  print() {
    this.colorPrinter.printColor();
  }
}

const printers: Printer[] = [
  new BasicPrinter(),
  new Adapter(new RGBPrinter()),
]

for (const printer of printers) {
  printer.print();
}

위와 같이 Printer를 구현한 Adapter를 만들어 줍니다. 이때 생성자를 통해 호환시켜줄 ColorPrinter 객체를 받으며 print메서드를 구현합니다.

 

어댑터 패턴은 위와 같이 표현합니다. 처음부터 이 그림을 본다면 이해를 못하겠지만 이제 이해할 수 있습니다. 이 그림을 우리의 예제에 맞도록 수정해보겠습니다.

 

이렇게 수정할 수 있겠죠? 두개의 그림을 비교하면 쉽게이해할 수 있습니다.

'개발 > 객체지향' 카테고리의 다른 글

빌더 패턴 (Builder Pattern)  (0) 2021.03.29
객체지향 SOLID 원칙  (2) 2021.03.27
싱글톤 패턴 (Singleton Pattern)  (0) 2020.08.06