[디자인 패턴] - Adapter
by 볼빵빵오춘기Adapter
서로 다른 인터페이스를 가진 클래스들이 함께 동작할 수 있도록 중간에 '어댑터' 클래스를 두어 호환시켜주는 디자인 패턴이다. 즉, 호환되지 않는 인터페이스를 연결해주는 '변환기' 역할이다.
예제 코드
// 클라이언트가 원하는 인터페이스
interface Target {
void request();
}
// 기존에 이미 만들어져 있는 클래스 (인터페이스가 다름)
class Adaptee {
void specificRequest() {
System.out.println("특정 기능 실행됨 (specificRequest)");
}
}
// 어댑터: Target 인터페이스에 맞춰 Adaptee를 변환
class Adapter implements Target {
private Adaptee adaptee;
Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
public void request() {
adaptee.specificRequest(); // 내부적으로 기존 메서드를 호출
}
}
// 사용 예시
public class Main {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Target target = new Adapter(adaptee); // 기존 클래스를 감싸서 사용
target.request(); // 결과: "특정 기능 실행됨"
}
}
Adapter 패턴의 장점
기존 코드를 변경하지 않고 재사용 가능
OCP(개방-폐쇄 원칙) 만족한다.
서로 다른 인터페이스 간의 호환성 확보
유연한 설계가 가능하다.
외부 라이브러리 통합이 쉬움
외부 API를 내 코드에 맞춰 깔끔하게 사용할 수 있다.
Adapter 패턴의 단점
구조가 많아지면 복잡해질 수 있음
너무 많은 어댑터가 생기면 유지보수 힘들 수 있다.
실행시간에 약간의 성능 저하 가능성이 있음
중간 계층(어댑터)을 거쳐야 하기때문이다.
어댑터 클래스의 의도 파악이 어려울 수 있음
명확한 문서화나 네이밍이 중요하다.
Adapter 은 언제 사용하나?
- 기존 코드(클래스)를 변경하지 않고 재사용하고 싶을 때
ex) 오래된 레거시 클래스와 새로운 코드 연결
⇒ 레거시 코드를 수정하지 않고 새 코드에서 사용 가능 - 클래스들의 인터페이스가 맞지 않아 함께 사용하지 못할 때
ex) 기존 구조 변경 없이 시스템 확장
⇒ 시스템의 구조를 건드리지 않고 기능 추가 가능 - 라이브러리나 외부 API를 내 코드에 맞춰 쓰고 싶을 때
ex) 외부 API 사용 시 내 코드와 인터페이스 불일치
⇒ 외부 API를 내 코드에 맞춰서 포장
정리하자면
- 외부 API, 레거시 코드, 인터페이스 불일치 상황에서 기존 코드 변경 없이 재사용하려고 서로 다른 인터페이스를 연결시켜주는 패턴이다.
- 재사용성이 높으며 유연성이 증가한다.
- 구조 복잡도가 증가하며, 과용 시 혼란스럽다.
'👩🏻💻 About 프로그래밍 > Spring, Spring boot' 카테고리의 다른 글
[디자인 패턴] - Composite (0) | 2025.04.07 |
---|---|
[디자인 패턴] - Bridge (0) | 2025.04.07 |
[디자인 패턴] - Singleton (0) | 2025.03.25 |
[디자인 패턴] - Prototype (0) | 2025.03.25 |
[디자인 패턴] - Factory Method (0) | 2025.03.25 |
블로그의 정보
Hello 춘기's world
볼빵빵오춘기