ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Design Pattern] 어댑터 패턴 (Adapter Pattern)
    공부/디자인 패턴 2020. 2. 29. 22:38

    어댑터 패턴이란?

    한 클래스의 인터페이스를 다른 클래스에서 사용하고자 할 때, 다른 클래스에서 사용할 수 있도록 호환성을 제공해주는 패턴입니다. 예를 들어, 한국에서는 220v가 표준이지만 일본은 110v가 표준입니다. 한국에서 사용하는 충전기를 일본에 가져가면 콘센트의 모양이 맞지 않아 충전을 할 수 없습니다. 이 때, 돼지코와 같은 변환기(어댑터)를 사용해 한국에서 가져온 충전기를 일본에서 충전할 수 있도록 하는 기능이 여기서 말하는 어댑터 패턴이라 볼 수 있습니다.

    예시

    아래와 같이 한국전자제품 인터페이스와 삼성 클래스가 있다고 구현합니다.

    public interface KoreaElectronicProduct { 
        public void 220v(); 
        public void electricPressure(); 
    }
    
    
    public class Samsung implements KoreaElectronicProduct { 
        @Override 
        public void 220v() { 
            System.out.println("220v"); 
        } 
        @Override 
        public void electricPressure() { 
            System.out.println("electricPressure 220v"); 
        } 
    }
    


    다음은 일본전자제품 인터페이스와 닌텐도 클래스가 있다고 구현합니다.

    public interface JapanElectronicProduct { 
        public void 110v(); 
        public void electricPressure();
    }
    
    
    
    public class Nintendo implements JapanElectronicProduct { 
        @Override 
        public void 110v() { 
            System.out.println("110v"); 
        } 
        @Override 
        public void electricPressure() { 
            System.out.println("electricPressure 110v"); 
        } 
    }


    여기서 삼성 클래스에 일본 전자제품 인터페이스를 붙이려 하면 사용하고 있던 인터페이스 형태가 다르기 때문에 바로 사용할 수 없습니다. 따라서 아래와 같이 어댑터를 만들어 사용해야 합니다.

    public class SamsungyAdapter implements JapanElectronicProduct {
    
        Samsung samsung;
    
        public SamsungyAdapter(Samsung samsung) {
            this.samsung = samsung;
        }
    
        @Override
        public void 110v(){ 
            samsung.220v();
        }
    
        @Override
        public void electricPressure() {
            samsung.electricPressure();
        }
    }
    
    
    
    public class DuckTestDrive {
        public static void main(String[] args) {
            Nintendo nintendo = new Nintendo();
            Samsung samsungKorea = new Samsung();
            JapanElectronicProduct samsungAdapter = new SamsungyAdapter(samsungKorea);
            
            samsungAdapter.110v() // 220v
            samsungKorea.220v() // 220v
            nintendo.110v() // 110
        }
    }


    어댑터는 클래스 어댑터와 객체 어댑터 두 가지가 있는데 클래스 어댑터는 다중상속이 필요한 형태입니다. 자바에서는 다중 상속이 지원되지 않으므로 위와 같은 형태로 어댑터 패턴을 구현할 수 있습니다.

    댓글