Skip to content

어댑터 패턴 (Adapter pattern)

Seyoung Oh edited this page Mar 24, 2021 · 2 revisions

목차


어댑터 패턴 (Adapter pattern)

클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴 출처: 위키백과

어댑터 패턴에는 2가지의 종류가 있다.
하나는 모든 객체 지향 언어에서 이용가능한 객체 어댑터,
다른 하나는 다중상속이 가능한 C++에서만 이용가능한 클래스 어댑터 다.

다이어그램

객체 어댑터(좌) / 클래스 어댑터(우)
출처: 위키피디아

각 어댑터 패턴의 장단점

객체 어댑터 클래스 어댑터
장점 상속이 아닌 구성을 사용하기 때문에 더 유연하다. 1. Adapter가 Adaptee의 서브클래스이기 때문에 Adaptee의 행동을 오버라이드 할 수 있다.
2. Adaptee 객체를 만들지 않아도 된다.
단점 Adaptee 객체를 만들어야 사용가능하다. 1. 상속을 이용하기 때문에 한 Adapter 클래스가 특정 Adatee 클래스에만 적용가능하다.
2. 다중상속이 지원되는 언어에서만 사용가능하다.

출처: 서기리보이의 블로그

예제 (객체 어댑터)

C to 라이트닝 젠더C# 출처: 위키피디아

Target(추상) 인터페이스

interface TypeCPhone
{
    void recharge();
    void useTypeC();
}

Adaptee(추상) 인터페이스

interface LightningPhone
{
    void recharge();
    void useLightning();
}

Adapter 클래스

class TypeCToLightningAdapter : TypeCPhone
{
    private readonly LightningPhone lightningPhone;

    public TypeCToLightningAdapter (LightningPhone lightningPhone)
    {
        this.lightningPhone = lightningPhone;
    }

    public void useTypeC()
    {
        Console.WriteLine("C타입 → 라이트닝 어댑터 연결");
        lightningPhone.useLightning();
    }

    public void recharge()
    {
        lightningPhone.recharge();
    }
}

Concrete 클래스들

class Iphone : LightningPhone
{
    private bool connector;

    public void useLightning()
    {
        connector = true;
        Console.WriteLine("라이트닝 커넥터 인식됨");
    }

    public void recharge()
    {
        if (connector)
        {
            Console.WriteLine("※충전 시작");
            Console.WriteLine("※충전 완료");
        }
        else
        {
            Console.WriteLine("※라이트닝을 연결해 주세요");
        }
    }
}
class Android : TypeCPhone
{
    private bool connector;

    public void useTypeC()
    {
        connector = true;
        Console.WriteLine("C타입 커넥터 인식됨");
    }

    public void recharge()
    {
        if (connector)
        {
            Console.WriteLine("※충전 시작");
            Console.WriteLine("※충전 완료");
        }
        else
        {
            Console.WriteLine("※C타입을 연결해 주세요");
        }
    }
}

메인 클래스

class MainClass
{
    static void rechargeTypeCPhone(TypeCPhone phone)
    {
        phone.useTypeC();
        phone.recharge();
    }

    static void rechargeLightningPhone(LightningPhone phone)
    {
        phone.useLightning();
        phone.recharge();
    }
    static void Main(string[] args)
    {
        Android android = new Android();                                        //타겟
        Iphone iPhone = new Iphone();                                           //어댑티

        Console.WriteLine("안드로이드폰 충전중 : C타입 케이블");
        rechargeTypeCPhone(android);

        Console.WriteLine("\n아이폰 충전중 : 라이트닝 케이블");
        rechargeLightningPhone(iPhone);

        Console.WriteLine("\n아이폰 충전중 : C타입 케이블");
        TypeCToLightningAdapter adapter = new TypeCToLightningAdapter(iPhone);  //어댑터
        rechargeTypeCPhone(adapter);
    }
}

출력 결과

안드로이드폰 충전중 : C타입 케이블
C타입 커넥터 인식됨
※충전 시작
※충전 완료

아이폰 충전중 : 라이트닝 케이블
라이트닝 커넥터 인식됨
※충전 시작
※충전 완료

아이폰 충전중 : C타입 케이블
C타입 → 라이트닝 어댑터 연결
라이트닝 커넥터 인식됨
※충전 시작
※충전 완료

어댑터 패턴과 데코레이터 패턴의 차이점

데코레이터 패턴 인터페이스을 바꾸지 않고 책임(기능)만 추가
어댑터 패턴 한 인터페이스를 다른 인터페이스로 변환
Clone this wiki locally