Java

[JAVA] 디자인패턴 : 어댑터 패턴(Adapter Pattern)

연화 2025. 1. 13. 17:47

 

안녕하세요! 이번 포스팅에서는 디자인 패턴 중에서 **어댑터 패턴(Adapter Pattern)**에 대해 다뤄보려고 합니다.
어댑터 패턴은 개발 과정에서 자주 등장하는 호환성 문제를 해결하기 위해 사용되는 유용한 패턴 중 하나입니다.
특히, 서로 다른 인터페이스를 가진 객체들이 함께 동작해야 할 때 이 패턴을 통해 효율적으로 문제를 해결할 수 있습니다.

 

어댑터 패턴이란?

어댑터 패턴은 호환되지 않는 인터페이스를 가진 클래스들이 함께 동작할 수 있도록 중재 역할을 수행하는 디자인 패턴입니다.
기존 클래스의 인터페이스를 변경하지 않으면서도 새로운 요구사항을 수용할 수 있도록 변환기 역할을 합니다. 이를 통해 호환성 문제를 해결하고, 기존 코드를 수정하지 않고도 새로운 코드와 결합할 수 있습니다. 예를 들어, 110V 전압의 기기를 220V 전압의 콘센트에 연결하려면 어댑터가 필요하듯, 코드에서도 비슷한 상황이 발생할 때 이 패턴을 사용합니다.

 

어댑터 패턴의 구조

  1. 클라이언트(Client): 원하는 인터페이스를 통해 작업을 수행합니다.
  2. 타겟(Target): 클라이언트가 기대하는 인터페이스입니다.
  3. 어댑터(Adapter): 클라이언트가 기대하는 인터페이스를 구현하고, 실제로 동작할 수 있는 객체와 연결합니다.
  4. 어댑터 대상(Adaptee): 기존 인터페이스를 가진 클래스입니다. 이 클래스는 어댑터를 통해 변환되어 동작합니다.

 

Java로 구현하는 어댑터 패턴

1. 인터페이스 설계

110V와 220V 전압을 가진 기기들의 연결 방식을 인터페이스로 정의합니다.

interface IElectronic220v {
    void connect();
}

interface IElectronic110v {
    void connect();
}

 

2. 클래스 구현

  • HairDryer: 110V 전압의 기기입니다.
  • AirConditioner: 220V 전압의 기기입니다.
class HairDryer implements IElectronic110v {
    @Override
    public void connect() {
        System.out.println("드라이기 연결");
    }
}

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

 

3. 어댑터 구현

ElectronicAdapter는 110V 기기를 220V 인터페이스로 변환하는 역할을 합니다.

package com.demo.adapter;

public class ElectronicAdapter implements IElectronic220v{

    // 실제 기기 어댑터 내부에 전압 변경 기능이 있다
    private IElectronic110v electronic110v;

    // 어! 이 녀석 생성시에 강제성 110v 타입을 가진 녀석만 들어올 수 있다.
    public ElectronicAdapter(IElectronic110v electronic110v) {
        this.electronic110v = electronic110v;
    }

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

 

4. 클라이언트 코드 작성

클라이언트는 homeConnect 메서드를 사용해 220V 기기를 연결합니다. 110V 기기는 어댑터를 통해 연결됩니다.

public class MyHouse {

    // 정적 메서드
    // 집에 220v 전기콘센트를 연결하는 메서드
    public static void homeConnect(IElectronic220v iElectronic220v) {
        // 콘센트 연결하는 행위
        iElectronic220v.connect();
        
    }
    
    // 메인 함수
    public static void main(String[] args) {
        HairDryer hairDryer = new HairDryer();
        AirConditioner airConditioner = new AirConditioner();
        ElectronicAdapter AdapterHairDryer = new ElectronicAdapter(hairDryer);

        // 어댑터를 사용하여 서로 다른 인터페이스를 연결
        homeConnect(adapterHairDryer); // 드라이기를 어댑터를 통해 연결
        homeConnect(airConditioner);  // 에어컨을 직접 연결
    }
}

 

실행결과
드라이기 연결
어댑터를 통해 110v 타입의 기기를 220v 스펙에 연결합니다.
에어컨 연결 220v

 


 

어댑터 패턴의 장점과 단점

장점

  1. 호환성 제공: 기존 코드를 수정하지 않고도 새로운 코드와 함께 동작할 수 있습니다.
  2. 재사용성 증가: 기존 클래스와 새로운 클래스 간의 연결을 가능하게 만들어 재사용성을 높입니다.
  3. 유연성: 인터페이스가 달라도 어댑터를 통해 쉽게 통합할 수 있습니다.

단점

  1. 복잡성 증가: 어댑터를 추가로 작성해야 하므로 코드 구조가 복잡해질 수 있습니다.
  2. 성능 문제: 어댑터를 거치면서 약간의 성능 저하가 발생할 수 있습니다.

 

어댑터 패턴의 활용 사례

  1. API 통합: 서로 다른 API를 사용하는 시스템 간 데이터 변환.
  2. 플러그인 시스템: 서로 다른 인터페이스를 가진 플러그인을 연결.
  3. 레거시 코드 유지: 기존 시스템과 새로운 시스템을 함께 사용해야 할 때.

 

 

어댑터 패턴은 소프트웨어 설계에서 인터페이스 간의 차이를 해결하고, 새로운 요구사항을 유연하게 처리할 수 있도록 돕는 중요한 디자인 패턴입니다. 이번 포스팅에서는 어댑터 패턴의 기본 개념과 Java를 활용한 예제를 다뤘습니다. 서로 다른 인터페이스를 가진 객체들을 유연하게 연결할 수 있는 이 패턴은, 특히 레거시 코드와의 호환성 문제를 해결하거나 외부 API를 통합할 때 큰 도움이 됩니다.

다음에도 더 유익한 주제로 찾아뵙겠습니다. 감사합니다!

 

👀 디자인 패턴에 대해서 더 알아보자!

 

[JAVA] 디자인 패턴이란?

안녕하세요! 오늘은 소프트웨어 설계에서 자주 언급되는 디자인 패턴(Design Patterns)에 대해 알아보려고 합니다. 디자인 패턴은 개발자들에게 더 나은 설계를 위한 가이드를 제공하며, 효율적인

dev-yeonwha.tistory.com

 

[JAVA] 디자인패턴 : 콜백(Callback) 패턴 알아보기

안녕하세요! 오늘은 디자인 패턴 중에서도 콜백 메서드라는 개념에 대해 알아보겠습니다. 콜백 메서드는 유연하고 확장 가능한 코드 설계를 가능하게 하며, 특히 비동기 처리나 이벤트 기반 시

dev-yeonwha.tistory.com

 

[JAVA] 디자인패턴 : 싱글톤 패턴(Singleton Pattern)

안녕하세요! 이번 포스팅에서는 디자인 패턴 중에서도 가장 기본적이고 널리 사용되는 싱글톤 패턴(Singleton Pattern)에 대해 알아보겠습니다. 싱글톤 패턴은 프로그램에서 단 하나의 객체만 생성

dev-yeonwha.tistory.com