어댑터 패턴 및 파사드 패턴

Bo Ram·2025년 3월 19일

1. 어댑터 패턴(Adapter Pattern)

1.1 어댑터 패턴이란?

어댑터 패턴은 서로 다른 인터페이스를 가진 클래스들이 함께 동작할 수 있도록 중간에 변환기를 제공하는 패턴이다.

즉, 기존 코드의 변경 없이 새로운 인터페이스를 적용하여 클라이언트가 원하는 방식으로 기존 클래스를 사용할 수 있도록 도와준다.

1.2 어댑터 패턴이 필요한 이유

  • 기존 코드 변경 없이 새로운 기능을 추가해야 할 때
  • 서로 다른 인터페이스를 가진 클래스를 통합해야 할 때
  • 레거시 시스템과 새로운 시스템을 연결할 때

1.3 어댑터 패턴의 구조

Client -> Target (인터페이스) -> Adapter -> Adaptee (기존 클래스)
  • Client (클라이언트): 새로운 인터페이스를 사용하려는 객체
  • Target (타겟 인터페이스): 클라이언트가 기대하는 인터페이스
  • Adapter (어댑터): 기존 클래스를 새로운 인터페이스에 맞게 변환하는 객체
  • Adaptee (적응 대상): 원래의 기능을 가진 기존 클래스

1.4 어댑터 패턴 구현 (오리와 칠면조 예제)

// 1. Target 인터페이스
public interface Duck {
    void quack();
    void fly();
}

// 2. Adaptee 클래스 (기존 클래스)
public class Turkey {
    public void gobble() {
        System.out.println("Gobble gobble");
    }
    public void flyShortDistance() {
        System.out.println("I fly a short distance");
    }
}

// 3. Adapter 클래스 (변환 역할)
public class TurkeyAdapter implements Duck {
    private Turkey turkey;

    public TurkeyAdapter(Turkey turkey) {
        this.turkey = turkey;
    }

    @Override
    public void quack() {
        turkey.gobble();
    }

    @Override
    public void fly() {
        for (int i = 0; i < 5; i++) {
            turkey.flyShortDistance();
        }
    }
}

// 4. 클라이언트 코드
public class AdapterTest {
    public static void main(String[] args) {
        Duck duck = new TurkeyAdapter(new Turkey());
        duck.quack();
        duck.fly();
    }
}

1.5 어댑터 패턴의 장점

  • 기존 코드를 수정하지 않고 인터페이스 변환 가능
  • 기존 시스템과 새로운 시스템을 연결하는 데 유용
  • 코드 재사용성을 높여 유지보수를 용이하게 함

1.6 어댑터 패턴의 단점

  • 복잡도가 증가할 수 있음
  • 코드가 난해해질 가능성이 있음

2. 파사드 패턴(Facade Pattern)

2.1 파사드 패턴이란?

파사드 패턴은 복잡한 서브시스템을 간단한 인터페이스로 감싸서 사용하기 쉽게 만드는 패턴이다.

즉, 여러 개의 클래스와 복잡한 인터페이스를 하나의 단순한 인터페이스로 통합하여 클라이언트가 쉽게 사용할 수 있도록 도와준다.

2.2 파사드 패턴이 필요한 이유

  • 복잡한 시스템을 쉽게 사용할 수 있도록 단순화할 때
  • 서브시스템 간의 결합도를 줄이고 유지보수를 쉽게 하기 위해
  • 기존 코드 변경 없이 클라이언트가 단순한 인터페이스를 사용하도록 하기 위해

2.3 파사드 패턴의 구조

Client -> Facade -> Subsystems (서브 시스템들)
  • Client (클라이언트): 단순한 인터페이스를 사용하는 객체
  • Facade (파사드): 서브 시스템을 단순한 인터페이스로 감싸는 역할
  • Subsystems (서브 시스템): 실제 기능을 수행하는 여러 클래스들

2.4 파사드 패턴 구현 (홈 시어터 예제)

// 서브 시스템 클래스들
public class Amplifier {
    public void on() { System.out.println("Amplifier on"); }
    public void off() { System.out.println("Amplifier off"); }
}

public class DVDPlayer {
    public void on() { System.out.println("DVD Player on"); }
    public void off() { System.out.println("DVD Player off"); }
    public void play(String movie) { System.out.println("Playing " + movie); }
}

public class Projector {
    public void on() { System.out.println("Projector on"); }
    public void off() { System.out.println("Projector off"); }
}

// 파사드 클래스
public class HomeTheaterFacade {
    private Amplifier amp;
    private DVDPlayer dvd;
    private Projector projector;

    public HomeTheaterFacade(Amplifier amp, DVDPlayer dvd, Projector projector) {
        this.amp = amp;
        this.dvd = dvd;
        this.projector = projector;
    }

    public void watchMovie(String movie) {
        System.out.println("Get ready to watch a movie...");
        amp.on();
        dvd.on();
        projector.on();
        dvd.play(movie);
    }

    public void endMovie() {
        System.out.println("Shutting movie theater down...");
        amp.off();
        dvd.off();
        projector.off();
    }
}

// 클라이언트 코드
public class HomeTheaterTest {
    public static void main(String[] args) {
        Amplifier amp = new Amplifier();
        DVDPlayer dvd = new DVDPlayer();
        Projector projector = new Projector();
        
        HomeTheaterFacade homeTheater = new HomeTheaterFacade(amp, dvd, projector);
        homeTheater.watchMovie("Inception");
        homeTheater.endMovie();
    }
}

2.5 파사드 패턴의 장점

  • 복잡한 서브시스템을 단순한 인터페이스로 제공하여 사용이 쉬움
  • 클라이언트와 서브시스템 간의 결합도를 낮춰 유지보수성이 향상됨
  • 특정 서브 시스템을 변경하더라도 파사드 인터페이스를 유지하면 클라이언트 코드 수정이 불필요함

2.6 파사드 패턴의 단점

  • 모든 기능을 파사드에서 제공하지 않으면 여전히 서브 시스템을 직접 호출해야 할 수도 있음
  • 과도한 파사드 사용은 확장성을 제한할 수 있음

3. 어댑터 패턴 vs 파사드 패턴

패턴목적사용 사례
어댑터 패턴인터페이스 변환서로 다른 인터페이스를 가진 클래스를 통합할 때
파사드 패턴복잡한 시스템 단순화여러 개의 클래스를 하나의 인터페이스로 묶을 때

어댑터 패턴은 인터페이스를 변환하여 호환성을 높이는 역할을 하고, 파사드 패턴은 복잡한 시스템을 단순한 인터페이스로 감싸는 역할을 한다.

profile
사부작ㅤ사부작

0개의 댓글