제 홈페이지의 모든 글은 anti-nhn license에 따릅니다.



자바 디자인 패턴 2 - Adapter

1. Adapter 패턴은..

이미 구현되어 있는 코드가 있는데, 둘이 연결 좀 시켜주고 싶을 때가 있죠. 어떤 좋은 메쏘드가 있는데, 인자로 A라는 형식을 받습니다. 근데, 이미 구현되어 있는 코드에는 B라는 형식으로 구현되어 있습니다. 이럴 때, B를 A의 형식으로 바꿔주면 좋은 메쏘드를 써먹을 수 있습니다. Adapter 패턴은 어떤 오브젝트를 캐스팅이 불가능한 다른 클래스의 형태로 변환시켜주는 것입니다.

2. 예제

---------------Adapter Class --------------------
package ch02_adapter;

import java.util.Enumeration;
import java.util.Iterator;

public class IteratorToEnumeration implements Enumeration<String>{
    private Iterator<String> iter;
    public IteratorToEnumeration(Iterator<String> iter) {
        this.iter = iter;
    }
    public boolean hasMoreElements() {
        return iter.hasNext();
    }
    public String nextElement() {
        return iter.next();
    }
}

---------------뭔가 훌륭한 method를 가지고 있는 클래스 ------------
package ch02_adapter;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

public class Test {
    public static void goodMethod(Enumeration<String> enu){
        while (enu.hasMoreElements()) {
            System.out.println(enu.nextElement());
        }
    }
 
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("이은결");
        list.add("Kevin parker");
        list.add("David Blaine");
        Enumeration<String> ite = new IteratorToEnumeration(list.iterator());
        Test.goodMethod(ite);
   }
}

우리가 최종적으로 쓰고자하는 것은 goodMethod() 입니다. 그 녀석은 인자로 Enumeration을 받고 있지요. 그러나 우리가 가지고 있는 것은 Iterator입니다. IteratorToEnumeration 클래스는 Iterator를 받아서 Enumeration 으로 변경시켜줍니다.
AtoB의 형태를 가지는 Adapter는 A를 멤버변수로 가지고 B를 구현합니다. 소스코드에 색깔 칠해논 부분을 확인하세요.

3. Adapter를 구현하는 방법

위에서 소개된 방법은 "구성을 통한 방법" 또는 "위임을 통한 방법"입니다. Adapter 자체는 하는 일이 별로 없습니다. 내부적으로  멤버한테다가 일을 다 떠넘깁니다. 외관상 다른 형태로 변환가능하기 위한 것이지 어떤 일을 직접할려는 것은 아닙니다.

두번째 방법은 상속을 이용하는 방법입니다. A to B로 할 경우 A와 B를 둘다 구현하는 방법입니다. A와 B가 둘 다 인터페이스거나, 하나만 인터페이스일 때는 가능하지만, 둘 다 클래스일 경우에는 불가능하죠. 
상속을 쓰는 것은 바람직하지 않습니다. "상속보다는 구성을 이용하라"는 원칙에 어긋납니다. 이 원칙에 대해서는 다음 설명드리죠.

세번째 방법은 Adapter 클래스를 만들지 않고 method로 만드는 방법입니다.  다음과 같은 코드는 위에서 구현한 것과 같은 효과를 보여주죠.

    public static Enumeration<String> iteratorToEnumeration(final Iterator<String> iter) {
        return new Enumeration<String>() {
            public boolean hasMoreElements() {
                return iter.hasNext();
            }

            public String nextElement() {
                return iter.next();
            }
        };
    }

눈치 빠르신 분들은 인자가 final이란 것을 보셨겠지요. final로 말뚝 박는 건 "변경 절대 불가!" 를 보장하는 겁니다. 메쏘드 안에서 Enumeration의 구현체가 인자로 받은 것을 사용하는데, 이런 경우에는 인자가 final 로 정의되어야 하며, 그렇지 않을 경우 컴파일시에 문제가 됩니다.
final로 정의한다는 것은 read-only라는 뜻입니다. 주의할 것은 read-only라는 게 다른 변수로 할당을 못한다는 것 뿐 내부의 메쏘드를 호출하지 못한다는 것은 아닙니다. (메쏘드 내부에서 iter = 따른거; 와 같이 할 수 없다는 거죠.) 즉 Immutable일 경우에는 진짜 read-only가 보장되지만, 위의 예제 같은 경우는 보장되지 않습니다. Immutable에 대한 얘기는 따로 다루겠습니다.

