|
2006년 12월 29일
알기쉬운 Bridge 패턴
주의사항이 글은 'Bridge 패턴'의 전체내용을 다루지 않으므로 'Bridge 패턴'을 자세히 공부하시려면 다른 자료와 책을 참고하시기 바랍니다. 추상클래스, 상속이 갖는 장점등을 모르신다면 아직 패턴을 공부할 시기가 아닙니다. 그외 OOP의 기본적인 내용과 사용하는 이유에 대한 설명은 하지 않습니다. 설명에 앞서저는 이해력이 부족하고 문제에 대한 답에 언제나 '왜?'를 찾는 습성(?)이 있습니다. 또한 '언제 어디에 사용해?'를 궁금해 합니다. 사용할 곳을 못찾으면 배우는 의미를 느끼지 못하고 결국 잊어버립니다. 그래서 공부를 함에 있어 남들보다 배우는 속도가 느립니다. 이런 저의 습성으로 '알기쉬운 디자인 패턴'이란 책에서 15장 분량의 'Bridge 패턴'을 이해하는데 몇시간이나 걸렸습니다. 공부를 마친 후 인터넷에서 'Bridge 패턴'에 대한 자료를 찾아봤는데 완전 사전이었습니다. 과연 저걸 읽고 'Bridge 패턴'에 대해 이해할 수 있을까 싶습었니다. 그래서 저는 '알기쉬운 디자인 패턴'을 읽고 이해한 내용을 다시한번 더 알기쉽게 설명하겠습니다. 이해하기 쉽도록 '스타크래프트'를 예로 들겠습니다. 일반적인 클래스 설계우리는 유닛 클래스를 설계해야 합니다. 이 유닛은 마린과 매딕이 존재합니다. 마린은 총을 쏘고 매딕은 주사기로 치료를 합니다. abstract class 유닛{ void 무기사용(); } class 마린 : 유닛{ void 무기사용(){총.사용하기();} } class 매딕 : 유닛{ void 무기사용(){주사기.사용하기();} } class 총{ void 사용하기(){발사;} } class 주사기{ void 사용하기(){치료;} } 클라이언트의 요구사항마린도 주사기를 사용하고 매딕도 총을 사용할 수 있게 하고 싶다는 요구사항이 들어왔습니다. 그래서 상속을 이용해 아래와 같이 해결하였습니다. abstract class 유닛{ void 무기사용(); } class 마린 : 유닛{ void 무기사용(); } class 매딕 : 유닛{ void 무기사용(); } class 총쏘는마린 : 마린{ void 무기사용(){총.사용하기();} } class 치료하는마린 : 마린{ void 무기사용(){주사기.사용하기();} } /*총쏘는매딕과 치료하는매딕의 구현은 생략*/ class 총{ void 사용하기(){발사;} } class 주사기{ void 사용하기(){치료;} } 그런데 다시 새로운 요구사항이 들어왔습니다. 새로 추가된 요구사항
처음 요구사항을 해결한 방식으로 추가된 요구사항을 해결할 수 있지만 유닛과 무기가 늘어날 수록 클래스의 숫자는 폭발적으로 늘어나게 됩니다. 우리는 이 문제를 디자인 패턴을 이용하여 해결하려 합니다. Bridge 패턴이란?
'알기쉬운 디자인 패턴'에 나오는 'Bridge 패턴'은 다음과 같은 기본 전략을 따르고 있습니다.
위의 내용들이 지금 당장 이해되지 않더라도 괜찮습니다. 차근차근 풀어나가 보겠습니다. Bridge 패턴의 적용위에서 발생한 요구사항에 따른 문제는 'Bridge 패턴'을 적용할 상황(파생 클래스의 폭발적 증가 없이 다양한 구현이 필요한 상황)에 걸맞습니다. 사전적 의미는 일단 배제하고 두가지 기본 전략을 통해 위의 예제를 분석하겠습니다. 우선 첫번째 '무엇이 변경되는지 찾아내고 그것을 캡슐화하자' 위의 예제에서 변경되는 것은 유닛이 [마린과 매딕]으로, 무기가 [총과 주사기]로 변경됩니다. 마린과 매딕은 그대로 유닛으로 두고 총과 주사기를 무기화 시킵니다. abstract class 무기{ void 사용하기(); } class 총 : 무기{ void 사용하기(){발사;} } class 주사기 : 무기{ void 사용하기(){치료;} } 두번째 전략 '상속보다는 합성을 쓰도록 노력하자'를 적용해 보겠습니다. 합성이란 것은 복잡한 것이 아니라 하나의 클래스가 다른 클래스를 포함하여 사용하게 하는 것입니다. 그렇다면 '무기가 유닛을 사용하는 것'과 '유닛이 무기를 사용하는 것'중 무엇이 맞을까요? 당연히 유닛이 무기를 사용하는 것이 맞겠죠. //무기 클래스를 사용하도록 변경된 유닛관련 클래스 abstract class 유닛{ 무기 arms; 유닛(무기 a){arms = a}; //생성자 void 무기사용(){arms.사용하기();} } class 마린 : 유닛{ 마린(무기 a){super(a);} //생성자, super는 부모클래스 } class 매딕 : 유닛{ 매딕(무기 a){super(a);} //생성자, super는 부모클래스 } //무기관련 클래스는 변경사항 없슴 abstract class 무기{ void 사용하기(); } class 총 : 무기{ void 사용하기(){발사;} } class 주사기 : 무기{ void 사용하기(){치료;} } 생성자를 통해서 무기를 인수로 받고 유닛 클래스의 파생 클래스(마린과 매딕)는 무기의 종류는 모르지만 사용합니다. 위의 클래스를 이용한 간단한 예제를 만들어 보겠습니다. 무기 arms = new 총(); 유닛 marine = new 마린(arms); marine.무기사용(); 마린이 주사기를 사용하는 것도 문제 없겠죠? 패턴이 적용된 모습에 대한 분석위에서 'Bridge 패턴'의 사전적 의미는 "추상화 개념과 구현을 분리하여 독립적으로 변화할 수 있도록 한다" 였습니다. 패턴의 적용으로 아래와 같은 구조를 가지게 되었습니다. [유닛]-[마린,매딕] ---사용---> [무기]-[총,주사기] 추상화 개념은 유닛이 마린과 매딕으로 분류된다는 것이고 유닛이 무기사용에 대한 구현을 무기클래스로써 분리한 것입니다. 요구사항 해결하기이제 'Bridge 패턴'을 적용한 클래스 설계에 새로 추가된 요구사항을 적용해 보겠습니다. abstract class 유닛{ 무기 arms; 유닛(무기 a){arms = a}; //생성자 void 무기사용(){arms.사용하기();} } class 마린 : 유닛{ 마린(무기 a){super(a);} //생성자, super는 부모클래스 } class 매딕 : 유닛{ 매딕(무기 a){super(a);} //생성자, super는 부모클래스 } class 파이어뱃 : 유닛{ 파이어뱃(무기 a){super(a);} //생성자, super는 부모클래스 } class 고스트 : 유닛{ 고스트(무기 a){super(a);} //생성자, super는 부모클래스 } abstract class 무기{ void 사용하기(); } class 총 : 무기{ void 사용하기(){발사;} } class 주사기 : 무기{ void 사용하기(){치료;} } class 화염방사기 : 무기{ void 사용하기(){태우기;} } '알기쉬운 디자인 패턴'에서의 예제는 저의 예제와 다릅니다. 책의 예제는 Adaper 패턴도 혼합되어 있습니다. 'Bridge 패턴'에 대한 설명은 이로써 마치겠습니다. 최대한 쉽고 짧게 쓴다고 노력했는데 'Bridge 패턴'을 이해하는데 도움이 되었을지 궁금하네요. 'Bridge 패턴'을 더욱 자세하게 공부하시고 싶으시다면 반드시 책을 참고하시기 바랍니다. ps.오타 및 조언 부탁드립니다. 태그 : 디자인 패턴, Bridge 패턴 이 글과 관련있는 글을 자동검색한 결과입니다 [?]
|
ABOUT
이글루 파인더
카테고리
그냥 잡담
최근 등록된 덧글
저는 우분투에 다음체를 설치해보지 않..
by -A2- at 14:30 화면 맨 아래 아이콘들은 Avant Windo.. by -A2- at 14:28 윈도우쪽엔 둘다 적용해본 결과 다음체.. by LIVey at 13:30 우분투 8.10 정식 나올때 까지 15일 남았.. by 라이언 at 10/15 저도 공감해요. ㅋㅋ by -A2- at 10/15 얼마전에 KLDP보니까 이제 리눅스를 .. by 주성치 at 10/14 Factory Method와 Abstract Factor.. by -A2- at 10/14 Compiz Fusion을 쓰는 우분투에 테마.. by -A2- at 10/14 정말 오랜만에 변경했어요. 스샷 포스팅.. by -A2- at 10/14 꼭 한번 써보세요. ^^ by -A2- at 10/14 왠만하면 노트북에도 우분투 잘 돌아가요.. by -A2- at 10/14 우찌 맥하고 짬뽕이 된 인상입니다. by 도아 at 10/14 그리고, Factory Method Pattern은 .. by 나무귀신 at 10/14 DriverManager는 내부적으로 Factory.. by 나무귀신 at 10/14 오랫만에 테마 변경 포스팅을 쓰셨네요... by 까칠한JC at 10/14 우와.... 우분투 멋지네요.... 저도.. by Rakuen at 10/14 너무이뻐서 깔아보고 싶어도.. 14인치 .. by 배가본드 at 10/13 스샷 찍으시면 트랙백 쏴주세요. ^^ by -A2- at 10/13 제가 원래 좀 심플하게 씁니다. ㅋ ^^ by -A2- at 10/13 네~ 짱! 멋있어요. ^^ by -A2- at 10/13 최근 등록된 트랙백
[술에 관한 초인보고서] 바톤 릴레이
by Art & Soft Space ★ 어느 가을날, 즐거운 기억의 단상. - .. by ** MY's kitchen ** MBTI 성격 테스트 by 행복한 개발을 위한 블로그 MBTI 유형테스트 by xylosper's notebook 술에 관한 바톤 문답. by 900gle.info 『술에 대한 나의 생각』12문답 바톤 이.. by Lovely~♡ 술에 관한 바톤 문답 by 조약돌의 이야기 바다 네이버에서 배포하는 '나눔글꼴'을 리.. by 체리필터의 인생이야기 [바톤]술에관한 문답 by 김Su 다. 술에 관한 바톤 문답 by 감성 일기 술에 관한 바톤 문답- by 해피-잡다구리구리~ 술에 관한 바톤 문답 - 이거 수위가 ....!! by ** MY's kitchen ** MBTI 검사를 하다 : ) by BreezyMind A2님의 블로그에서 본 MBTI 검사 by 온새미의 블로그 MBTI by 친절한 냥이님 :D MBTI검사를 해 보았습니다. by 뚜찌의 skillOn* 올블로그 파도타기 놀이 by 멀뚱이 블로그 2008년 MBTI 검사 결과 by Programmer greenfrog !! 석환의 생각 by plute's me2DAY [100번째 포스팅] 감사합니다. 고맙.. by ** MY's kitchen ** 이전 블로그
라이프 로그
|