문제 및 이론 정리/디자인패턴

[디자인패턴] Adapter - 사이에 끼워 재사용한다

hail2y 2025. 5. 22. 01:17

'이미 제공된 것'과 '필요한 것' 사이에 들어가서 그 사이를 채우는 것이 어댑터의 역할

adapter - 적응시키는 것, wrapper 패턴이라고도 불림

프로그램의 세계에서도 이미 제공된 코드를 그대로 사용할 수 없을 때 필요한 형태로 변환한 후 이용한다

  • 클래스에 의한 Adapter 패턴 (상속을 사용한 패턴)
  • 인스턴스에 의한 Adapter 패턴 (위임을 사용한 패턴)

1. Banner 클래스를 상속받아 필요한 Print 인터페이스를 구현

public class Banner {
    private String string;
    
    public Banner(String string) {
    	this.string = string;
    }
    
    public void showWithParen() {
    	System.out.println("(" + string + ")");
    }
    
    public void showWithAster() {
    	System.out.println("*" + string + "*");
    }
}
public interface Print {
    public abstract void printWeak();
    public abstract void printStrong();
}

 

- Adapter 역할: 준비된 Banner 클래스를 확장하고, 필요한 인터페이스를 구현

public class PrintBanner extends Banner implements Print {
    public PrintBanner(String string) {
    	super(string);
    }
    
    @Override
    public void printWeak() {
    	showWithParen();
    }
    
    @Override
    public void printStrong() {
    	showWithAster();
    }
}

 

- Main에서는 Print 인터페이스를 사용해서 프로그래밍

public class Main {
    public static void main(String[] args) {
    	Print p = new PrintBanner("Hello");
        p.printWeak();
        p.printStrong();
    }
}

 

2. 어떤 메서드의 실제 처리를 다른 인스턴스의 메서드에 맡김 (= 위임)

- Banner 필드를 통해 메서드 호출

public class PrintBanner extends Print {
    private Banner banner;
    
    public PrintBanner(String string) {
        this.banner = new Banner(string);
    }
    
    @Override
    public void printWeak() {
    	banner.showWithParen();
    }
    
    @Override
    public void printStrong() {
    	banner.showWithAster();
    }
}

  • 기존의 클래스를 재사용하여 필요한 클래스를 만든다
  • 필요한 메서드군을 빠르게 만들 수 있다
  • 기존의 클래스에 버그가 없는 걸 알고 있으므로 프로그램 검사가 매우 편해진다
  • 기존의 클래스를 전혀 수정하지 않고 목적한 인터페이스(API)에 맞춘다
  • 신버전과 구버전을 공존시키고 유지 보수까지 편하게 하도록 도와준다
  • Adaptee와 Target 기능이 너무 동떨어진 경우에는 Adapter 패턴을 사용할 수 없다
  • 일반적으로 상속보다 위임을 사용하는 편이 문제가 적다