세번째 방법은 Adapter 패턴이라고 불리지는 않습니다. 그러나 하는 일이 똑같죠. 뭐라 불리건 말이 뭐가 중요합니까~~

4. JAVA API에 있는 Adapter

JDK에는 Adater를 구현해 논 게 없댑니다. AWT와 같은 UI관련된 애들 중에서 알아서 상속해서 쓰라는 인터페이스만 제공하고 있습니다.

위에서 소개한 세번째 방법을 통한 케이스는 무수히 많습니다. Integer, Float, Long 등과 같은 Wrapper 클래스들이 잔뜩 있지요.
Interger.valueOf(String) 은 String을 Integer로 바꿔주지요.

by 삼실청년 | 2007/09/19 16:15 | 컴터질~ | 트랙백 | 핑백(5) | 덧글(16)

트랙백 주소 : http://iilii.egloos.com/tb/3789009
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Linked at 건실성실착실 3실 청년! : .. at 2008/11/03 19:52

... 컨셉은 Wrapping 또는 캐스팅입니다. ServletException으로 변화될 수 없는 SQLException을 ServletException으로 담아서 넘기는 것이지요. Adapter 패턴을 생각하시면 됩니다. ... more

Linked at 건실성실착실 3실 청년! : .. at 2009/02/16 23:24

... 가 된 만큼 회원 정보를 서로 공유해야 하는데, 각 회사의 시스템은 예전 자기 회사의 인터페이스만을 받아들이도록 되어있습니다. 서로 캐스팅이 불가능한 객체를 캐스팅하고 싶을 때 Adapter 패턴을 씁니다. 다음과 같은 6개의 Adapter가 필요합니다.AToBUserAToCuserBToAUserBToCUserCToAUserCToBUser아... 복잡해지기 시작합 ... more

Linked at 자바 디자인 패턴 2 &#82.. at 2012/07/12 15:15

... on &larr; Previous 자바 디자인 패턴 2 &#8211; Adapter Posted on 2012/07/12 by allnewangel 이 글은 삼실청년님의 블로그 글을 정리용으로 옮긴 내용입니다. 원본 글은 링크를 참고해 주세요. 1. Adapter 패턴은.. 이미 구현되어 있는 코드가 있을때, 둘을 ... more

Linked at java design patt.. at 2017/05/31 09:25

... 2. 자바 디자인 패턴 2 – Adapter</A> 3. 자바 디자인 패턴 3 &#8211; Factory Method 4. 자바 디자인 패턴 4 &#8211; Template Method 5. 자바 디자인 패턴 5 – Singleton 6. 자바 디자인 패턴 6 – Strategy 7. 자바 디자인 패턴 7 – Composite 8. 자바 디자인 패턴 8 – Decorator 9. 자바 디 ... more

Linked at 자바 디자인 패턴 종류 &#8.. at 2017/09/26 09:15

... 자바 디자인 패턴 종류 2017-09-26 by user&middot;0 Comments 1. 자바 디자인 패턴 1 – Iterator 2. 자바 디자인 패턴 2 – Adapter 3. 자바 디자인 패턴 3 &#8211; Factory Method 4. 자바 디자인 패턴 4 &#8211; Template Me ... more

Commented by 꿈먹정래 at 2008/10/31 16:11
d아~ 아~

ㅋ 막 돌이 굴러갑니다 ㅎㅎ

잘 보구 계속 배우겠습니다 ^_^ 수고하세요
Commented by 삼실청년 at 2008/11/03 20:05
ㅋㅋ. 뇌세포 활성화에 도움이 되셨다니 다행입니다.
간혹 달아주시는 리플에 힘입어 오늘 글 하나 올렸습니다.
Commented by dev용식 at 2008/11/05 11:32
올려주신 포스트로 하루에 하나씩 공부하고 있습니다 ㅋㅋ
요즘은 디자인 패턴을 보고 있네요. Java 디자인 패턴 입문이라는 책도 잘 쓰여져 있긴 했는데
삼실청년님께서 올려주신 포스트가 좀 더 활용하기 쉽게 작성되어 있네요

