어댑터 패턴 (Adpater Pattern)
서로 다른 인터페이스를 가진 클래스들을 함께 동작하도록 연결하는 디자인 패턴이다.
기존 시스템을 건드리지 않고, 새로운 클래스나 라이브러리를 기존 구조에 자연스럽게 통합할 때 유용하다.
가장 직관적인 비유는 플러그 변환기 다.
220V 콘센트에 110V 기기를 연결하려면 어댑터가 필요하듯,
소프트웨어에서도 기존 코드의 인터페이스와 새 클래스의 인터페이스가 맞지 않을 때 이를 변환해주는 역할을 한다.
기본 구성은 다음 세가지로 이루어진다.
| Target (목표 인터페이스) | 클라이언트가 기대하는 인터페이스 |
| Adaptee (적응될 클래스) | 기존 시스템과 호환되지 않는 외부 클래스 |
| Adapter (어댑터) | Target 인터페이스를 구현하면서 내부적으로 Adaptee를 호출하여 변환 |
다음은 다리로 걷는 동물들의 걷기 시스템을 물고기 클래스에도 호환시키는 예시다.
// Target: 클라이언트가 기대하는 인터페이스
public interface IWalker
{
void Walk();
}
// Adaptee: 원래 다리를 사용하지 않는 클래스
public class Fish
{
public void Swim()
{
Console.WriteLine("Fish is swimming!");
}
}
// Adapter: Fish를 IWalker 인터페이스로 변환
public class FishAdapter : IWalker
{
private Fish _fish;
public FishAdapter(Fish fish)
{
_fish = fish;
}
public void Walk()
{
// 내부적으로 swim을 대신 호출
_fish.Swim();
}
}
public abstract class Animal
{
public abstract void Walk();
}
public class Dog : Animal
{
public override void Walk() => Console.WriteLine("Dog is walking!");
}
public class Cat : Animal
{
public override void Walk() => Console.WriteLine("Cat is walking!");
}
class Program
{
static void Main()
{
Animal dog = new Dog();
Animal cat = new Cat();
IWalker fish = new FishAdapter(new Fish());
dog.Walk();
cat.Walk();
fish.Walk(); // 내부적으로 Swim() 실행
}
}
결과
// Dog is walking!
// Cat is walking!
// Fish is swimming!
즉 이런 식으로 어댑터는 "호출을 중계하고 변환하는 중간자" 역할을 수행한다.
이는 인터페이스 불일치를 해결하는 구조적 패턴이다.
장단점
장점
기존 코드를 수정하지 않고 확장 가능 (OCP 원칙 준수)
서로 다른 인터페이스를 자연스럽게 연결 가능
레거시 코드와 신기술을 병행 사용 가능
단점
클래스 수 증가로 인한 유지 보수 불편 및 가독성 저해
성능 오버헤드 : 단순 위임 호출이기 때문에 미세한 비용 증가 존재
근본적인 설계 문제를 해결하지 못함
즉, 어댑터 패턴을 많이 사용해야하는 경우 그냥 리팩토링을 고려하는 게 좋을 수 있다...
'C#' 카테고리의 다른 글
| VisualStudioCode(VSC) 에서 한글 깨짐 이슈 (0) | 2025.10.28 |
|---|---|
| Design Pattern - Singleton Pattern (싱글톤 패턴) (0) | 2025.10.20 |
| C# - 콘솔로 "2중 버퍼링 (Double Buffering)" 구현하기 (0) | 2025.10.15 |
| C# - GetAsnycKeyState() 기반 실시간 키 입력 처리 (0) | 2025.10.14 |
| C# - LockConsoleSize() : 콘솔 창 크기 고정 및 리사이즈 방지 (1) | 2025.10.14 |