어댑터 패턴은 래퍼 패턴이라고도 합니다.
일반 제품이 깨끗한 선물용 종이로 포장되어 선물용 제품이 되는 것처럼 포장과 어댑터는 무언가를 포장하고 다른 용도로 변형합니다.
12V DC 노트북을 100V AC 전원 공급 장치에 연결할 때 AC 어댑터를 사용하여 변환하십시오.
- 제공된 것과 필요한 것 사이의 격차를 찾아 채우는 것이 어댑터의 역할입니다.
- “이미 제공됨”과 “필수” 사이의 간격을 메우는 디자인 패턴을 어댑터 패턴이라고 합니다.
- 제공된 코드를 그대로 사용할 수 없는 경우 필요한 형식으로의 변환이 필요한 경우
2개의 어댑터 패턴
-클래스에 의한 Adapter 패턴(상속을 사용한 패턴)
-인스턴스에 의한 Adapter 패턴(위임을 사용한 패턴)
어댑터 패턴의 문자
목표로
필요한 방법을 지금 결정하십시오. (이는 노트북에 전원을 공급하는 12볼트 DC에 해당합니다.)
- 이 역할은 인쇄 인터페이스(상속의 경우)와 인쇄 추상 클래스(위임의 경우)에 의해 가정되었습니다.
클라이언트의 역할 – 메인 클래스가 이 역할을 맡았습니다.
Target의 방법으로 작업하십시오. 12V DC에서 실행되는 노트북.
Adaptee로서 – Banner 클래스가 이 역할을 맡았습니다.
Adaptee는 이미 메소드를 준비한 역할입니다. (AC 100볼트 AC 전원)
- Adaptee의 방식이 Target의 방식과 같다면 (집에 공급되는 전압이 처음부터 12V라면 다음에 소개하는 어댑터는 등장하지 않아도 됩니다)
어댑터 역할 – PrintBanner 클래스가 이 역할을 수행했습니다.
Adapter 패턴의 목적과 임무는 Adaptee의 방법을 사용하여 어떻게든 대상을 만족시키는 것입니다.
- 클래스별 어댑터 패턴의 경우 어댑터가 ‘상속’되고 어댑터가 사용됩니다.
- 인스턴스별 어댑터 패턴의 경우 Adaptee는 “위임”하여 사용합니다.
클래스별 어댑터 패턴(상속 패턴)
클래스 다이어그램(상속 포함)

배너급 -AC 100V급 -이미 사용 가능-
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+"*");
}
}
- 괄호로 묶인 문자열을 표시하는 showWithParen 메서드
- 문자열 앞뒤에 *를 추가하여 문자열을 표시하는 showWithAster 메서드가 있습니다.
압력 인터페이스 – DC 12V와 같은 -필요한 것-
public interface Print {
public abstract void printWeak();
public abstract void printStrong();
}
문자열을 괄호로 묶어 약하게 표시하는 printWeak 메서드입니다.
* 강조 표시된 문자열을 표시하는 문자열)이 선언됩니다.
어댑터 역할을 하는 PrintBanner 클래스
public class PrintBanner extends Banner implements Print{
public PrintBanner(String string){
super(string); //부모 생성자한테 넘기기
}
@Override //Print인터페이스 오버라이드
public void printWeak() {
showWithParen(); //상속
}
@Override //Print인터페이스 오버라이드
public void printStrong() {
showWithAster(); //상속
}
}
- 제공된 배너 클래스를 상속하여 필요한 인쇄 인터페이스를 구현합니다.
- PrintBanner 클래스는 showWithParen 메서드로 printWeak를 구현하고 showWithAster 메서드로 printStrong을 구현합니다. (어댑터 기능)
메인 클래스
어댑터 역할을 하는 PrintBanner 클래스를 사용하는 약한(괄호 포함) 또는 강력한 hello 문자열.
public class Main {
public static void main(String() args) {
Print p = new PrintBanner("Hello");
p.printWeak();
p.printStrong();
}
}
/*
(Hello)
*Hello*
*/
표시하다
- PrintBanner 인스턴스가 PrintInterface 유형의 변수에 할당된 것을 확인하십시오.
프로그래밍에 인쇄 인터페이스를 사용합니다(printWeak(), printStrong() 메서드).
- Banner 클래스, showWithParen 메서드 및 showWithAster 메서드는 Main 클래스 코드에 숨겨져 있습니다.
PrintBanner 클래스가 어떻게 구현됐는지 Main 클래스는 모른다. 따라서 Main 클래스를 전혀
변경하지 않고도 PrintBanner 클래스의 구현을 바꿀 수 있다.
노트북이 12V DC에서 작동하고 있다는 사실을 모르는 것과 비슷하지만 어댑터 반대편의 전원 공급 장치는 100V AC입니다.
| 전류 소스와 샘플 프로그램의 유사성 대응 | 권력의 은유 | |
| 샘플 프로그램 | 제공된 | 교류 100V 배너 클래스(showWithParen, showWithAster) |
| 변환기 | 어댑터 | |
| PrintBanner 클래스 | 필요한 것들 | 직류 12V |
인쇄 인터페이스(printWeak, printString)
위임에 대해서
위임은 "누구에게 맡긴다"는 의미이다. 중요한 회의에 참석하지 못할 때 위임장을 쓴다. 참석할 수 없으니
대신 OOO를 보내겠습니다 라고 말이다. (위임은 이양과 같다.)
Java에서 위임은 어떤 메서드의 실제 처리를 다른 인스턴스의 메서드에 맡기는 것을 말한다.
인스턴스별 어댑터 패턴(위임 패턴)