오늘도 잘 보고 갑니다~

(평소엔 공부 잘 안하다가 꼭 플젝 시작하면 공부하는 이 심뽀는....
학생때 시험공부하려고 앉으면, 공부는 안하고 책상 정리만 신나게 하는 그런 거랑 같은걸까요 -_-)
Commented by 삼실청년 at 2008/11/05 12:20
ㅋㅋ 저도 그 책 보다가 수십번 포기했습니다.-_-; 예제가 좀 난해하더군요.
Head first 디자인 패턴을 추천합니다....만... 호불호가 너무 명확히 갈리는 책입니다. 그냥 차근차근 공부하기는 좋은데, 찾아보면서 공부하기는 좀 적당하지 않습니다.
그리고, 패턴이 몇 가지 밖에 안 나와있다는 단점도 있습니다. 나머지 패턴도 써주면 기꺼이 사줄 용의도 있는데... 안 쓰더군요.
Commented by 김경모 at 2009/02/04 09:55
쉽게 설명해주셔서 이해가 갔는데..

public static Enumeration<String> iteratorToEnumeration(final Iterator<String> iter) {
return new Enumeration<String>() {
};
}
이렇게 하는 코딩.. 이해가 안가네용.. ;;ㅜ
Commented by 삼실청년 at 2009/02/04 10:42
정확히 뭘 물어보는 지 잘 모르겠습니다만.. 대충 짐작가는 데로 말씀을 드리죠..
만약 <String> 에 관련된 부분이라면, generics 를 보시면 되구요. (제 블로그에 열심히 정리해놨습니다^^)
inline 클래스를 말씀하시는 거라면, 좀 예제를 단순화 시켜보죠.

public interface SomeInterface{
void someMethod();
}
와 같은 인터페이스가 있을 때,

public static getSomeInterface(){
return new SomeInrteface(){
public void someMethod(){
System.out.println("someMethod");
}
}
}
와 같이 처리하는 걸 말하는 겁니다. (인터페이스를 new로 생성하는 게 좀 재밌는 부분이죠.)

그러니깐, 어떤 interface를 구현하거나 어떤 클래스를 상속받은 다른 클래스를 만드는데, 새로 만든 요 클래스가 여기 말고는 쓰일 데가 없을 때, 굳이 클래스 파일을 하나 만들면 소스가 지저분해집니다. 이럴 때 로직 안에서 클래스를 만들어서 사용하는 방법입니다. inner class의 종류 중 하나입니다.

