오랜만에 돌아온 디자인 패턴 포스팅... 오늘은 인터페이스와 관련있는 패턴인 어댑터(Adapter) 패턴에 대해서 알아보겠다. 참고로 패턴과 관련된 사항은 영진닷컴의 'Java 언어로 배우는 디자인 패턴 입문', 책을 이용하였다.
어댑터(Adapter) 패턴
우리가 많이 들어봤을 어댑터란, 다른 기계 장치를 서로 연결하여 사용할 수 있도록 해주는 장치이다. 어댑터 패턴도 이것과 같다. 기존 존재하는 코드를 그대로 사용할 수 없을 때, 어댑터 패턴을 이용하여 기존 코드를 필요한 형태로 변환하여 이용하는 것이 어댑터 패턴이다. 어댑터 패턴의 적용은 1) 상속을 이용한 방식, 2) 위임을 이용한 방식으로 가능하다.
Banner 클래스에 showWithParen(괄호로 묶어 문자열을 표시), showWithAster(문자열 앞뒤에 *를 표시) 메서드가 있다고 가정하자. 이 Banner 클래스는 앞서 말한 기존 존재하는 코드를 그대로 사용할 수 없는 클래스이다.
이제 printWeak(괄호로 묶어 문자열을 표시), printStrong(문자열 앞뒤에 *를 표시) 메소드를 가진 Print 인터페이스를 만들었다. 우리가 해야 하는 것은 Banner 클래스를 이용해 Print 인터페이스를 충족하는 클래스 PrintBanner를 만드는 것이다.
상속을 이용한 방식
상속을 이용해 PrintBanner를 만드려면 어떻게 해야 할까? PrintBanner가 Banner 클래스를 상속받아서 Print 인터페이스의 printWeak, printStrong 메소드를 완성하도록 하면 될것이다. 이것을 그림으로 그린다면 아래와 같다.

PrintBanner의 메소드는 다음과 같이 구성된다.
public void printWeak() { showWithParen(); }, public void printStrong() { showWithAster(); }
이렇게 클래스를 구성하면 기존의 사용할 수 없던 Banner의 기능을 PrintBanner 어댑터를 이용해 Banner 내부의 기능을 이용할 수 있다!! 다음으로, 위임을 이용한 방법을 알아보자.
위임을 이용한 방식(인스턴스 이용)
해결하려는 문제는 위와 같다. 위임을 이용한 방식에서는 기존 사용하려는 클래스를 인스턴스화 하여 어댑터 역할을 할 클래스에 넣어주면 된다.

위임을 이용한 방식의 포인트는 기존에 사용하지 못하는 클래스를 인스턴스화 하여 어댑터 역할의 클래스에 넣어주는 것이다. 위와 같이 클래스를 설계하면 PrintBanner 클래스를 이용해 Banner의 기능을 이용할 수 있다!!
구성요소
Target
타겟은 지금 필요한 메소드를 결정한다. 위 예시에서는 Print 인터페이스의 printWeak, printStrong 메소드를 사용하려 하고 있으므로, 상속을 이용한 방식에서 타겟은 Print 인터페이스이고 위임을 이용한 방식에서 타겟은 Print 클래스이다.
Client
클라이언트는 타겟의 메소드를 사용해 작동하는 요소이다. 위 예시에서 전체 코드를 작성하지는 않아 Client를 알 수는 없지만 Main 내에서 위 어댑터 패턴을 적용해 사용한다면 Main 클래스가 클라이언트가 된다.
Adaptee
Adaptee는 적응 대상자로, 이미 준비된 메소드를 가지는 역할이다. 위 예시에서 Banner 클래스의 메소드를 어댑터 패턴을 이용해 사용할 수 있도록 하고 있다. 따라서 Adaptee는 Banner 클래스이다.
Adapter
Adapter는 Adaptee의 메소드를 사용하여 Target을 만족시키는 목적을 가지고 있다. 위 예시에서 Banner의 기능을 사용할 수 있도록 해주는 PrintBanner 클래스가 적응자, Adapter이다.
마무리
어댑터 패턴은 상속 또는 위임 방식을 이용해 적용할 수 있다고 하였는데 어떤 방식을 이용하는게 더 좋을까? 상속 방식을 이용한다면 상위 클래스의 내부 기능, 동작 등을 자세하게 알아여 상속을 효과적으로 사용할 수 있어 어려움이 존재할 수 있으므로 위임 방식을 이용하는 것이 더 좋을 것이다.
'CS > 객체지향설계 & 패턴' 카테고리의 다른 글
[객체지향설계 & 패턴] 프로토타입 패턴 (0) | 2025.05.10 |
---|---|
[객체지향설계 & 패턴] 브리지 패턴 (0) | 2025.04.06 |
[객체지향설계 & 패턴] 퍼사드 패턴 (1) | 2025.04.06 |
[객체지향설계 & 패턴] 디자인 패턴 개론 (0) | 2025.03.22 |
[객체지향설계 & 패턴] Solid 설계 원리 (0) | 2025.03.18 |