sitelink1 http://blog.naver.com/gamediz/20040320702 
sitelink2  
sitelink3  
extra_vars4  
extra_vars5  
extra_vars6  

 

1.    개요

회사 기획팀에서 스터디를 했던 GOF의 디자인 패턴을 가지고 스터디를 했던 내용중 기본 개념 및 디자인 패턴에 대한 정의를 정리해봤다. 스터디 진행은 조이맥스의 기획이사님이 해주셨다. 필자가 프로그래밍 관련 지식이 미천한 관계로 잘 이해하지 못한 부분도 많을 것 같아 걱정이지만, 가능한 깔끔하게 정리를 해보겠다.

 

* GOF 디자인 패턴

a 표지에 재사용성을 지닌 객체지향 소프트웨어의 핵심 요소’ (Design Patterns: Elements of Reusable Object-Oriented Software)라고 적혀있다.

표지를 봐도 느끼겠지만, 사실 프로그래머들이 패턴을 정의하고 정리해서 효과적인 아키텍쳐를 구성하자는 의도(쓸데없는 낭비를 줄이고 코딩을 효율적으로 해보자! 랄까?)로 만들어진 책이지만, 기획자가 알아두면 좋을만한 요소가 있다고 판단하여 사내 스터디에서 진행중이다.

 

패턴을 사용하는 가장 큰 이유는 개발에 있어서 가장 효율적인 방법들을 모아놓았다는 점이며, 이러한 효율적인 개발론은 기획에서도 충분히 응용이 가능하다고 생각한다.

 

 

* GOF 디자인 패턴 종류

http://blog.naver.com/gamediz/20040232714

 

2.    기본 개념 정리

1)     상속

현실에서의 상속과(부모가 자식에게 유산과 돈을 물려주는 행위) 크게 다르지 않아 보인다. 프로그램에서도 유사한 의미로 공통의 분모를 부모가 자식에게 물려주는 행위를 뜻한다. 즉 자식은 공통의 부분을 따로 설계하지 않아도 부모의 것을 고스란히 물려 받아 사용하고, 새로운 것만 생산해서 사용할 수 있는 것이다.

(! 부모의 사랑의 힘은 프로그래밍, 디자인 패턴에도 이렇게 발휘되는 구나… )

 

npe61_gamediz.jpg

 

위의 표1을 보면 동물이라는 개념은, 생명체의 개념을 상속한 후, 움직임, 먹음, 달림 등의 속성을 추가해서 만들어진 개념이다. 생명체의 특성을 그대로 가져온 후 다른 속성을 추가하여 새로운 개념을 생성하는 것이다. 상속이란 이럴 때 유용하게 쓰일 수 있다. 마찬가지로사람이라는 개념 역시동물이라는 개념의 특성을 상속으로 가져온 후, 사람의 특징인 인격, 취미, 언어 등의 특성을 추가하여사람이라는 개념을 생성한다

 

 

2)     클래스

클래스는 '객체를 생성하기 위한 틀'이며 '클래스는 속성과 기능으로 정의되어있다.'(객체지향이론의 관점에서 내린 정의) 이것을 조금 풀어 말하면, (여러가지) 조작을 통해 결과를 얻어낼 수 있는 최소 단위를 클래스라고 말할 수 있다.

 

객체, 클래스, 함수라는 개념은 대단히 모호하고 복잡하여, (사실은 필자가 스킬이 턱없이 부족하여 ;;) 더 이상 설명은 하지 않겠다. 대신 설명이 아주 잘 달려있는 링크를 붙여 놓을 테니 깊이 알고 싶은 분은 참고하시기 바란다.

http://kin.naver.com/open100/db_detail.php?d1id=1&dir_id=101&eid=nJ4cLc7lCKMKfXxbs7BmLTlKaMqWeOwB 

(출처 : 네이버 지식인)

     

3)     추상화

* 추상 抽象

[명사] 여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용.

[세부설명]대상에서 특정 성질이나 공통된 징표(徵表)를 분리·독립시켜 사유(思惟)의 대상으로 하는 정신작용. 예를 들면 빨간 넥타이에서 <빨강> 아니면 <형()>만을 추출하는 것, 또는 빨간 우체통과 잘 익은 토마토 등에서 공통된 <빨강>을 골라내거나, 빨강·파랑·노랑에서 <색>을 골라내는 것 등이다. <중략>…… (출처 : 야후 사전)

 

추상화란 공통된 특징을 모아서 파악하는 것 이라고 정의할 수 있다.

종종 프로그래머들과 이야기를 하다보면 추상화가 안되어 있어서 파악하기 어렵다. 라고 이야기를 할 때가 있는데이 말은(여러가지로 해석할 수 있겠지만…) 다양한 것들이 다양한 규칙들을 가지고 있을 때, 공통적으로 쓰이는 녀석들을 함깨 모아서 정리하고, 예외가 되는 녀석들을 따로 정리하면 파악이 쉬운데 왜 그렇게 마구 섞인 기획을 주느냐 -0-; 라는 질책과 투정? 이다.

 

*추상화의 활용

 npe6d_gamediz.jpg

 

 

