Download VCard

© 최병일 1981-‘10

'조각지식'에 해당되는 글 3건

  1. 2007/05/26 Overloading과 Overriding [Part 2]
  2. 2007/05/22 Overloading과 Overriding [Part 1]
  3. 2006/08/11 Unicode 2(1)

Overloading과 Overriding [Part 2]

목차
1. 오버로딩과 오버라이딩의 간략한 정의 [Part 1]
2. C++ 오버로딩 [Part 1]
3. C++ 오버라이딩 [Part 1]
4. 오버로딩과 오버라이딩을 혼용하여 활용한 예 [Part 2]

4. 오버로딩과 오버라이딩을 혼용하여 활용한 예
이 예는 항상 활용가능한 예는 아닙니다.
아래의 구조로 유닛 클래스의 상속관계가 존재한다고 가정한다.(회색은 추상 클래스)
                                                          [표 A]

대부분의 오브젝트들은 슈퍼 클래스 형(UNIT)으로 특정 컨테이너가 보관하고 있을 것이다. 예를 들자면 아래의 컨테이너가 지금 프로세스 해야할 대상들의 모음이다.
Array<UNIT *> kUnitArray;
kUnitArray안에는 BattleShip, Bunker, Human, Helicopter등 다양한 UNIT이 존재한다.
오버로딩과 오버라이딩을 혼용하면 사용자는 슈퍼클래스형(UNIT)을 별다른 캐스팅 없이 Attack() 메소드 하나만으로 공격 메소드를 간편하게 수행할수 있다. 하지만 이에는 RTTI(Run-Time Type Identification)정도가 필요하다.
아래와 같이 정의한다.
Unit.h
class VEHICLE;
class STRUCTURE;
class CREATURE;
class UNIT
{
public:
   ...
   void Attack(UNIT* pUnit);
protected:
   ...
   virtual Attack(VEHICLE* pVehicle) = 0;
   virtual Attack(STRUCTURE* pStructure) = 0;
   virtual Attack(CREATURE* pCreature) = 0;
};
VEHICLE, STRUCTURE, CREATURE의 선언은 UNIT의 추상 메소드를 구현한다.
class VEHICLE : public UNIT
{
public:
   ...
protected:
   ...
   virtual Attack(VEHICLE* pVehicle);
   virtual Attack(STRUCTURE* pStructure);
   virtual Attack(CREATURE* pCreature);
};
STRUCTURE와 CREATURE는 VEHICLE의 선언과 거의 동일하다.

UNIT의 void Attack(UNIT *) 메소드는 실체(구현부)를 가지고 있다. 하지만 그 함수안에서 호출하는 오버로딩된 함수는 순수가상함수이다. 즉 순수 가상 멤버 함수들은 인터페이스 역활을 할뿐이며 추상화된 상태이므로 반드시 그 자식들은 오버라이딩을 통해 메소드를 실체화 해야한다.
UNIT의 void Attack(UNIT *) 메소드는 오버로딩된 메소드들을 RTTI를 통해서 호출하고있다.
void UNIT::Attack(UNIT *pUnit)
{
   if(dynamic_cast<VEHICLE *>(pUnit))
       Attack(dynamic_cast<VEHICLE *>(pUnit));
   else if(dynamic_cast<STRUCTURE *>(pUnit))
       Attack(dynamic_cast<STRUCTURE *>(pUnit));
   else if(dynamic_cast<CREATURE *>(pUnit))
       Attack(dynamic_cast<CREATURE *>(pUnit));
}
void Attack(UNIT *)  메소드를  오버라이딩해야 할 경우엔 필요에 의해 Attack함수를 가상함수로 선언하면 될것이다.

오버라이딩과 오버로딩을 혼용을 하면 아래와 같이 간편한 코드를 사용할수도있다.
void GameFrameWork::ProcessAttack() // 사용자가 공격커맨드를 내림
{
   ...
   UNIT* pCurrentUnit = GetCurrentUnit(); // 사용자 유닛
   UNIT* pSelection = GetSelectedUnit(); // 사용자가 공격 선택한 대상
   if(pCurrentUnit && pSelection)
       pCurrentUnit->Attack(pSelection);
   ...
}

주의
위의 예는 오버로딩과 오버라이딩의 단순히 혼용한 예이며 잘못된 접근일수 있습니다.

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

Jeff Bay의 객체 건강유지법.  (0) 2008/10/01
이럴때 테스트 셋을 만든 보람이 있습니다.  (0) 2008/04/12
Eiffel 과 DBC.  (2) 2008/01/04
Overloading과 Overriding [Part 2]  (0) 2007/05/26
Overloading과 Overriding [Part 1]  (0) 2007/05/22
Unicode 2  (1) 2006/08/11
Tag
card.ly
Top
Comment 0 Trackback 0

Trackback : http://yagur.impon.net/trackback/84 관련글 쓰기

