Adapter

호환되지 않는 인터페이스를 가진 개체가 함께 작동할 수 있도록 하는 구조적 디자인 패턴

이는 호환되지 않는 두 인터페이스 사이의 브리지 역할을 하여 기존 클래스의 소스 코드를 변경하지 않고도 호환되도록 만든다. 이 패턴은 재사용하거나 새 시스템에 통합하려는 기존 클래스(또는 시스템)가 있지만 해당 인터페이스가 새 시스템에 필요한 것과 일치하지 않을 때 유용하다.

어댑터 패턴의 구성

  • 대상 인터페이스: 클라이언트 코드가 사용할 인터페이스

  • Adaptee: 수정하려는 기존 클래스 또는 시스템

  • Adapter: Adaptee가 대상 인터페이스와 호환되도록 변환하는 클래스

// 적용 시키려는 기존 시스템
class OldSystem {
    public double getTemperatureInCelsius() {
        return 59.0;
    }
}

// 새로운 시스템을 위한 인터페이스
interface NewSystemInterface {
    double getTemperatureInCelsius();

    double getTemperatureInFahrenheit();
}

// 기존 시스템을 새로운 시스템에 적용하기 위한 어댑터
class Adapter extends OldSystem implements NewSystemInterface {
    @Override
    public double getTemperatureInCelsius() {
        return super.getTemperatureInCelsius();
    }

    @Override
    public double getTemperatureInFahrenheit() {
        return (getTemperatureInCelsius() * 9 / 5) + 32;
    }
}

class Client {
    public static void main(String[] args) {
        NewSystemInterface newSystem = new Adapter();

        double celsiusTemperature = newSystem.getTemperatureInCelsius();
        double fahrenheitTemperature = newSystem.getTemperatureInFahrenheit();

        System.out.println("섭씨 온도: " + celsiusTemperature);
        System.out.println("화씨 온도: " + fahrenheitTemperature);
    }
}

어댑터 패턴의 이점

  • 재사용성: 새 코드와 호환되지 않는 기존 클래스 재사용 가능

  • 관심사항 분리: Adaptee 작동 방식에 대한 세부사항과 클라이언트 코드를 분리

  • 유연성: 여러 Adaptee를 단일 대상 인터페이스에 적용할 수 있어 유연성이 향상

  • 레거시 시스템 통합: 코드를 변경하지 않고 레거시 시스템을 최신 시스템에 통합할 수 있음

어댑터 패턴 사용 사례의 예

  • 라이브러리 통합: 애플리케이션의 인터페이스 요구 사항을 준수하지 않는 라이브러리가 있는 경우 가능한 인터페이스를 제공하는 어댑터 생성하여 라이브러리를 사용

  • 하드웨어 통합: 하드웨어 장치를 다룰 때 어댑터를 사용하여 하드웨어와 소프트웨어 간 호환성을 제공

  • API 버전 호환성: API가 변경되거나 업데이트될 때 이전 버전의 API와의 호환성을 유지하기 위해 어댑터를 사용

  • 데이터베이스 드라이버: 어댑터를 사용하면 다양한 데이터베이스 드라이버가 공통 데이터베이스 액세스 인터페이스를 구현하도록 할 수 있음(예: JDBC)

요약하면, 어댑터 패턴은 호환되지 않는 두 인터페이스 사이의 변환기 역할을 하여 두 인터페이스가 원활하게 함께 작동할 수 있도록 한다.

Last updated

Was this helpful?