위의 표2를 보면 한국인 이라는 클래스는 사람이라는 클래스에서 상속을 받은 것을 알 수 있으며, 한국인은 한국어라는 속성으로 추상화 되어 있다. (물론 외국인이 한국어를 할 수도 있지만, 이런 경우는 편의상 배제하자)

 

이처럼 추상화란 한국인 이라는 클래스에서 공통적인 속성을 끌어낸 것이고, 위의 경우에서는 한국어로 한국인이 추상화 되어 있다는 것을 알 수 있다.

 

* 필자의 잡설

예전에 블로그에 열심히 써왔던시스템 설계관련 4회짜리 강좌가 추상화 라는 한마디로 요약이 가능한 것에 매우 충격을 받았다. 지금 생각해보면 이러한 개념을 전혀 모르고 프로그래머들과 투닥투닥 했으니 그 사람들도 많이 힘들었겠지..

역시 아는 게 힘이다. (범용화 라고 정의 했던 부분이 추상화 -0-;; )

ð  시스템 관련 강좌(전에 썼던 시스템 관련 강좌)

a 시스템 설계의 이해 http://blog.naver.com/gamediz/20015560824

a 시스템 설계 방안 http://blog.naver.com/gamediz/20015561714

a 범용적 시스템 설계 http://blog.naver.com/gamediz/20015606659

a 시스템 모델의 검토 http://blog.naver.com/gamediz/20015640811

a 범용적 시스템 설계 관련 예제 http://blog.naver.com/gamediz/20032912973

 

4)     인터페이스

* 인터페이스 Interface

경계면, 접점, 공유[접촉]

(이종간의) 대화, 연락, 의사 소통

 

인터페이스의 사전적 의미는 경계면, 내지는 대화, 의사 소통 정도로 사용된다.

예를 들자면 UI(User Interface)의 경우는 다음과 같다.

 

USER      -->      게임화면, 키보드, 마우스, 패드      -->     GAME

 

UI는 유저와 게임의 경계에서 둘 사이를 연결해주는 도구이다.

게임화면은 게임을 눈이라는 수단을 통해 게임과 연결될 수 있도록 해주고, 키보드나 마

우스는 손이라는 수단을 통해 게임과 연결될 수 있도록 해준다.

 

좀 더 프로그램적인 개념으로 인터페이스는 명령 그 자체를 의미한다.

 

* 상속, 추상화, 인터페이스 종합설명

상속, 추상화와 인터페이스에 대해 좀 더 쉬운 설명을 위해 표2를 예로 들어 설명하겠다.

지현, 혜교, 태희에게 물을 떠오게 하고 싶다면 가장 효율적인 전달은 한명씩 명령을 내리는 것이 아니라 사람을 상속하고 있는 한국인 클래스에 “물 떠와”라고 명령을 내리는 것이다.

나는 한국인 클래스에 명령을 내리고 있지만, 한국인 클래스는 한국어라는 것에 추상화 되어 있기 때문에 그것을 상속 받은 지현, 혜교, 태희는 명령을 받아 물을 떠올 수 있다.

여기에서 “물 떠와!!”라는 명령라는 명령은 지현, 혜교, 태희에게 어떤식으로 전달할까?

한국인 역시 사람을 상속받고 있고, 사람에게는 라는 것이 있어서 소리를 받아 들일 수 있다. 여기에서 명령을 받아 들일 수 있는 가 곧 인터페이스 이다.

 

그렇다면 실제로 명령에 대한 실행은 어떻게 될 까?

-      지현 : 네 주인님’ 이라고 말하고 나서 17차를 가져다 준다.

-      태희 : ‘네’ 라고 말하며 컵을 닦으며 춤을 추기 시작한다.

-      혜교 : ‘내가 왜 떠와야 되는데?’ 라고 성질을 내며 물을 떠 온다.

 

이 처럼 인터페이스를 통해 같은 명령이 들어와도 구현은 다를 수 있다.

위의 예에서는 한국인 클래스에 명령을 내렸는데, 똑 같은 물 떠와!!’ 라는 명령을 사람 클래스에 내리면 한국인은 행동을 취할 것이고, 외국인들은 행동을 취하지 못할 것이다.

이 말은 상위 단계에서 추상화가 될수록 구현이 간결해지는 것을 뜻한다.

마치 수 많은 인종이 모여있는 광장에서 ‘give me water!’ 라고 하면 영어를 알고 있는 모든 사람이 어떤 반응을 보일 수 있는데, 굳이 광장에 있는 사람 또는 무리(한국인, 일본인, 영국인, 미국인 등)를 일일이 찾아다니며 명령을 전달할 필요는 없지 않는가?

똑 같은 형태로 사람과 동물이 함께 모여있을 때 ‘give me water!’ 라고 하면 각종 동물들은 반응이 없겠지만, (행여 영어를 알아듣는 원숭이 같은 동물이 있으면 반응할지도 모르지만;) 영어를 알고 있는 사람들은 반응을 하게 될 것이다.

이처럼 명령은 가능하다면 추상화가 더 잘되어 있는 상위 클래스에 해야 명령 전달에 대한 단계와 수고를 줄일 수 있다. (프로그램에서는 코딩량이 줄고 코드가 간결해진다고 한다.)