Overloading과 Overriding [Part 1]

건망증때문에 두가지를 바꿔 생각할때가 간혹있습니다.

목차
1. 오버로딩과 오버라이딩의 간략한 정의 [Part 1]
2. C++ 오버로딩 [Part 1]
3. C++ 오버라이딩 [Part 1]
4. 오버로딩과 오버라이딩을 혼용하여 활용한 예 [Part 2]

1. 오버로딩과 오버라이딩의 간략한 정의

오버로딩(overloading)은 메소드의 이름은 같지만 인자의 형이나 갯수가 달라 메소드를 재정의 하는 것을 뜻한다.
오버라이딩(overriding)은 메소드가 상속을 거치며 재정의 되는 것을 뜻한다.
오버라이딩은 객체의 다형성(Polymorphism)을 구현하기 위해 추상화된 부모와 그것을 상속받는 자식 객체사이에 없어서는 안될 기능이다. 부모의 메소드가 추상 메소드가 아니라 구현부가 있는경우이고, 자식이 그것을 재정의 하는것도 오버라이딩이라 한다.

2. C++ 오버로딩
게임을 만들다 보면 유닛의 행동을 오버로딩해야할 경우가 있다.
Attack()과 같이 메소드의 이름은 같지만 생물, 건물, 탈것일경우 그 구현부를 다르게 하고싶다는것을 가정할때 아래의 오버로딩은 그것을 구현할수 있게 도움을 준다.

class Vehicle : public Unit
{
public:
   void Attack(Creature* pCreature);
   void Attack(Structure* pStructure);
   void Attack(Vehicle* pVehicle);
};

void Vehicle::Attack(Creature* pCreature)
{
    // 생물일 경우 공격 루틴
}

void Vehicle::Attack(Structure* pStructure)
{
    // 건물일 경우 공격 루틴
}

void Vehicle::Attack(Vehicle* pVehicle)
{
    // 탈것일 경우 공격 루틴
}

3. C++ 오버라이딩
OOP의 가장 강력한 무기중 하나인 다형성은 오버라이딩을 통해 이루어진다.
class UNIT
{
public:
   virtual void Attack(UNIT* pUnit) = 0;
};
위와 같이 추상화된 UNIT이란 클래스(인터페이스)가 있다고 가정하고 아래의 VEHICLE, STRUCTURE 클래스를 정의한다.
class VEHICLE : public UNIT
{
public:
   virtual void Attack(UNIT* pUnit);
};

void VEHICLE::Attack(UNIT* pUnit)
{
   // 탈것 객체의 공격 루틴
}

class STRUCTURE : public UNIT
{
public:
   virtual void Attack(UNIT* pUnit);
};

void STRUCTURE::Attack(UNIT* pUnit)
{
   // 건물 객체의 공격 루틴
}
재정의된 Attack 메소드들은  다른 구현부를 지니고 있으며 다른 실행결과를 보여줄것 이다.

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

Jeff Bay의 객체 건강유지법.  (0) 2008/10/01
이럴때 테스트 셋을 만든 보람이 있습니다.  (0) 2008/04/12
Eiffel 과 DBC.  (2) 2008/01/04
Overloading과 Overriding [Part 2]  (0) 2007/05/26
Overloading과 Overriding [Part 1]  (0) 2007/05/22
Unicode 2  (1) 2006/08/11
Tag
card.ly
Top
Comment 0 Trackback 0

Trackback : http://yagur.impon.net/trackback/82 관련글 쓰기

Unicode 2

유니코드 - 한글

  조합 가능한 글자의 수는 19 x 21 x 28 (종성없음 포함) = 11172


Unicode v2.0 포함된 한글의 부호영역

이외에 중성과 종성이 없는 음운문자
초성 19종 "ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ" 과 종성 27종 "ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ"은 겹치는 문자가 몇몇 있는데 이 문자들의 범위는 : 0x3131 ~ 0x314E 이다.

중성 21종 "ㅏㅐㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ" : 0x314F ~ 0x3163 이다.

모든 한글 음운문자의 범위는 0x3131 ~ 0x3163 이다.

영문 Unicode는 ASCII와 변수의 사이즈만 다를뿐 값은 동일하다.(0x0032~0x007e)

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

Jeff Bay의 객체 건강유지법.  (0) 2008/10/01
이럴때 테스트 셋을 만든 보람이 있습니다.  (0) 2008/04/12
Eiffel 과 DBC.  (2) 2008/01/04
Overloading과 Overriding [Part 2]  (0) 2007/05/26
Overloading과 Overriding [Part 1]  (0) 2007/05/22
Unicode 2  (1) 2006/08/11
Tag
card.ly
Top
Comment 1 Trackback 0
  1. CharmZine 2006/08/12 11:01 address edit & delete reply

    좋은 자료 잘 봤습니다. ^^

Trackback : http://yagur.impon.net/trackback/14 관련글 쓰기