본문 바로가기
Java&Spring

[디자인패턴] Adaptor

by JINJINC 2025. 1. 9.
728x90
반응형

어댑터 패턴 (Adapter Pattern)


1. 어댑터 패턴이란?

어댑터 패턴은 호환되지 않는 인터페이스를 가진 클래스들 간에 호환성을 제공하기 위한 구조적 디자인 패턴입니다.
즉, 서로 다른 인터페이스를 가진 객체들이 함께 동작할 수 있도록 중간 역할을 수행하는 클래스(어댑터)를 정의합니다.


어댑터 패턴의 주요 특징

  1. 중재 역할: 두 객체 사이에서 서로 다른 인터페이스를 연결.
  2. 호환성 제공: 기존 코드를 수정하지 않고도 새로운 코드와 함께 동작 가능.
  3. 유연성 증가: 코드 변경 없이 다양한 상황에 재사용 가능.

코드 분석

1. 인터페이스 정의

  • IElectronic220v와 IElectronic110v는 각각 220v와 110v 전자 기기를 연결하기 위한 인터페이스입니다.
interface IElectronic220v {
    void connect();
}

interface IElectronic110v {
    void connect();
}

2. 기기 클래스

  • HairDryer는 110v 전압을 사용하는 기기입니다.
  • AirConditional은 220v 전압을 사용하는 기기입니다.
class HairDryer implements IElectronic110v {
    @Override
    public void connect() {
        System.out.println("헤어드라이어 연결하기");
    }
}

class AirConditional implements IElectronic220v {
    @Override
    public void connect() {
        System.out.println("에어컨 연결 220v");
    }
}

3. 어댑터 클래스

  • ElectronicAdapter는 110v 기기를 220v 전압에 맞게 연결하도록 변환합니다.
  • IElectronic220v 인터페이스를 구현하여 220v 전압을 지원.
  • 내부적으로 110v 인터페이스를 구현한 객체를 받아, 이를 220v 스펙에 맞게 연결합니다.
public class ElectronicAdapter implements IElectronic220v {
    private IElectronic110v iElectronic110v;

    public ElectronicAdapter(IElectronic110v iElectronic110v) {
        this.iElectronic110v = iElectronic110v;
    }

    @Override
    public void connect() {
        iElectronic110v.connect();
        System.out.println("어댑터를 통해 110v 타입의 기기를 220v 스펙에 연결합니다.");
    }
}

4. 클라이언트 코드

  • MyHouse 클래스는 220v 인터페이스를 지원하는 기기만 연결할 수 있습니다.
  • HairDryer는 110v 기기이므로 바로 연결할 수 없고, ElectronicAdapter를 통해 연결합니다.
public class MyHouse {
    public static void homeConnect(IElectronic220v iElectronic220v) {
        iElectronic220v.connect();
    }

    public static void main(String[] args) {
        HairDryer hairDryer = new HairDryer();
        AirConditional airConditional = new AirConditional();

        // 어댑터를 사용하여 110v 기기를 220v에 연결
        ElectronicAdapter adapterHairDryer = new ElectronicAdapter(hairDryer);
        homeConnect(adapterHairDryer);

        // 220v 기기는 바로 연결
        homeConnect(airConditional);
    }
}

실행 결과

헤어드라이어 연결하기
어댑터를 통해 110v 타입의 기기를 220v 스펙에 연결합니다.
에어컨 연결 220v
 
  • ElectronicAdapter를 통해 110v 기기인 HairDryer를 220v 전압에 맞춰 연결.
  • AirConditional은 바로 연결 가능합니다.

어댑터 패턴의 구성 요소

  1. Target Interface: 호환성을 맞추기 위해 필요한 인터페이스 (IElectronic220v).
  2. Adaptee: 기존의 호환되지 않는 인터페이스를 가진 클래스 (HairDryer).
  3. Adapter: Adaptee를 Target Interface에 맞게 변환하는 클래스 (ElectronicAdapter).
  4. Client: Target Interface를 사용하여 동작하는 코드 (MyHouse).

어댑터 패턴의 장단점

장점

  1. 호환성 제공: 기존 클래스 코드를 수정하지 않고 다른 클래스와 호환 가능.
  2. 재사용성 증가: 다양한 환경에서 기존 코드를 재사용 가능.
  3. 유연성 제공: 클라이언트 코드의 변경 없이 새로운 어댑터를 추가하여 확장 가능.

단점

  1. 구현 복잡성 증가: 어댑터 클래스가 많아지면 코드가 복잡해질 수 있음.
  2. 성능 이슈: 변환 과정에서 약간의 성능 저하가 발생할 수 있음.

어댑터 패턴의 활용 사례

  1. 레거시 코드 통합
    • 기존 시스템과 새로운 시스템을 연결할 때.
  2. API 통합
    • 서로 다른 인터페이스를 가진 외부 API와 연동할 때.
  3. UI 프레임워크
    • 다양한 데이터 소스와 UI 요소 간의 데이터 변환.

결론

어댑터 패턴은 인터페이스 호환성 문제를 해결하기 위한 강력한 도구입니다.
특히 기존 코드를 변경하지 않고도 새로운 시스템과 통합할 수 있어 유지보수성과 확장성이 높은 설계를 가능하게 합니다. 😊

728x90
반응형

댓글