본문 바로가기
My Image
프로그래밍/Design_Pattern

[Design_Pattern] 어댑터 패턴(Adapter Pattern)

by Lim-Ky 2017. 8. 25.
반응형

안녕하세요 Limky입니다.

오늘은 디자인 패턴 중 어댑터 패턴(Adapter Pattern)에 대해서 알아보겠습니다.

 

Adatper 를 우리말로 바꿔보면 변환기 정도로 해석됩니다.

실생활에서 변환기를 우리는 참 많이 사용합니다.

예를 들어 핸드폰 충전기입니다. 핸드폰을 컨센트에다가 직접 접촉시켜 충전하지 않고

충전기라는 어댑터를 통해 핸드폰과 컨센트를 연결하여 핸드폰을 충전합니다.

 

그렇다면 왜 이런 Adapter를 쓸까요????

바로 기존에 이미 잘 구축되어 있는 것을 새로운 어떤 것이 사용 할 때 양쪽 간의 호환성을 유지해주기 위함입니다. 

 

 

 

자바에서도 직접적으로 메서드를 호출하지 않고 중간에 어댑터를 거쳐서 메서드를 호출하도록 하는 패턴이 바로 어댑터 패턴(Adapter Pattern) 입니다. 아래는 Adapter 디자인 패턴 테이블입니다.

 

 

 

 

 

어댑터 패턴(Adapter Pattern)을 구현하는 방법은 2가지입니다. 

 

  • 클래스 방식
  • 객체 방식 

 

우선 클래스 방식부터 보면서 차근차근 알아봅시다.

 

 

기존 : Camera

 

어댑터 : AdapterCamera (필요한 인터페이스 : Connectable)

 

새로운 : Main

 

 

 

Camera.java

public class Camera {

	void connectCamA() {
		System.out.println("connectCamA");
	}
	
	void connectCamB() {
		System.out.println("connectCamB");
	}
	
}

Connectable.java

public interface Connectable {

	 public abstract void connectCamA();
	 public abstract void connectCamB();
}

AdapterCamera.java

public class AdapterCamera extends Camera implements Connectable{

	@Override
	public void connectCamA() {
		// TODO Auto-generated method stub
		connectCamA();
	}

	@Override
	public void connectCamB() {
		// TODO Auto-generated method stub
		connectCamB();
	}


}
Main.java
public class Main {

	public static void main(String[] args) {
		
		Connectable connCam = new AdapterCameraByObject();
		connCam.connectCamA();
		connCam.connectCamB();
	}

}
 
간단한 예제를 구성하다 보니 언뜻 보면 그냥 직접 호출하지 왜 저렇게 거치고 거쳐서 호출하는 걸까 생각 할 수 있습니다. 만약 직접 호출이 안되는 경우이거나, 기존에 있는 것을 변화해서 호출해야 하는 경우를 생각하면 기존에 있는 Camera를 수정하지 않은 상태에서 interface와 Adapter만 수정하여 Main에서 원하는 메서드로 변화 시켜 호출 시켜 주는 것이라 생각하면 이해에 도움이 될 것입니다. 
 
위 코드는 클래스 타입으로 Adapter를 구현했는데 객체 타입으로 수정해 보겠습니다. 
간단합니다. 상속을 받지 않고 바로 내부 멤버 변수에 객체 인스턴스를 가지고 있으면 됩니다.
 
AdapterCamera -> AdapterCameraByObject 수정합니다.

 

AdapterCameraByObject.java

public class AdapterCameraByObject implements Connectable{

	Camera cam = new Camera();
	
	@Override
	public void connectCamA() {
		cam.connectCamA();
	}

	@Override
	public void connectCamB() {
		cam.connectCamA();
	}


}

 

 

 

오늘은 Adapter에 대해서 알아보았는데, 저는 예제를 간단하게 했지만, 더 괜찮은 예제가 있어 링크 드립니다. 구체적으로 변환하는 과정까지 코드에 있기 때문에 더욱 이해가 될 것입니다.

 

http://seotory.tistory.com/34

 

 

 

 

 

 

 

 

 

 

 

 

반응형

댓글