Adapter
- 이미 제공된 코드를 그대로 사용할 수 없을 때, 필요한 형태로 변환한 후 이용하는 경우가 자주 있는데, 이미 제공된 것과 필요한 것 사이의 차이를 메우는 디자인 패턴이 Adapter 패턴이다.
다른 표현으로 Adapter 패턴은 Wrapper 패턴이라고 불리기도 한다.
역할
- 기존 클래스 Adaptee
- 원하는 출력 Targer
- Adapter
기존 클래스 Banner 를 클라이언트가 원하는 메서드로 출력하고 싶을 때 상속 버전과 위임버전으로 각각 살펴본다.
클래스에 의한 Adapter 패턴 - 상속을 사용

- Print 인터페이스를 PrintBanner가 구현체로 구현하고 있다.
- PrintBanner는 Banner를 상속받아 사용된다.
- 여기서 PrintBanner는 Adapter의 역할을 수행한다.
- main 메소드는 PrintBanner를 통해 문자열을 호출하고 있으며 Banner를 통해 상속받은 메서드를 Print 인터페이스를 통해 구현하고 있다.
인스턴스에 의한 Adapter 패턴 - 위임을 사용

- PrintBanner 가 Adapter 역할을 수행하면서 Banner클래스를 컴포지션으로 받아서 메서드를 사용하는데 Print 클래스를 상속받아 메서드를 오버라이드 하면서 Banner 클래스 메서드를 사용하고 있다.
상속 vs 위임
- 일반적으로 상속을 사용하는 것보다 위임을 사용하는 편이 문제가 적은데 그 이유는 상위 클래스의 내부 동작을 자세히 모르면 상속을 효과적으로 사용하기 어려운 경우가 많기 때문이다.
- 클래스의 결합도를 낮추고 응집도를 높이는 방법 중 하나가 상속이 아닌 위임을 통해 구현될 수 있다. 상속 시 부모 클래스에 의존성이 높아지고 부모 클래스에 따라 자식 클래스를 모두 변경사항을 적용해야 되기에 결합도가 높아지는 클래스가 될 수 있다.
언제 사용할까?
- Adapter패턴은 기존 클래스에 한겹 덧씌워 필요한 클래스를 만든다. 이 패턴을 사용하면 필요한 메소드를 빠르게 만들 수 있다. 만약 버그가 발생하더라도 기존 클래스에는 버그가 없는 것을 알고 있으므로, Adapter 역의 클래스를 중점적으로 살펴보면 되고 프로그램 검사가 편해진다. 따라서 기존 코드에 새로운 코드를 작성할 때 사용한다.