혹시 여쭤보신 게 다른 거면 다시 답글 달아주세요.
Commented by 김경모 at 2009/02/04 13:12
네.. 제가 원하던 답변입니다.. 정말 감사합니다.. ^^ 혹시 실례가 되지 않는다면 무슨일 하시는지
여쭤봐도 될까요? 전 올해 27살이 된 1년차 초초초보 프로그램일을 하고 있는 신입입니다 ^^
Commented by 삼실청년 at 2009/02/04 16:43
자바일하죠머ㅋㅋ 초초초보가 벌써 디자인 패턴을 공부하신다니 훌륭하십니다~
경력을 알고 싶으신가요? php 한 2년 했고, 자바는 한 4년 한 거 같네요. 대략 중간중간에 많이 놀아서 나이는 쫌 됩니다. 성별은 남자고 소개팅이라도 시켜주시면 고맙게 받아먹을 생각 있습니다ㅋㅋ
Commented by 김경모 at 2009/02/05 13:40
그러시군요 ^^ 요새 디자인패턴에 대해 공부를 하고 있습니다.. 예전엔 잘 읽히지 않았는데 청년님의 글과 책을 함께 보니 이해가 잘되네요 ^^; 요새 걱정을 많이 하고 있습니다. 움..미래에 대한 불확실성? 때문인지 .. 할것은 많은데.. 제가 노력을 안하는것 같고용.. ^^; 하고싶은건 너무 많네요.
루씬에도 관심이 가고용..웹에도 관심이 가구용 ^^; 관심만 갖고 정작 하는건 별로 없네요..그래서 걱정이 되나? ㅎㅎ 지금 하는일은 CRM관련 일을 합니다만.. 신입이라 모 하는것도 별로 업구요 ^^
선배님의 좋은 조언 부탁좀 드립니다..
웹은 JSP, 자바스크립트, 스트럿츠 조금씩 책으로만 공부해봤지.. 실질적인 프로젝트 경험은 없습니다..
또한 책을 보고 공부를 하는데 제가 응용하는 능력이 부족한것 같습니다..
논리적은 개념이 부족한것 같기도 하구요... 훔...후배에 고민을 좀 들어주세용 ^^;
Commented by 삼실청년 at 2009/02/05 18:47
쩝.. 고민을 들어드리는 것은 어렵지 않으나 해결책은 저도 모르겠네요. 알고 있었으면 저도 좀 더 잘 살고 있지 않았을까요?--;
머 대략 제 주관적인 관점에서 말씀을 드리자면, 초보라면 기초를 탄탄히 다져 놓으시길 권장합니다. 뭐가 신기술이다, 뭐가 요즘 대세다.. 머 이런 거 보다는 기초를 다지는 게 훨씬 중요한 것 같습니다. 지식은 빈익빈 부익부입니다. 많이 아는 놈이 더 빨리 배웁니다. 특히 기초는 다른 지식을 배우는데 있어서 이해의 속도를 월등히 향상시킵니다.
신입이라 하는 일이 없다면 남의 일이라도 배우시길 권장합니다. 저만의 스타일인지는 모르겠지만, 뭐든 배우려고 달려드는 사람한테는 좀 더 가르치게 되고, 가르쳐도 별로 발전 없는 사람한테는 가르치지 않게 되더군요. 최소한 열심히 하는 사람이라는 인식만이라도 여기저기 박아 놓으시는 게 유리할 겁니다.
그리고 삶의 99%는 삽질이라는 것을 받아들이면 좀 편해집니다. 1%만 가치가 있는데 하는 순간에는 그게 1%인지 99%인지 구별을 못하니깐 일단 하면 됩니다. 그렇게 하는 횟수를 늘이면, 1% 들이 쌓이겠지요.
본의 아니게 잘난 척만했네요. 조금이나마 도움이 되시길 빕니다.
Commented by 이승은 at 2010/01/06 11:47
정말 맘에 드는 내용들이네요..
head first design pattern책이 있긴하지만 왠지 읽다보면 귀찮아진다는;;;
근데 여기 블로그에 적혀 잇는 내용들은 지루하지도 않은 정도의 내용들로 핵심들만 구성되어 있네요..
너무 감사합니다^^
Commented by negabaro at 2012/06/25 13:44
Commented by 간달퐁 at 2013/06/20 10:35
ㅎㅎ도움되는글 잘읽고갑니다.
지금은 뭐하고 계실지 어떤코딩을하실지 심히 궁금해지네요
Commented by 삼실청년 at 2013/07/07 07:12
날코딩 막코딩하고 있습니다.ㅜㅜ
여기 적어놓은 건 나름 많이 생각하고 정리한 거라 잘 정리된 느낌이겠지만 실전에서는 날코딩을 구사합니다.ㅜㅜ
Commented by 주금석 at 2013/12/03 10:25
안녕하세요.3년차 왕초보 java개발자입니다.
요즘 디자인패턴 공부하는데 많은 도움이 되네요^^
감사합니다~
Commented by 삼실청년 at 2013/12/11 01:10
부디 멈추지 마시고 쭉 달리시길 빌겠습니다. 하래는 건 다 하긴 할 수 있는 단계가 되면 조심하지 않으면 멈춰버립니다. 그게 보통 3년 차 정도인 것 같아요. 3년차 실력 그대로~ 20년 정도 버티는 사람들 많습니다.

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