클래스 다이어그램(위임 포함)
- Main 클래스와 Banner 클래스는 이전 예제와 동일하고 Print는 인터페이스가 아닌 추상 클래스라고 가정합니다.
public abstract class Print {
public abstract void printWeak();
public abstract void printStrong();
}
Banner 클래스를 사용하면 Print 클래스와 동일한 메서드로 클래스를 구현합니다.
public class PrintBanner extends Print {
private Banner banner; //banner 필드로 Banner 클래스의 인스턴스를 가진다.
public PrintBanner(String string){
// 생성자에서 필드에 있는 Banner 클래스의 인스턴스를 생성한다.
this.banner = new Banner(string);
}
@Override //추상클래스 오버라이드
public void printWeak() {
banner.showWithParen(); //banner 필드를 통해 메서드 호출
}
@Override //추상클래스 오버라이드
public void printStrong() {
banner.showWithAster(); //banner 필드를 통해 메서드 호출
}
}
Java의 단순한 상속으로 인해 PrintBanner 클래스는 Print 및 Banner의 하위 클래스로 정의할 수 없습니다.
이처럼 PrintBanner 클래스의 PrintWeak 메서드가 호출되었을 때 자신이 처리하지 않고,
다른 인스턴스(Banner의 인스턴스)인 showWithParen() 메서드에 맡기는 것을 위임 이라고 한다.
이전 예제에서는 부모 클래스에서 상속된 showWithParen() 및 showWhitAster() 메서드를 호출했지만 이 예제에서는 배너 필드에서 호출합니다. 어떤 경우에 사용하나요? ,
메소드가 필요하면 프로그래밍만 하면 되는데 왜 어댑터 패턴을 생각해야 할까요?
- 프로그래밍할 때 이미 존재하는 클래스를 사용하는 것이 일반적입니다.
클래스가 적절하게 테스트되었고 버그가 거의 없으며 실제 사용 기록이 있는 경우 클래스를 구성 요소로 재사용할 수 있습니다.
- 어댑터 패턴은 기존 클래스에 오버레이되어야 하는 클래스를 만듭니다. 이 패턴을 사용하여 필요한 메서드를 빠르게 만들 수 있습니다.
오류가 있어도 기존 클래스(apaptee 스테이션)에 오류가 없다는 것을 알기 때문에 어댑터 스테이션 클래스에 집중할 수 있고 프로그램 검사가 매우 편리해집니다.
출처가 없더라도
- 이미 클래스가 있고 새 인터페이스(API)에 적합하다고 생각하므로 어댑터 패턴을 사용하는 것이 좋습니다.
- 일반적으로 새로운 인터페이스(API)에 적응하고자 할 때 기존 클래스의 소스를 터치하고 “수정”합니다.
“조금만 바꾸면 끝”이라고 생각하고 변경을 하게 되면 이미 운영 테스트가 완료된 기존 클래스를 건드린 것이기 때문에 변경 후 다시 테스트를 해야 합니다.
- 어댑터 패턴은 기존 클래스를 전혀 변경하지 않고 의도된 인터페이스(API)를 준수하도록 설계되었습니다.
- 어댑터 패턴에서 기존 클래스의 소스 코드는 반드시 필요한 것은 아닙니다.
기존 클래스의 사양을 알고 있는 경우에만 새 클래스를 만들 수 있습니다.
버전 업데이트 및 호환성
- 소프트웨어는 버전 업그레이드가 필요합니다. (소프트웨어 업데이트 시 이전 버전과의 호환성 문제가 됩니다.)
"레거시 시스템(Legacy System)"이란 표현은 기존에 사용되어온 컴퓨터 시스템, 응용 프로그램,
데이터베이스 등을 일컫는 표현입니다. 이러한 시스템들은 최신 기술에 비해 느린 처리 속도,
제한적인 기능, 보안 취약점 등의 문제가 있지만, 여전히 많은 기업이나 조직에서 사용되고 있기 때문에
그 교체가 어려운 경우가 많습니다.
- 레거시 시스템이라고도 하는 이전 버전을 버리면 소프트웨어 유지 관리가 더 쉬워지지만 항상 가능한 것은 아닙니다.
어댑터 패턴을 통해 새 버전과 이전 버전이 공존할 수 있으며 유지 관리가 간소화됩니다.
- 향후 새 버전만 유지하려면 새 버전을 Adaptee로 사용하고 이전 버전을 대상으로 사용하십시오.
새 버전 클래스를 사용하여 이전 버전 방법을 구현하는 어댑터 역할 클래스를 만듭니다.

관계를 표현하는 개념 다이어그램(UML 다이어그램 아님).
수업 밖
- Adaptee와 Target의 기능이 너무 멀리 떨어져 있으면 어댑터 패턴을 사용할 수 없습니다.
100V AC 전원만으로는 수돗물을 배수할 수 없습니다.
상속 또는 위임을 사용해야 합니까?
- 위임을 사용하는 것이 상속을 사용하는 것보다 문제가 적습니다.
부모 클래스의 내부 동작에 대한 자세한 이해 없이는 상속을 효과적으로 사용하기 어려운 경우가 많기 때문입니다.
관련 패턴
브리지 패턴
데코레이터 패턴

