記錄

Adapter Pattern(어댑터 패턴) 본문

IT_Fundamental/디자인 패턴

Adapter Pattern(어댑터 패턴)

surhommejk 2017. 11. 16. 15:22


Adapter Pattern(어댑터 패턴)


이미 구현되어 있는 알고리즘을 사용하고 싶지만 반환하는 자료타입이 다를때 이를 해결해주는 패턴이다. 마치 여행가서 쓰는 어댑터처럼 전기를 쓰긴 쓰는데 전압만 바꿔주는 그런 어댑터와 같은 기능이다.

원리는 매우 간단하다. 인터페이스에서 필요한 메소드를 선언 후 이를 implements 하는 객체에서 구현한다. 그리고 구현은 기존에 있던 객체의 메소드를 불러와 그곳에서 파라미터에 '.doubleValue()'와 같은 메소드를 활용해서 제대로 된 타입을 집어 넣고 리턴에 강제로 (float)을 캐스팅 해서 결국 우겨넣는(?) 메소드를 하나로 정리하는 것이다. 그리고 이를 Main Class(메인이든 아니든 필요한 곳에서)에서 불러내어 사용하면 되고 이 때 집어넣는 파라미터 값에 자료형을 맞추기 위해 뒤에 F를 붙이는 것이다.(이 예시의 경우를 의미한다)

솔직히 이걸 쓸 일이 있는지는 모르겠다. 근데 그냥 뛰어넘기 싫어서 구현해보았다. 강의에서는 작업 규모가 커지면 이 방법이 훨씬 편하고 효율적이라고 했다.  그냥 필요한 함수를 갖고 있는 객체를 불러와서 .메소드() 한 뒤에 이를 맨 앞에서 강제 캐스팅해주는 것보다 효율적이라는 것이다. 이게 규모가 커지면 더 복잡해지니까 매번 불러와서 그렇게 하는 것보다 인터페이스도 만들고 굳이 이를 implements하는 객체를 만들어서 오버라이드까지 해서 메소드를 사용하는 것이라 추측해본다.


(그리는 것이 시간이 덜 들 것 같았는데 막상PPT로 만드니 더 빨리되고 더 깔끔하다.

하지만 손으로 쓴걸 찍어 올리는 것이 보람은 더 있군)




public class Math {
    
    public static double Twotime(double d) {
        return d * 2;
    }
    
    public static double Half(double d) {
        return d / 2;
    }
}

// 인터페이스에서 선언할 때부터 리턴 타입 설정
public interface Adapter {

    public Float Twotime(Float f);

    public Float Half(Float f);

}

// 간단한 강제 캐스팅을 통해 메소드 구현
public class AdapterImp implements Adapter {

    public Float Twotime(Float f) {

        return (float) Math.Twotime(f.doubleValue());
    }

    public Float Half(Float f) {
        return (float) Math.Half(f.doubleValue());
    }

}

// 값 뒤에 F가 붙는 이유는 AdapterImp에서 파라미터 타입을
// Float으로 정의하고 있기 때문
public class Main {

    public static void main(String[] args) {

        Adapter ad = new AdapterImp();
        
        System.out.println(ad.Twotime(100F));
        System.out.println(ad.Half(50F));
        
    }

}


출처: https://www.inflearn.com/

Comments