본문으로 바로가기

7. Adaptor Pattern

category Design Pattern/Head FIrst Design Pattern 2019. 5. 23. 20:07

7 Adaptor Pattern(어뎁터 패턴)


7.1 어뎁터

일상에서 어뎁터란 말을 많이 들어보셨을거에요.

우리나라 전자제품의 플러그를 일본에 가져가면 콘센트가 달라서 끼울 수 없는게 그 예죠.


                                

우리나라 플러그와 콘센트                                                 일본 콘센트



이런 경우 우리는 어뎁터를 이용해 규격이 다른 플러그(우리나라 플러그)를 다른 곳(일본 콘센트)에 사용할 수 있죠.



어뎁터 패턴도 마찬가지랍니다. 어떠한 인터페이스를 사용하는 코드에 해당 인터페이스 대신 어뎁터를 씌운 다른 인터페이스를 사용할 수 있도록하는 패턴이죠.


7.2 Adaptor Pattern 이란

한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환합니다.

어뎁터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없었던 클래스들을 연결해서 쓸 수 있죠.

- Adaptor class는 Target interface를 구현합니다.


7.3 Decorator Pattern과 Adaptor Pattern의 차이

두 패턴 모두 객체를 감싸 타입을 변환시켜 주는 것은 같지만 감싸는 목적이 다릅니다.

- Decorator Pattern의 경우 구성을 통해 객체를 감싼 후 기능을 확장시키는 것이 목적

- Adaptor Pattern의 경우는 구성을 통해 객체를 감싼 후 인터페이스를 변환시켜 틈새를 매우기 위한 목적


7.4 Simple Adaptor

오리와 칠면조를 이용한 간단한 예를 보여드릴게요.


7.4.1 Target

기존 클라이언트에서 사용하는 interface와 이를 구현한 클래스입니다.


7.4.2 Targetee

새롭게 클라이언트에서 사용하고자 하는 인터페이스와 그 구현 클래스입니다.


7.4.3 Adaptor

새로운 인터페이스를 기존 클라이언트가 사용할 수 있도록 인터페이스의 형태를 변환시켜주는 어뎁터 클래스입니다.


7.4.4 Test class

테스트를 위한 클래스입니다.


7.5 Adaptor Pattern을 이용한 Enumeration interface와 Iterator interface

오리 칠면조 예를 통해 어느정도 어뎁터 패턴에 대해 이해하셨을거에요.

이제 실제로 어뎁터 패턴이 어떤식으로 적용될 수 있는지 예를 들어 설명할게요


7.5.1 Enumeration과 Iterator란 무엇인가?

둘 모두 자바에서 제공하는 컬렉션에 대해 각 컬렉션의 항목들을 순차적으로 접근하는데 사용되는 인터페이스입니다.

이렇게 컬렉션에 저장된 항목들에 순차적 접근을 제공하는 것을 뷰 객체라고 합니다.


7.5.2 Enumeration과 Iterator의 차이

Enumeration

Enumeration은 Java 초기(1.2버전 이전)에 개발되었고 Hashtable, Vector, Stack 에서만 사용가능한 뷰 객체입니다.

위 세 컬렉션에는 elements()메소드가 구현되어 있었고 호출시 Enumeration을 리턴했죠.

Enumeration는 hasMoreElements(), nextElement()메소드를  가졌습니다.


- Iterator

Java는 1.2버전 이후 크게 변화되었는데 그 중 하나가 여러가지 컬렉션 클래스들을 컬렉션 프레임워크라는 단위로 관리하기 시작한 거죠.

Iterator는 1.2버전 이후 개발된 컬렉션 프레임워크의 Collection interface를 구현한 모든 컬렉션에 사용가능한 컬렉션 뷰입니다.

Collection interface를 구현한 컬렉션 클래스들은 iterator()메소드를 호출해 Iterator를 리턴받습니다.

Iterator는 hasNext(), next(), remove()메소드를 가졌습니다.



7.5.3 실전 EnumerationIterator (어뎁터 클래스)

현재 작성된 코드는 최신 코드로서 Iterator 인터페이스를 사용하는 코드입니다.

그런데 클라이언트에 예전에 작성해 놓은 Enumeration 인터페이스를 사용하는 구형 코드를 적용시켜야 한다면 어떻게 하면 될까요?

Adaptor Pattern을 적용해 interface 형식을 변환해 주면 될 것 같습니다.

이 경우 Target은 Iterator가 되고 Targetee는 Enumeration이 되겠죠.


7.5.4 EnumerationIterator class





'Design Pattern > Head FIrst Design Pattern' 카테고리의 다른 글

9. Template Method Pattern  (0) 2019.05.31
8. Facade Pattern  (0) 2019.05.25
6. Command Pattern  (0) 2019.05.20
4. Factory Pattern - (1) SImple Factory  (0) 2019.04.21
3. Decorator Pattern  (0) 2019.04.21