2. Adapter - 사이에 끼워 재사용한다
2. Adapter - 사이에 끼워 재사용한다
Adapter 패턴
제공된 것과 필요한 것 사이에 들어가서 그 사이를 채우는 것이 어댑터의 역할.
Adapt
- (새로운 용도·상황에) 맞추다[조정하다]
- (상황에) 적응하다
Adapter 패턴은 Wrapper 패턴이라고도 한다.
Adapter 패턴의 종류
- 클래스에 의한 Adapter 패턴(상속을 사용한 패턴)
- 인스턴스에 의한 Adapter 패턴(위임을 사용한 패턴)
상속을 사용한 Adapter 패턴 예제
이 예제에서는 상속을 사용하여 Adapter 패턴을 구현합니다. 기존에 있는 OldSystem
클래스의 인터페이스를 새로운 NewSystem
인터페이스에 맞게 변환하는 어댑터 클래스를 만들어 보겠습니다.
// 기존의 시스템 클래스
class OldSystem {
public void oldMethod() {
System.out.println("기존 시스템 메서드");
}
}
// 새로운 시스템 인터페이스
interface NewSystem {
void newMethod();
}
// 상속을 사용한 어댑터 클래스
class Adapter extends OldSystem implements NewSystem {
public void newMethod() {
oldMethod();
}
}
public class Main {
public static void main(String[] args) {
NewSystem newSystem = new Adapter();
newSystem.newMethod(); // "기존 시스템 메서드" 출력
}
}
위임을 사용한 Adapter 패턴 예제
이 예제에서는 위임을 사용하여 Adapter 패턴을 구현합니다. 기존의 OldSystem
클래스를 사용하고, 새로운 NewSystem
인터페이스에 맞게 작동하도록 어댑터 클래스를 만들어 보겠습니다.
// 새로운 시스템 인터페이스
interface NewSystem {
void newMethod();
}
// 기존의 시스템 클래스
class OldSystem {
public void oldMethod() {
System.out.println("기존 시스템 메서드");
}
}
// 위임을 사용한 어댑터 클래스
class Adapter implements NewSystem {
private OldSystem oldSystem;
public Adapter(OldSystem oldSystem) {
this.oldSystem = oldSystem;
}
public void newMethod() {
oldSystem.oldMethod();
}
}
public class Main {
public static void main(String[] args) {
OldSystem oldSystem = new OldSystem();
NewSystem newSystem = new Adapter(oldSystem);
newSystem.newMethod(); // "기존 시스템 메서드" 출력
}
}
두 예제 모두 OldSystem
클래스의 기능을 NewSystem
인터페이스에 맞게 호출할 수 있도록 어댑터를 구현했습니다. 하나는 상속을 사용하고 다른 하나는 위임을 사용하여 어댑터를 만들었습니다.
위임
'누군가에게 맡긴다'는 의미.
Java에서 위임은 어떤 메소드의 실제 처리를 다른 인스턴스의 메소드에 맡기는 것.
어떤 경우에 사용하는 것일까?
필요한 메소드가 있으면 바로 사용하면 되는데 왜 굳이 Adapter 패턴을 사용할까?
프로그래밍은 늘 백지 상태에서 시작하는 것이 아니기 때문!
이미 존재하는 클래스를 내가 원하는 방법으로 사용하고 싶을 때 사용한다.
이때, 기존 코드를 수정하는 것이 아니라 Adapter 패턴을 사용하여 기존 코드를 유지하면서 내가 원하는 방법으로 사용할 수 있다.
또한, 버전업 또는 하위 호환성을 위해서 Adapter 패턴을 사용할 수도 있다.
상속 or 위임
일반적으로 위임을 사용하는 편이 문제가 적다.
상위 클래스의 동작을 자세히 모르면 상속에서 문제가 발생할 수 있기 때문.