모든 글은 유튜브 얄팍한 코딩사전에 출처를 두고있습니다.

이번에는 Adapter 패턴에 대해 알아보자.

Adapter?

어댑터 패턴은 간단하게 아래와 같이 정의할 수 있겠다.

내부 구조가 전혀 다른 클래스를 변경없이 끼우도록 하는 패턴

만약 220V의 전기 기구를 110V 콘센트에 사용하려면 어떻게 해야 할까?
상식적으로 110V 플러그가 달린 어댑터를 사용해야 함을 우린 알고있다.
그래서 바로 해당 패턴의 이름이 Adapter인 것이다.

사용 이유?

이전에 Strategy 패턴에서 학습했던 기억을 떠올려보자.
그 때 만들었던 검색 기능에 영화 분류를 추가하고 싶다.
그런데 시간이 없어 이미 만들어져있는 메서드를 가져다 쓴다고 해보자.

아래와 같이 다른 개발자의 메서드가 존재한다고 가정해보자.

스크린샷 2024-01-09 오전 12 07 44

우리가 기존에 만들었던 SearchStrategy 들과는 형태가 다르다.

스크린샷 2024-01-09 오전 12 12 03

함수 이름도 다르고 사용 방법도 다르기 때문에 호환되지 않는다.
이를 그냥 사용하려면 사용자 입장에서는 매우 불편할 것이다.
전혀 다른 메서드의 사용법을 새로 알아야 하기 때문이다.

개발자 입장에서 유지 보수에 있어서도 굉장히 불편할 것이다.
코드에 일관성이 없어, 가독성이 떨어질 것이고
코드를 직접 수정해야 하기 때문에, OCP에 위반된다.

이럴 때 Adapter 패턴을 사용하면 쉽게 해결할 수 있다!

구현

아래와 같이 어댑터 역할을 할 클래스를 따로 구현한다.

스크린샷 2024-01-09 오전 12 23 45

다른 Strategy들과 동일하게 search() 메서드를 사용하도록 한다.
search() 메서드 내에 해당 메서드의 함수를 은닉화하여,
사용자로 하여금 기존의 사용법과 동일하게 사용할 수 있도록 하는 것이다.

개발자의 입장에서도 사용자 코드를 따로 변경할 필요가 없다.
아래 사진의 코드와 같이 Strategy를 추가하는 확장 작업과,
동작할 프로그램에서 MovieMode로 변경하는 함수만 새로 만들어주는 확장 작업만 진행하면 쉽게 해당 기능을 구현할 수 있다.

스크린샷 2024-01-09 오전 12 35 40

장단점

기본적으로 Adapter 패턴의 장점은 다음과 같다.

  • 새로운 method에 대해 확장만을 목적으로 개발할 수 있다.
    • 기존의 코드를 변경하지 않고, Adapter 클래스만 추가해서 확장할 수 있다.
    • 이는 OCP 원칙을 준수한다.
  • 새로운 method에 문제가 발생하면, 쉽게 유지 보수가 가능하다.
    • 새로 추가한 Adapter 클래스만 조사하면 된다!
  • SRP 원칙을 준수하기 용이하다.

아래로는 Adapter 패턴의 단점이다.

  • 새로운 interface와 클래스가 추가되기 때문에, 복잡도는 증가한다.
  • 직접 클래스를 변경하는 것이 더 간단한 경우도 있다.
    • Trade-off를 잘 계산해보아야 한다.