티스토리 뷰

도대체 가상함수는 어디에다 쓰는 것일까.

1. 누가 읽어.
상속, 가상함수에 대한 설명은 여느 C++ 책에서나 쉽게 찾아 볼수 있다. 그리고 그 사용법도
쉽게 익힐 수 있을 것이다. 보통 MFC로 프로그래밍하다 보면 소켓이나 프로퍼티쉿 같은
클래스를 상속받아서 사용을 한다. 주된 이유로는 자신이 만들고자 하는 프로그램에 맞게끔
클래스를 만드는 데 있어서 불필요한 작업을 최대한 줄이고 생산성과 질이 높은, 안정된 환경을
상속이라는 개념이 제공해 주고 있는 것이다.

그러나 실제로 개발에 있어서 초보자들은 언제 상속을 받아야 하며 언제 가상함수를 써야
하는지 도통 실타래를 풀어 낼 수가 없는 경우가 많은 것같다. (나 또한 마찬가지ㅡㅡ)
소멸자에 가상함수를 붙여라, 순수가상함수는 이렇게 선언한다 등등 사용법은 여느 C++책에서
친절한 설명과 각종 예제와 곁들여져 쉽게 이해할 수 있도록 되어 있지만 막상 그걸 적용함에 있어서
막막함을 느껴 본적이 있다면, 그리고 그 막막함을 아직도 간직하고 있다면 이 글을 읽을
자격이 충분하다. 그럼 시작하자.

2. 스타크래프트
국민 게임 스타크래프트가 있다. 어디서 만들었는지는 다들 아실 것이다. 스타크래프트가
나온지 언 4년을 넘어선 것 같다. 블리자드는 기본 틀을 바꾸지 않고 유닛 몇개와 몇번의
밸런스 조정으로 2002년까지 왔고 2003년까지 가고 있는 것이다. 스타크래프트때문에
연봉 1억이 넘게 돈을 버는 사람도 생겨나고, PC방 사장님들의 입가에 미소를 머금게 해준
그 게임.
왜 갑자기 스타크래프트를 이야기 하고 있는지 궁금해 하는 독자들을 위해 이제부터 본격적으로
필자가 왜 스타크래프트를 이야기 하는지 알려줄 때가 된 것 같다.
스타크래프트에는 3가지 종족이 있고 3가지 종족들이 하는 일이란 미내랄과 가스를 구해서,
집을 짓고, 싸움을 하는 것이다.( 세부적으로 더 있겠지만 그건 http://www.blizzard.com에서 확인
하기 바란다.ㅡㅡ'')
여기서 하나만 때어 내 보자. 흠...좋다 흥미로운 싸움을 예로 들자. 세 종족은 모두 Attack이라는
기능을 가지고 있다. 그리고 기본적으로 Attack이라는것이 대동소이 하다. 왜? 밸런스를
맞추어야하니까.
저글링, 화이어뱃, 질럿을 예로 들자.이들은 지상의 길을 이용해 이동하며 근접전투를 한다.
그런데 가만히 보면 이 3가지 유닛이 하는 일이 모두 똑같음을 알수 있다. (가만히 안봐도 다 알겠군)
이들을 블리자드에서는 어떻게 구현했을까..

3. 구현
먼저 슈퍼 클래스가 있고 저그, 테란, 프토 클래스가 있을것이다.
슈퍼클래스에는 Attack이라는 순수 가상 함수가 존재할 것이고(아닐수도있지),
각 종족클래스엔 Attack이라는 함수가 있을 수 있을 것이다.

이제 살짝 만들어보자.

class CTop{
public:
    vurtual char* Attack()=0;
};

class CZerg:public CTop{
public:
   char*  Attack(){return "저글링 공격\n"};
};

class CTerran:public CTop{
public:
   char*  Attack(){return "화이어뱃공격\n"};
};

class CProtoss:public CTop{
public:
   char*  Attack(){return "질럿 공격\n"};
};

void main()
{

    CTop *pAttack[3];
   // 각각의 종족클래스를 Top형의 껍대기에다가 잡아 넣었다
    pAttack[0]=new CZerg;
    pAttack[1]=new Cterran;
    pAttack[2]=new CProtoss;
   // 그리고 for문을 이용해 돌려보자. 종족클래스의 Attack이 실행되는것이 보일 것이다.
    char *pCh;
    for(int i =0 ; i < 3 ; i ++)
    {
         pCh= pAttack[i]->Attack();
         printf(pCh);
    }
    // 지우자.
    for(int i =0 ; i < 3 ; i ++)
    {
         delete pAttack[i];
    }
}


먼저 위 코드를 보면 간단하게 3종족의 Attack을 사용하고 있다.
이것이 가상함수가 주는 힘이다. 가상함수가 없다면...
CTop클래스의 Attack을 이렇게 수정해야하며,
char* Attack("test");

pAttack[0]=new CZerg; 해도

"test"가 출력 될 것이다.

상속과 가상함수의 기능을 이용하여 각각의 클래스 내부구조를 추상화 시킨것이다. 따라서
공격명령만 주면 각 종족에 맞는 Attack이 일어나게 되는 것이다.~


2002.12.24 크리스마스 이브
likehood
msn: likehood.hanmail.net 

'개발' 카테고리의 다른 글

gSOAP 사용법  (1) 2007.06.21
비트 필드 스트럭쳐  (0) 2007.05.22
simpleAdo 2.0  (0) 2007.05.22
c/c++ 간단 토글링  (0) 2007.05.22
XmlLite SDK 관련..  (0) 2007.04.12
댓글