[디자인패턴]Adapter


adapter 의 adapt는 적응 시킨다라는 뜻이다.

프로그램에서도 이미 제공된 코드를 그대로 사용할 수 없을 때, 필요한 형태로 변환한 후 이용하는 경우가 자주 있다. ‘이미 제공된 것’ 과 ‘필요한 것’ 사이의 ‘차이’를 메우는 디자인 패턴이 Adapter 패턴이다.


Adapter 패턴에는 다음과 같은 두 종류가 있다.

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



예제


아래와 같이 Hello 라는 주어진 문자열을 다음과 같이 표시하는 간단한 프로그램을 예로 든다.


(Hello)
*Hello*


Banner 클래스(banner는 ‘광고 현수막’이라는 뜻)에는 문자열을 괄호로 묶어서 표시하는 showWithParen 메소드와 문자열 앞뒤에 *를 붙여서 표시하는 showWithAster 메소드가 있다.


Print 인터페이스에서는 문자열을 괄호로 묶어 약하게 표시하는 printWeak메소드와 문자열을 *로 강조해서 표시하는 메소드 printStrong이 선언되어 있다.


지금 하고 싶은 일은 Banner 클래스를 사용하여 Print 인터페이스를 충족하는 클래스를 만드는 것이다.


어댑터 역할을 담당하는 것이 PrintBanner 클래스는 showWithParen 메소드로 printWeak를 구현하고 showWithAster 메소드로 printStrong 을 구현한다. 이로써 PrintBanner 클래스는 어댑터 기능을 수행하게 된다.



</thead> </table> </div>



# 1. Banner 클래스
```java 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 + "*"); } } ```

# 2. Print 인터페이스
```java public interface Print{ public abstract void printWeak(); public abstract void printStrong(); } ```

# 3. PrintBanner 클래스
PrintBanner 클래스는 어댑터 역할을 한다. 준비된 Banner 클래스를 extends 하여 showWithParen 메소드와 showWithAster 메소드를 상속받으며, 필요한 Print 인터페이스를 implements하여 printWeak 메소드와 printStrong 메소드를 구현한다.
@Override는 printWeak와 printStrong 메소드에 대한 부가 정보(어노테이션)의 일종이다. 이 @Override는 printWeak와 printStrong 이라는 두 개의 메소드가 PrintBanner 클래스에서 멋대로 만든게 아니라, Print 인터페이스에서 선언된 메소드를 오버라이드하여 구현한 것임을 나타낸다.
```java public class PrintBanner extends Banner implements Print{ public PrintBanner(String string){ super(string); } @Override public void printWeak(){ showWithParen(); } @Override public void printStrong(){ showWithAster(); } } ```

# 4. Main 클래스
Main 클래스는 어댑터 역할을 하는 PrintBanner 클래스를 이용해 Hello 문자열을 약하게 혹은 강하게 표시한다.
```java public class Main { public static void main(String[] args){ Print p = new PrintBanner("Hello"); p.printWeak(); p.printStrong(); } } ```
Main 클래스에서는 PrintBanner의 인스턴스를 Print 인터페이스형 변수에 대입하는 것에 주의한다. 이 Main 클래스는 어디까지나 Print 인터페이스를 사용해서(즉, printWeak 메소드와 printStrong 메소드를 사용해서) 프로그래밍하고 있다. Banner 클래스나 showWithParen 메소드, showWithAster 메소드는 Main 클래스의 코드에서는 완전히 숨겨져 있다. 마치 노트북이 직류 12볼트로 작동하지만, 어댑터 건너편에서 공급되는 전원은 교류 100볼트라는 걸 몰라도 되는 것과 비슷하다.
PrintBanner 클래스가 어떻게 구현됐는지 Main 클래스는 모른다. 따라서 Main 클래스를 전혀 변경하지 않고도 PrintBanner 클래스의 구현을 바꿀 수 있다.

구분 예제 프로그램
제공된 것 Banner 클래스(showWithParen, showWithAster)
변환 장치 PrintBanner 클래스
필요한 것 Print 인터페이스(printWeak, printStrong)