Adapter 패턴이란?
어댑터(Adapter) 패턴은 서로 다른 두 개체를 연결하여 인터페이스 호환성을 제공하는 패턴입니다. 어댑터 패턴은 새로운 인터페이스를 만들어 기존의 클래스를 활용할 수 있게끔 하거나, 기존의 인터페이스를 수정하지 않고 다른 인터페이스를 활용할 수 있게끔 도와줍니다.
Adapter 패턴의 구성요소
일반적으로 어댑터 패턴은 다음과 같은 세 가지 구성요소를 가지고 있습니다.
- Target: 어댑터 패턴을 통해 새롭게 생성되는 인터페이스를 나타냅니다.
- Adaptee : 새로운 인터페이스에 맞추어야 하는 기존 클래스를 나타냅니다.
- Adapter : 기존 클래스를 새로운 인터페이스에 맞게끔 변환시켜 주는 클래스를 나타냅니다.
Adapter 패턴의 클래스 다이어그램
다음은 어댑터 패턴의 클래스 다이어그램(Class Diagram)입니다.
클래스 다이어그램에서 Taget은 추상클래스 또는 인터페이스를 나타내며, Adaptee는 기존 클래스를 나타냅니다. Adapter클래스는 기존 클래스를 새로운 인터페이스에 맞게 변환시키는 클래스입니다. Adapter 클래스는 Target 인터페이스를 구현하며, Adaptee 클래스를 감싸고 있습니다. Adapter 클래스는 Adaptee 클래스의 인스턴스를 가지고 있습니다.
Adapter 패턴의 C++ 구현 예제
다음은 어댑터 패턴을 C++로 구현한 예제입니다.
#include <iostream>
#include <string>
class Target {
public:
virtual ~Target() {}
virtual void request() = 0;
};
class Adaptee {
public:
void specificRequest() {
std::cout << "Adaptee::specificRequest()" << std::endl;
}
};
class Adapter : public Target {
public:
Adapter(Adaptee* adaptee) : adaptee_(adaptee) {}
void request() override {
adaptee_->specificRequest();
}
private:
Adaptee* adaptee_;
};
int main() {
Adaptee* adaptee = new Adaptee;
Target* target = new Adapter(adaptee);
target->request();
delete target;
delete adaptee;
return 0;
}
위 예제에서 Target 클래스는 새로운 인터페이스를 나타내며, Adaptee 클래스는 새로운 인터페이스와 호환되지 않는 기존 클래스를 나타냅니다. Adapter 클래스는 Target 인터페이스를 구현하고, Adaptee 클래스를 감싸며, 두 클래스 간 호환성을 제공합니다.
Apdaptee 클래스의 specificRequest 함수는 새로운 인터페이스와 호환되지 않는 함수입니다. 이 함수를 호출하기 위해 Adapter 클래스가 생성됩니다. Adapter 클래스의 생성자에서 Adaptee 클래스의 인스턴스를 전달받아, adaptee_ 멤버 변수에 저장합니다. Adapter 클래스의 request 함수는 Target 인터페이스를 구현하며, adaptee_ 멤버 변수의 specificRequest함수를 호출합니다.
메인 함수에서 Adaptee 클래스의 인스턴스를 생성한 후 Adapter 클래스를 생성하여 Target 클래스의 포인터에 할당합니다. Target 클래스의 request 함수가 호출될 때 Adapter 클래스의 request 함수가 실행되어 Adaptee 클래스의 specificRequest 함수를 호출합니다.
이러한 과정을 통해 Adaptee 클래스를 새로운 인터페이스와 호환되게끔 변환시켜주는 Adapter 클래스를 생성하고 Target 인터페이스를 구현함으로써 새로운 인터페이스와 호환되는 객체를 생성할 수 있습니다.
Adapter 패턴의 C# 구현 예제
다음은 C#에서의 예제를 보겠습니다.
using System;
namespace DesignPatternExam
{
interface ITarget
{
void Request();
}
class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("Adaptee::SpecificRequest()");
}
}
class Adapter : ITarget
{
private Adaptee adaptee = new Adaptee();
public void Request()
{
adaptee.SpecificRequest();
}
}
class Program
{
static void Main(string[] args)
{
ITarget target = new Adapter();
target.Request();
}
}
}
C++ 예제와 비슷하게, C#에서의 어댑터 패턴은 Target 인터페이스, Adaptee 클래스, Adapter 클래스로 이루어져 있습니다. Target 인터페이스와 Adapter 클래스는 C++ 예제와 비슷하게 구현되어 있습니다. 다만 C#에서는 인터페이스를 구현할 때 interface 키워드를 사용합니다.
참고로 클래스 다이어그램을 그릴때 사용한 사이트에 대해서 링크를 걸어두겠습니다.
위 사이트에 대해서 간단히 설명하자면 UML, ERD, 순서도, 마인드맵 등 다양한 다이어그램을 그릴 수 있는 웹 기반의 무됴 도구입니다. 다양한 종류의 템플릿을 제공하며, 작업한 다이어그램을 저장하고 내보내기 기능등을 제공합니다.
댓글