정보공간_1

[2기 강남 안병현] GoF 디자인패턴 - Adapter 패턴 본문

IT 놀이터/Elite Member Tech & Talk

[2기 강남 안병현] GoF 디자인패턴 - Adapter 패턴

알 수 없는 사용자 2012. 8. 19. 18:36

 안녕하세요 강남 멤버쉽 21기 안병현입니다.

 저는 오늘 GoF디자인패턴중에서 Adapter패턴에 대해서 소개해드리려고 합니다. 디자인패턴이란 한마디로 정의내리기 어렵지만, 프로그래밍 과정에서 자주 겪는 문제점을 해결하기 위해 만들어진 정형화된 문제해결법이라고 보시면 될 것 같습니다. 수많은 디자인패턴 중에서 GoF디자인 패턴이 가장 대중적으로 알려져 있는데요. GoF 디자인 패턴은 Gang of Four라고 불리는 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides 이 네명의 소프트웨어 공학 연구자들이 쓴 책 ‘Design Patterns : Elements of Reusable Object-Oriented Software’ 에서 소개된 패턴들입니다. 디자인 패턴이라는 용어도 이 책에서 처음 제시되었다고 하네요. 디자인패턴이라는 것이 GoF 디자인 패턴만 있는 것은 아니지만 가장 대중적이고 기본적인 패턴이기 때문에 익혀두면 좋습니다.

 

 Adapter패턴

 Adapter패턴은 클래스의 인터페이스를 바꾸는 패턴입니다. 인터페이스가 맞지 않아 재사용이 어려운 클래스를 잘 동작하도록 만들어줍니다.

 

 추상화가 잘 된 클래스라고 하더라도 다른 프로젝트에서 사용하려고 할 때 인터페이스가 맞지 않아 재사용에 어려움을 겪을 수가 있습니다. 예를 들어 게임에 들어가는 “Character”라는 이름의 클래스가 있다고 해봅시다. Character 클래스는 move(), attack(), status() 등의 함수가 존재합니다.


 그런데 이 Character 클래스를 사용하는 게임 프레임워크가 바뀌면서 Character의 움직임을 제어하는 함수가 run()walk()로 분리되었습니다. 이 때, Character 클래스의 함수를 변경해야 할까요? 이러한 경우에 우리는 Adapter 패턴을 활용하여 문제를 해결할 수 있습니다.

 

 기존의 클래스를 재사용하고 싶지만 인터페이스가 맞지 않을 때,

 인터페이스가 다른 클래스들을 묶어서 함께 동작하도록 하고 싶을 때,

 인터페이스가 다른 클래스와 그 서브클래스들을 모두 재사용하고 싶을 때,

 이런 경우에  Adapter 패턴을 사용하면 좋습니다.

 

 Adapter 패턴은 Class Adapter 패턴과 Object Adapter 패턴 두가지로 나눠집니다.



Class Adapter 패턴은 다중 상속을 사용하여 인터페이스를 변경합니다.



 Object Adapter 패턴은 클래스를 포함하는 새로운 클래스를 만듭니다.

 

Class AdapterObject Adapter 패턴 사이에는 다음과 같은 장단점이 있습니다.

-Class Adapter

 - 기존의 클래스를 상속하여 원하는 인터페이스로 변환시키기 때문에 기존의 클래스를 상속하여 만든 클래스는 변환되지 않습니다.

 - 변환된 클래스는 기존 클래스의 서브클래스이므로 기존 클래스의 함수를 오버라이드할 수 있습니다.

-Object Adapter

 - 하나의 변경된 클래스로 다양한 기존 클래스의 서브클래스들을 사용할 수 있습니다.

 - 기존 클래스의 함수를 오버라이드할 수 없습니다.

 

Adapter 패턴을 사용할 때에는 다음 사항을 고려해야 합니다.

-       인터페이스를 변경하기 위해 해야하는 작업의 양은 두 인터페이스가 얼마나 비슷한가에 달려있습니다.

-       클래스 안에 인터페이스를 변경하는 기능을 추가하여 다양한 시스템에서 사용할 수 있도록 만들 수 있습니다.

-       Two-way Adapter 패턴을 사용하면 클래스의 투명성을 제공할 수 있습니다. Two-way Adapter 패턴은 각각의 다른 클라이트가 원하는 인터페이스를 모두 다중상속하여 다른 클라이언트가 동일한 객체를 사용할 수 있도록 합니다.

-       C++ 언어로 Adapter 패턴을 구현할 때에는 원하는 인터페이스는 public으로 변경이 필요한 클래스는 private로 상속하여 구현합니다.

 

 Adapter 패턴과 유사한 패턴들이 있습니다. Bridge 패턴, Decorator 패턴, Proxy 패턴 등이 Adapter 패턴과 유사합니다. 이 세가지 패턴에 대해서 간단히 소개해드리겠습니다. 더 궁금한 내용은 추가로 자료를 찾아보시기 바랍니다.

 

-       Bridge 패턴 : Bridge 패턴은 Object Adapter패턴과 유사합니다. 그러나 Adapter 패턴은 존재하는 클래스의 인터페이스를 바꾸는 것이 목적인데 반해, Bridge 패턴은 구현체를 인터페이스와 분리하여 독립적으로 사용하는 것이 목적이라는 점에서 차이가 있습니다.

-       Decorator 패턴 : Decorator 패턴은 인터페이스의 변화 없이 클래스를 추가하여 기능을 추가하는 패턴입니다. Decorator 패턴은 자기자신을 추가하여 기능을 추가할 수 있는데, Adapter패턴에서는 이런 기능을 제공하지 않습니다.

-       Proxy 패턴 : Proxy 패턴은 인터페이스를 바꾸지 않고 다른 클래스를 위한 대리인을 정의하여 사용하는 패턴입니다.


이상으로 Adapter 패턴에 대한 소개를 마치도록 하겠습니다. 다음달에는 GoF 디자인패턴 Mediator 패턴을 소개해드리도록 하겠습니다. 감사합니다.