[JDK에서 찾아본 디자인 패턴] 2. 어댑터 패턴

김민규·2021년 8월 17일
0

design pattern

목록 보기
2/4

1. 어댑터 패턴(Adapter pattern)이란?

어댑터 패턴은 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해줍니다.

여기서 어댑터라는 개념은 노트북 어댑터(Adapter)를 생각하시면 됩니다. 콘센트 전원에서 나오는 전기는 대개 교류 200V이지만 노트북은 직류 120V입니다. 그렇지만 우리는 노트북을 사용할 때 아무런 불편 없이 노트북 선을 전원에 그대로 꽃아 사용할 수 있습니다.그 이유는 중간에 교류 200V를 120V로 바꾸어 주는 어댑터가 존재하기 때문입니다.

이와 비슷한 맥락에서 '어댑터 패턴'은 노트북 어댑터의 역할 처럼 기존 클래스를 재사용할 수 있도록 중간에서 맞춰주는 역할을 합니다. 다시말하자면, 호환성이 없는 기존 클래스의 인터페이스를 변환해 재사용할 수 있도록 해줍니다.

어댑터 패턴은 아래와 같이 2가지 형태로 사용됩니다.

  1. 클래스 어댑터 패턴 : 상속을 이용한 어댑터 패턴입니다.
  2. 인스턴스 어댑터 패턴 : 위임을 이용한 어댑터 패턴입니다.

2. 클래스 다이어그램

  • 2-1. object adapter pattern(instance adapter pattern)

    • client interface : Adapter가 implements하는 인터페이스 입니다. 클라이언트는 Client Interface를 통해 adaptee인 서드파티 라이브러리를 사용하게 됩니다.

    • adaptee(Service) : 서드파티 라이브러리나 외부시스템을 의미합니다.

    • Adapter : Client와 Adaptee중간에서 호환성이 없는 둘을 연결시켜주는 연결시켜주는 역할을 담당합니다. Client interface를 implements하며, Client는 Client Interface를 통해 Adapter에 요청을 보냅니다. Adapter는 Client의 요청을 Adaptee(Service)가 이해할 수 있는 방법으로 전달하고, 처리는 Adaptee(Service)에서 이루어집니다.
  • 2-2. class adapter pattern

    • class adapter apttern은 두 객체로 부터 같은 시점에 상속받습니다. 위와 같은 접근법은 C++과 같은 다중상속을 지원하는 언어에서만 사용할 수 있는 특수한 방식입니다.

3. JDK에서 어댑터 패턴 예시

JDK에서 사용되는 대표적인 Adapter pattern으로는 InputStreamReader가 있습니다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

위 코드를 보면 InputStreamReader클래스는 System.in클래스의 Adapter역할을 하며, System.in은 Adaptee의 역할을 하고 있습니다.

InputStreamReader 생성자

public InputStreamReader(InputStream in) {
    super(in);
    try {
        sd = StreamDecoder.forInputStreamReader(in, this, (String)null); // ## check lock object
    } catch (UnsupportedEncodingException e) {
        // The default encoding should always be available
        throw new Error(e);
    }
}

InputStreamReader 생성자에서는 InputStream클래스를 받아 사용합니다.

자바의 InputStream은 바이트 스트림을 읽어들입니다. 하지만, BufferedReader는 캐릭터인풋 스트림을 읽어들이므로, 둘은 호환되지 않습니다. 하지만, 이 둘을 연결시켜 주는 어댑터인 InputStreamReader를 사용함으로써 호환되지 않는 두 개의 기능을 연결시켰습니다.

아래는 UML구조입니다.

간단한 예제

public static void main(String[] args) throws Exception {
	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

	String name = "";
	while (!name.equals("stop")) {
		System.out.println("Enter data: ");
		name = br.readLine();
		System.out.println("data is: " + name);
	}

	br.close();
}

Reference

https://m.blog.naver.com/dktmrorl/222084011455
https://refactoring.guru/design-patterns/adapter
https://yaboong.github.io/design-pattern/2018/10/15/adapter-pattern/

profile
개발자

0개의 댓글