0. 들어가기에 앞서
컴공이 아닌 사람들에게 디자인 패턴에 대해서 이야기 해주려면 상속(inheritance)에 대한 이야기를 안할 수가 없다.
상속이란 무엇일까. 간단하게 현실을 예로 들어보자. 단어의 의미에 집중 하면 된다.
가족인 아버지가 20억 정도의 부동산을 소유하고 있다고 하자.
그럼 아들인 나는 20억의 부동산을 소유하고 있는 것인가 아닌가?
조금 이상한 말이긴 한데, 결국 아버지가 돌아가시고 재산을 물려받는다면 나는 20억의 부동산을 소유하게 된다.
그런데 알고보니 아버지의 20억짜리 부동산은 사실 할아버지의 유산이였던 것.
이걸 간단하게 기호를 이용해서 20억짜리 부동산의 상속관계를 나타내면 아래와 같다.
할아버지 -> 아버지 -> 나
결국 나의 '20억짜리 부동산'의 근본은 할아버지가 된다.
여기서 할아버지, 아버지, 나를 '객체'라고 부른다. 다시말하면 위는 객체의 상속관계를 표현한 것이다.
아버지 객체는 할아버지객체를 상속받고, 나 객체는 아버지객체를 상속 받는다.
결론적으로, 나 객체는 할아버지 객체를 상속 받는다.
여기서 객체는 각각 정보를 담고 있다.
나: 나의 이름, 나의 나이, 나의 재산
아버지: 아버지의 이름, 아버지의 나이, 아버지의 재산
할아버지: 할아버지의 이름, 할아버지의 나이, 할아버지의 재산
여기서 할아버지의 재산이 20억 부동산이였고 할아버진의 재산이 아버지에게 상속되어 아버지의 재산이 20억이 되었고,
다시 나의재산이 아버지의 재산을 상속받아 20억 부동산이 된다.
간단한 코드 표현. 넘겨도 된다.
이 사이트는 글 접기 기능이 없다.
class Me() : Father { string Name; int Age; int Asset; }
class Father() : GrandFather { string Name; int Age; int Asset; }
class GrandFather() : GrandGrandFather { string Name; int Age; int Asset; } ....
1. Creational Pattern
디자인 패턴중에 가장 중요한 패턴이라고 할 수 있다. 모든 패턴들은 기본적인 Creational pattern을 갖고 있다.
여기서 creational은 생성이라고 읽으면 된다. 즉, 생성패턴 이라고 말하자.
무엇을 생성하는가? 바로 객체를 생성한다. 그리고 이 객체를 생성하는 방법으로는 총 5가지가 있다.
- Factory method
- Abstract factory
- Builder
- Prototype
- Singleton
1.1 Factory method
자 드디어 팩토리오로 들어갈 시간이다.
[그림 1. 투입기와 노랑벨트]
게시글의 그림 크기가 조절이 안된다. 그냥 봐라.
[그림 1]은 투입기와 벨트를 만들기 위한 상속관계를 보여준다.
투입기는 톱니바퀴와 전자회로(녹칩)으로 만들어지는데 다시 톱니바퀴와 전자회로는 각각의 재료로 만들어진다.
즉, 투입기의 가장 상위객체는 철판과 구리판이 된다. (그림에서만으로 한정하자. 실제 게임에서는 광석이 된다.)
후술하겠지만, 여기서 용광로와 조립기계1은 의존성이 존재한다.
이 의존성을 제거하여 디커플링(decoupling) 시키는 것이 디자인패턴의 핵심이다.
디커플링을 만족시키기 위해서 IoC(Inversion Of Control)를 사용하게 된다.
벨트 역시 톱니바퀴와 철판으로 만들어진다. 적용 해보면 벨트의 가장 상위 객체는 철판이 된다.
그렇다면 벨트와 투입기의 공통된 상위 객체는 무었일까 생각해보자.
[그림 1]을 보면서 고인물들은 굉장히 화가 났을것이다.
(오! 이런! 이럴거면 7살짜리 조카에게 수학을 가르치는게 빠르겠다!)
Factory method의 가장 중요한 것은 중복을 제거 하는 것이다.
즉, 투입기와 벨트의 공통된 상위 객체인 철판을 따로 떼어보자.
[그림 2. 투입기2]
'공통된 부분'을 떼어내 '중복성을 제거' 하는 것이 factory method의 핵심이다.
[그림 2]는 철판 용광로를 조립기계 하나에 의존하던것을 따로 떼어냈다. 이제 철판 용광로에서 나오는 철판은 각각의 조립기계 하나에 의존하여 동작하는 것이 아니라 다른 조립기계의 철판으로도 사용 될수 있게 되었다. 이걸 디자인 패턴에서 코드의 재사용성이라고 말한다. 그리고 코드의 재사용을 하기 쉽게 만드는 작업을 리팩토링(re-factoring)이라고 한다.
다시말해 우리는 [그림 1]을 리팩토링 하여 [그림2]로 만들었고 그 과정중에서 factory method를 통해 철 용광로를 따로 떼어 냈다.
정말 재밌지 않은가? 게임에 디자인 패턴이 녹아있다니!
Homework)
아래 사진을 리팩토링 하시오.
가장 이쁘게 리팩토링 한 사람의 게시글에 바나나 우유를 쏘겠음.
뭔 글자제한에 붙여넣기하면 글자 사라지고 그림 자꾸 왼쪽으로 치우치고 들여쓰기 없어지고
진짜 쓰레기 싸이트인듯 ㅋㅋㅋ
?
구리선ㅇㄷ
글의 의도는 뭔지 알겠고 초보에게는 좋은 설명이나, 벨트 운송량 제한이 있으니 제한될 곳도 많을 듯.
0에서 설명했듯이 효율성은 배제함 ㅋㅋ
와 정말 도움이 되는 정보였어요
gof 고수되면 다이소 예쁘게 만들수있는거임?
마지막스샷 구리판을 전자회로 공정에 넣고있네
아이고 마음이 급했네 ㅋㅋ
상속을 모르는 사람이 상속을 보기에는 예시가 정확하지 않은거 같은데. 집합개념으로 봐야지. 공통적인 걸 줄인다면서 공통적인 걸 또 나열하는 것처럼 보이네.
맞음 최대한 수학 안들어가게 설명하려다 보니 이렇게 됨
Homework까지 있으니 전공책 PTSD오누
이런글 너무좋다 ㅠㅠㅠ 더 해줘요
문체?가 너무 전공서 삘인데 혹시 교수임?
코딩컨벤션 어디꺼냐