https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4#
어댑터란???
사전적 의미로는 장치 또는 기계의 다른 부분을 연결하는 장치로, 적합하지 않은 두 개의 부분을 전기적 또는 기계적으로 접속하기 위한 장치 또는 도구를 말합니다.
우리가 여행을 갈 때 보통 그 나라에서 사용하는 전기 코드 모양이 조금씩 다 다르기 때문에 여행용 멀티 어댑터를 챙기기 마련입니다.
이와 마찬가지로 어댑터 패턴은 한 클래스의 인터페이스를 사용하고자 하는 다른 인터페이스로 변환할 때 주로 사용하며, 이를 이용하면 인터페이스 호환성이 맞지 않아 같이 쓸 수 없는 클래스를 연관 관계로 연결해 주는 패턴입니다.
(메서드를 바로 호출하지 않고 중간에 어댑터를 거쳐 메소드를 호출한다.)
그렇다면 어댑터를 사용하는 이유는 무엇일까?
바로 기존에 잘 구축되어 있는 것을 가지고 새로운 것을 구현할 때 코드의 낭비를 줄이고, 변형 사용하면 더욱 쉽게 구현할 수 있기 때문입니다.
코드를 보자
기존에 이미 구현된 2배와 절반을 구하는 Math 클래스가 있다고 가정한다. double형을 매개변수로 받아 double형으로 리턴한다.
public class Math {
// 절반
public static double half(double num) {
return num/2;
}
// 2배
public static Double doubled(Double d) {
return d*2;
}
}
어댑터 패턴을 이용해서 이 클래스를 변형해서 사용하고 싶다.
우선 인터페이스만 선언한다.
public interface Adapter {
// ** Math에 있는 알고리즘을 이용해서 원하는거에 맞게 변형 구현은 IMPL에서
// 원하는 기능
public Float twiceOf(Float f);
// 원하는 기능
public Float halfOf(Float f);
}
인터페이스 구현부를 보자.
public class AdapterImpl implements Adapter{
@Override
public Float twiceOf(Float f) {
return (float) Math.doubled(f.doubleValue()).floatValue();
}
@Override
public Float halfOf(Float f) {
return (float) Math.half(f.doubleValue());
}
}
기존에 구현된 메소드는 double형을 받아 double형을 반환하지만 어댑터를 이용해
float형을 받아 float형을 리턴하는 함수를 구현했다.
Main 메소드
public class Main {
public static void main(String[] args) {
Adapter adapter = new AdapterImpl();
System.out.println(adapter.twiceOf(100f));
System.out.println(adapter.halfOf(80f));
}
}
위 코드는 매우 단순한 예시를 들었지만 좀 더 자세한 이해를 위해서 아래 링크를 확인하기 바랍니다.
참고 및 출처
https://niceman.tistory.com/141
https://gdtbgl93.tistory.com/141
https://limkydev.tistory.com/78
소스코드
https://github.com/garam-park/java-designpattern
'Java > design pattern' 카테고리의 다른 글
[java] 6강 프로토 타입 패턴(Prototype Pattern) (2) | 2020.01.22 |
---|---|
[java] 5강 싱글톤 패턴(singleton pattern) (0) | 2020.01.22 |
[java] 4강 팩토리 메소드 패턴(Factory Pattern) (0) | 2020.01.22 |
[java] 3강 템플릿 메소드 패턴(Template Method Pattern) (0) | 2020.01.13 |
[java] 1강 스트래티지 패턴(strategy pattern) (0) | 2020.01.08 |