1. Adapter란?
'사전적 의미 - 기계, 기구 등을 다목적으로 사용하기 위한 부가 기구'
어댑터는 우리 주변에서도 많이 볼수 있다, 대표적으로 110V 가전제품에 220V 어댑터를 끼워 사용하는걸 예로 들 수 있다.
다시 말해 서로 호환되지 않는 기능을 어댑터를 통해 호환시켜 작동하다록 하는 역할을 한다.
위 내용을 객체지향 프로그래밍에 적용시켜 보면 어댑터 패턴은 아래와 같은 내용으로 설명할 수 있다.
'어댑터 패턴은 호환되지 않는 인터페이스를 가진 객체들이 협업할 수 있도록 하는 구조적 디자인 패턴'
2. Adapter 패턴의 구현
요구사항
- 두 수에 대한 다음 연산을 수행하는 객체 구현
- 수의 두 배의 수를 반환 twiceOf(float):float
- 수의 반(1/2)의 수를 반환 halfOf(float):float
- Math 클래스에서 두 배와 절반을 구하는 함수는 파라미터와 return type을 double로 하여 이미 구현되어 있다.
이슈 사항
- 구현되어 있는 코드의 파라미터와 return type은 double이지만 요구사항은 float으로 되어 있음.
// 요구사항의 내용에 따라 미리 구현되어 있는 두배, 절반 기능을 가진 클래스
public class Math {
public static double twoTime(double num) { return num * 2; }
public static double half(double num) { return num / 2 }
}
public interface Adapter {
Float twiceOf(Float f);
Float halfOf(Float f);
}
public class AdapterImpl implements Adapter {
@Override
public Float twiceOf(Float f) {
return (float) Math.twoTime(f.doubleValue());
}
@Override
public Float halfOf(Float f) {
return (float) Math.half(f.doubleValue());
}
}
public class Main {
public static void main(String[] args) {
Adapter adapter = new AdapterImpl();
System.out.println(adapter.twiceOf(100f));
System.out.println(adapter.half(800f));
}
}
위 코드의 요구사항과 Adapter 패턴을 이용한 코드 구현을 살펴보자.
요구사항은 Float 타입의 파라미터를 받아 파라미터값의 두배 혹은 절반 값을 Float 타입으로 return 하도록 요구하고 있다.
다만 기존에 해당 기능이 double 타입의 파라미터와 return 타입을 가진채로 구현되어 있으며, 이는 활용하는 조건이 있다.
위 코드는 Interface를 이용해 기능을, AdapterImpl로 구현을 분리하였다.
또한 AdpaterImpl 클래스의 각 메서드는 Math 클래스의 기능을 마치 콘센트와 같이 연결하여 double 타입 기반의 기능 동작을 float 타입으로 동작할 수 있도록 변환해주고 있다.
이렇게 구현함으로 기존 구현되어 있던 Main, Math 클래스에 대해 변경사항 없이 쉽게 요구사항을 충족하여 개발할 수 있게 되었다.
더불어 위 요구사항외 추가 구현사항에 대해서도 Adapter 패턴의 구현체를 수정함으로 추가 요구사항에 대해서도 유연하게 대처할 수 있다.
'Software Engineering' 카테고리의 다른 글
[디자인패턴] 팩토리 메서드(Factory Method) 패턴 (0) | 2024.04.16 |
---|---|
[디자인 패턴] 빌더(Builder) 패턴 (0) | 2024.04.15 |
[디자인패턴] 전략(Strategy) 패턴 (0) | 2024.04.10 |