메뉴 건너뛰기

창조도시 기록보관소

언어 [C++] 객체 지향 프로그래밍 (OOP) -3-

2007.01.02 06:43

Zeprod 조회 수:295 추천:3

 


이번 시간에는 전에 예고해드린대로, 객체를 이용해 프로그램 전체를 설계하는 방법에 대해 알아보도록 하겠습니다.


 


우리가 객체를 만들고, 그 객체를 이용해 어떤 작업을 처리한다고 했을때 우리의 나쁜 머리가 헷갈리지 않도록 하는게 가장 중요하겠지요.


 


 


1. OOP 방법론


 


 OOP 방법론은 객체를 이용해 프로그램을 짜는 방법에 대한 정리를 한 것입니다. 대표적으로는 MVC 아키텍쳐라는게 있지요.


 


프로그램 전체를 실제 연산부분(Model), 대 휴먼 인터페이스(View), 프로그램 흐름 관리자(Controller) 세 부분으로 나누어 구성하는 방식입니다.


 


하지만, 꼭 저 방식을 지키라는 것이 아니라 저렇게하면 어떤부분이 좋다는 정도의 정리만 되어있을 뿐입니다.


 


짧게 쓰려다보니 어렵게 보일 수 있지만, 실제 뜻을 보면 전혀 어려운 부분도 아니거니와 30분정도의 설명을 들으면 '아~ 그렇겠구나' 라는 생각이 절로 들게 됩니다.


 


간단히 게임적인 예를 들면, 유저가 NPC에게 말을 걸었을때 우선 컨트롤러가 '현재 어떤 대답을 해야하는 가?' 에 대한 연산을 수행하라고 지시합니다. 여기서 연산하는 부분이 Model 입니다.


 


모델에서 정해진 결과를 컨트롤러가 받아 뷰에게 '표시좀 해줘봐' 라고 하면, '사람이 알 수 있는 방식'으로 출력하게 됩니다.


 


이 세 부분이 유기적으로 잘 결합되면 프로그램이 될 것이며, 각부분을 따로따로 업데이트하기에 좋다는 것이지요.


 


 


하지만, 역시 중요한 것은 헷갈리지 않도록 현재 개발하는 프로그램에 가장 적합한 객체 지향프로그래밍 적용법을 찾는 것이 좋겠습니다.


 


 


 


이 부분은 정답이 없으므로 여러분의 자질에 맡길 수밖에 없겠군요. ^^;;;


 


 


 


2. 객체 관리자 제작


 


- 이 부분은 본인이 개발한 방법론이므로, 읽고 싶은분만 읽으세요. 마지막부분은 표시해드립니다. -


 


 게임을 만들다 보면 비슷한 객체가 여러가지가 필요한 경우가 있습니다. 이 때에는 단순히 객체 배열을 만들어 사용하는 방법도 있습니다.


 


 하지만, 우리가 만들어야 할 것은 우리에게 필요한 만큼의 객체를 알아서 만들어서 자료구조형태로 묶어 던져주는 것이지요.


 


 


 게임 구동상에 있어서, 몬스터가 리젠되는 부분을 구현한다고 했을 때 단순 배열이라면 최대 등장 가능한 몬스터의 수가 고정되게 됩니다.


 


 우리의 방법론은 객체 관리자라는 녀석을 만들어서 이것을 한번의 함수호출로 객체 추가를 가능하게 한다면 편하지 않을까요? 라는 것에서 시작합니다.


 


 


-------------------------------------------


class Object_Manager


{


      Object* m_pArray;


      int m_iSize;


public:


      Object_Manager();


      ~Object_Manager();


 


      void Add(Object Data);


      Object* Get_Array() { return m_pArray; }


      int Get_ArraySize() { return m_iSize; }


}


 


Object_Manager::Object_Manager()


{


      m_pArray = NULL; // 배열을 빈공간으로 초기화


      m_iSize = 0;


}


 


Object_Manager::~Object_Manager()


{


      if (m_pArray != null)


      {


            for (int i = 0; i < m_iSize; i++)


                 m_pArray[i].~Object(); //객체 관리 배열 내의 모든 객체의 파괴자를 호출한다.


            delete[](m_pArray); // 배열의 삭제


      }
}


 


void Object_Manager::Add(Object Data)


