티스토리 뷰

JAVA/디자인 패턴

어댑터 패턴

kkoon9 2022. 3. 9. 21:10

말 그대로 이미 제공되어 있는 것을 그대로 사용할 수 없을 때, 필요한 형태로 교환해주는 일을 수행한다.

그렇기 때문에 이 패턴은 Wrapper 패턴이라고도 불린다.

Adapter 패턴의 종류

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

상속을 이용한 Adapter 패턴

주어진 문자열을 다음과 같이 표시하는 간단한 프로그램을 만든다.

(Hello)
*Hello*
  • Banner 클래스 : 이미 제공되어 있는 것
    • showWithParen : 문자열을 괄호로 묶어서 표시하는 메서드
    • showWithAster : 문자열 전후로 *를 붙여 표시하는 메서드
  • Print 인터페이스 : 어댑터를 만드는 역할
    • printWeak : 문자열을 괄호를 사용하여 표시
    • printStrong : 문자열을 *을 사용하여 표시
  • PrintBanner 클래스 : 어댑터 역할
    • Banner 클래스를 상속해서 필요로 하는 Print 인터페이스를 구현한다.

Main 클래스

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

Main 클래스 내에서는 PrintBanner의 인스턴스를 Print 인터페이스형의 변수로 대입해야 한다.

이 Main 클래스는 어디까지나 Print라는 인터페이스를 사용해서 프로그래밍하고 있다.

Banner 클래스나 showWithParen()나 showWithAster()는 Main 클래스의 소스 코드 상에서는 완전히 감추어져 있다.

 

 

GitHub - kkoon9/Java-Design-Pattern: Java 언어로 배우는 디자인 패턴 입문 예제 코드

Java 언어로 배우는 디자인 패턴 입문 예제 코드. Contribute to kkoon9/Java-Design-Pattern development by creating an account on GitHub.

github.com

위임을 이용한 Adapter 패턴

위임을 풀어말하면 누군가에게 맡긴다라는 의미이다.

Java에서 위임은 어떤 메서드의 실제 처리를 다른 인스턴스의 메서드에 맡기는 것을 말한다.

이번 예제에서는 Print 인터페이스가 아닌 Print 클래스로 사용한다.

PrintBanner 클래스는 두 클래스를 다중 상속할 수 없으니 Banner 클래스의 인스턴스를 가진다.

이 인스턴스는 PrintBanner 클래스의 생성자에서 생성한다.

상속 예에서는 자신의 상위 클래스에서 상속한 showWithParen, showWithAster 메서드를 호출하고 있지만, 이번에는 필드를 경유해서 호출하고 있다. (위임을 한다.)

 

 

GitHub - kkoon9/Java-Design-Pattern: Java 언어로 배우는 디자인 패턴 입문 예제 코드

Java 언어로 배우는 디자인 패턴 입문 예제 코드. Contribute to kkoon9/Java-Design-Pattern development by creating an account on GitHub.

github.com

Adapter 패턴의 핵심 키워드

예제 코드와 동작을 살펴봤으니 이젠 핵심 키워드를 살펴보자.

Target(대상)의 역할 - Print

지금 필요한 메서드를 결정한다.

Client(의뢰자)의 역할 - Main

Target 역할의 메서드를 사용해서 일을 한다.

Adaptee(개조되는 쪽)의 역할 - Banner

이미 준비되어 있는 메서드를 가지고 있는 역할이다.

Target 역할의 메서드와 일치하면 다음 Adapter의 역할은 필요없다.

Adapter의 역할 - PrintBanner

Adaptee 역할의 메서드를 사용해서 어떻게든 Target 역할을 만족시키기 위한 것이 목적이다.

🤔 어댑터 패턴은 어떤 경우에 필요할까?

 

우리는 이미 존재하고 있는 클래스를 이용하는 경우가 자주 있다.

특히 그 클래스가 충분한 테스트를 받아서 버그가 적으며 실제로 지금까지 사용된 실적이 있다면 어떻게든 그 클래스를 사용하려 한다.

어댑터 패턴은 기존의 클래스를 개조해서 필요한 클래스를 만든다.

이 패턴으로 필요한 메서드를 발빠르게 만들 수 있다.

만약 버그가 발생해도 기존의 클래스(어댑티 역할)에는 버그가 없으므로 어댑터 역할의 클래스를 중점적으로 조사하면 된다.

버전 업과 호환성에 대해

소프트웨어는 버전 업이 필요하다.

구 버전과 신 버전을 공존시키고, 유지 보수도 편하게 하기 위해 어댑터 패턴이 주로 사용된다.

신 버전을 Adaptee 역할로 하고, 구 버전을 Target 역할로 한다.

그리고 신 버전의 클래스를 사용해서 구 버전의 메서드를 구현하는 Adapter 역할의 클래스를 만든다.

물론 Adaptee 역할과 Target 역할의 기능이 지나치게 동떨어진 경우에는 어댑터 패턴을 사용할 수 없다.

관련 패턴

  • Bridge 패턴
  • Decorator 패턴

'JAVA > 디자인 패턴' 카테고리의 다른 글

Factory Method 패턴  (0) 2022.03.11
Template Method 패턴  (0) 2022.03.10
Iterator 패턴  (0) 2022.03.08
널(Null) 객체 패턴  (0) 2022.03.07
컴포지트(Composite) 패턴  (0) 2022.03.06
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함