{


      Object* tempArray = new Object[++m_iSize]; // 현재 배열보다 1칸 더 큰 배열을 만든다.


 


      for (int i = 0; i < m_iSize-1; i++)


            temp_Array[i] = m_pArray[i]; // 현재 배열의 값들을 새로 만들 배열에 넣고,


      temp_Array[m_iSize-1] = Data; // 새로 입력된 객체를 마지막에 넣는다.


     


      delete[](m_pArray); // 이전 배열의 삭제


      m_pArray = tempArray; // 새로만든 배열을 대입


}


 


-----------------------------------------------------


 


 


주석만 읽어보아도 간단하게 객체 관리자를 만들 수 있음을 알 수 있습니다.


 


물론 이 강좌에서는 C언어에 대해 잘 모르는 분들을 위해 '배열'을 이용해 변칙으로 동적 데이터구조를 사용했습니다.


 


스텍, 큐 등의 연결자료구조를 이용하는 것이 조금더 자연스러울 수 있으니 한번 인터넷에서 검색해보기를 권장합니다.


 


 


 


객체 삭제도 같은방식으로 만들수 있으며, '모든 내부객체의 파괴자'를 호출하는 부분을 응용하여 일괄적으로 어떤 함수를 실행 할 수도 있습니다.


 


자유롭게 날 수 있는 새들을 여러가지 복사해둔후 '일정시간동안 이동해봐' 라는 함수를 동시에 실행해준다면 모든 새들이 각자 자기 의지대로 날게 되겠지요.


 


마술의 신비.... (-_-;;)


 


 


 


 


 


3. 다음 시간 예고


 


 이번 강의는 너무 짧은 것 같아, 다음시간에 얘기해 드릴 내용의 개요를 설명해드리고 넘어가도록 하겠습니다.


 


 객체를 이용하여 프로그램을 구성할 수 있는 여러분에게 드디어 게임을 만들기 위한 첫걸음을 떼기 위한 시간을 갖겠습니다.


 


 앞서 입이 마르도록 설명해드린 객체 지향 개념이 수없이 얽혀져 등장할 '수도' 있으니 이전 강의가 아리송하신 분들은 한번더 읽어보시거나 제게 질문을 해주세요.


 


 


 다음 시간은 'Windows API를 이용한 GUI 프로그래밍' 입니다.


 


 


 


객체를 왜 써야하는지 뼈저리게 느끼게 되는 시간을 기대해주세요. ^^

번호 제목 글쓴이 날짜 조회 수
» [C++] 객체 지향 프로그래밍 (OOP) -3- [1] Zeprod 2007.01.02 295
348 이번에도 잡담입니다만-_-;; [6] 아란 2006.12.30 350
347 [자료구조] Binary Search Tree [4] Zeprod 2006.12.29 283
346 원형 거리 측정 [2] Zeprod 2006.12.28 495
345 어드벤쳐 만들기(무료판) [3] StartCraft 2006.12.28 1095
344 001 Action / RPG Maker [6] StartCraft 2006.12.28 739
343 [C++] 객체 지향 프로그래밍 (OOP) -2- [1] Zeprod 2006.12.27 275
342 그저 비주얼 베이직에 낚인 것에 대한 잡담 [2] 아란 2006.12.26 369
341 나름대로 게임제작1 - 시나리오 작성법 [4] 켈리시 2006.12.26 702
340 각종 변수를 이용한 쓸만한 것들 [5] 放觀者眼君 2006.12.18 507
339 방사형 마법범위 좌표구하기 [5] BAYONET 2006.12.16 658
338 맵배치 이런식으로 하면 되려나요..?'';; [9] file 땅콩아줌마 2006.12.15 672
337 [이벤트 ID이용의 예]슈팅 게임 [4] file masa 2006.12.14 500
336 골프게임은? [2] Nadoo 2006.12.14 362
335 이벤트를 이용, 장애물을 포함한 적과의 거리계산[중급이상추천] [10] file masa 2006.12.13 545
334 [C++] 객체 지향 프로그래밍 (OOP) -1- [4] Zeprod 2006.12.11 403
333 [서론] 콘솔창으로 작업하는 것이 허무하신가요? [6] Zeprod 2006.12.10 360
332 축구게임 시스템 [9] 헤지혹 2006.12.10 594
331 범위를 구할때 쓸 수 있는 식 둘 [6] 메카_탁 2006.12.08 483
330 외딴 집이랄까..? .. [9] file 도야 2006.12.05 560