Multiple InheritanceCGCIICho sanghyun’s Game Classes II
1. Multiple-Inheritance
2. Virtual Inheritance
3. Mix-In
4. CGCII Socket Layers
CGCIICho sanghyun’s Game Classes II
실행처리 다중상속이란 ? (1)
 다중 상속은 악인가 ?
 다중 상속이란 여러 개의 클래스로 부터 상속받는 것 !
CGCIICho sanghyun’s Game Classes II
실행처리 다중상속이란 ? (2)
The C++ Programming Language
이 책은 아는 사람이 봐야 알고 모르는 사람은 봐도 모르는 책
즉 , 아는 사람은 볼 필요 없고 모르는 사람은 봐도 모르는 책
아래는 다중 상속에 대한 내용 ~ 무슨 의미인지 이해 가는가
?
CGCIICho sanghyun’s Game Classes II
실행처리 다중상속이란 ? (3)
CGCIICho sanghyun’s Game Classes II
실행처리 다중상속이란 ? (4)
 다중 상속은 악인가 ?
 현대의 많은 언어가 사실상 다중 상속을 지원
 현실적으로 왠만한 프로그래밍에서는 다중 상속이 빠짐 없이 보임 .
 다중상속에 대한 무조건적인 무용론은 다중 상속에 대한 오해
에서 비롯된 것으로 보임 .
CGCIICho sanghyun’s Game Classes II
실행처리 다중상속이란 ? (5)
추상화
(Abstraction)
다 따로 !!
 C++ 효율성의 핵심은
StartStop(…)
Steering(…)
Accel(…)
Brake(…)
SetGear(…)
구체화
(Implementation)
인터페이스 클래스 정의
{
p->StartStop(true);
for(int i=0; i<; ++i)
{
p->Steering(i);
P->Accel (i)
}
p->brake();
p->StartStop(false);
}
void Drive(CarD* p)
공용 !
추상화 (Abstraction)
(v)
(v)
(v)
(v)
(v)
CGCIICho sanghyun’s Game Classes II
실행처리 다중상속이란 ? (6)
 한 객체는 여러 개의 Interface 를 가질 수 있다 .
 여러 개의 Inteface 를 가진 다중 상속은 얼마든지 있을 수 있다 .
 하지만 다중 상속의 진짜 힘은 여기서 부터닷 !!!
 사실상 다중 상속이 없으면 효율적인 C++ 프로그래밍이 힘들다 .
 Java 조차도 단일 상속만을 추구했지만 이런 다중상속의 효용성 문제로 Interface 상속이
란 변태적 개념으로 다중 상속을 넣었다 .
( 결국 이런 변태 상속이 또 다른 변태를 낳게 된다 .)
CGCIICho sanghyun’s Game Classes II
실행처리 가상상속 (1)
 그러나 다중상속의 문제점 !!!
 가상 상속은 죽음의 다이아몬드를 만들어 준다 .
IAnimal 이 중복됨 .
(v)
(v) 가상 (Virtual) 상속을 하면
IAnimal 이 중복을 막음 !
 근데 이게 가상상속의 전부일까 ?
CGCIICho sanghyun’s Game Classes II
 아래와 같이 2 개의 class 가 정의 되어 있다고 한다면 !
실행처리 가상상속 (2)
class ICalculate
{
public:
virtual int Calculate() =0;
};
class ICalculate
{
public:
virtual int Calculate() =0;
};
class IObject
{
private:
int m_iValue;
public:
int GetValue() const { return m_iValue;}
virtual void PrintCalculated() =0;
};
class IObject
{
private:
int m_iValue;
public:
int GetValue() const { return m_iValue;}
virtual void PrintCalculated() =0;
};
순수 가상 함수 !
순수 가상 함수 !
CGCIICho sanghyun’s Game Classes II
실행처리 가상상속 (2)
class NCalculate :
virtual public ICalculate,
virtual public IObject
{
public:
virtual int Calculate()
{
return GetValue() * 2;
}
};
class NCalculate :
virtual public ICalculate,
virtual public IObject
{
public:
virtual int Calculate()
{
return GetValue() * 2;
}
};
class NObject :
virtual public ICalculate,
virtual public IObject
{
public:
virtual void PrintCalculated()
{
printf(“Result is %d", Calculate());
}
};
class NObject :
virtual public ICalculate,
virtual public IObject
{
public:
virtual void PrintCalculated()
{
printf(“Result is %d", Calculate());
}
};
 CCalculate 는 ICalculate 부분만 구현 !
 CObject 는 IObject 부분만 구현 !
IObject 함수
ICalculate 함수
CGCIICho sanghyun’s Game Classes II
실행처리 가상상속 (3)
 CCalculate 와 CObject 를 다중 상속하게 되면… 객체의 합성
 일반적으로 이런 식의 객체 합성을 Mixin 이라 한다 .
 Java 도 결국 mixin 을 또 다른 변태적 문법으로 지원을 해서 사실상 모든 다중상속을 지원하
게 됨 .
CGCIICho sanghyun’s Game Classes II
실행처리 Mix-In (1)
 CGCII 의 Socket 은 Socket 의 기능을 7 개의 Layer 로 구분하여 정의
 Mixin 을 활용하여 정적 컴포넌트를 조합하도록 설계
• 다양한 Socket 을 유연하게 추가 / 변형 / 구성 가능 → Flexiblity
• 성능 손실 최소화 !( 정적 컴포넌트 조합 ) → Performance
• 코딩의 단순화 ( 상속만으로 합성 ) → Simple Coding
CGCIICho sanghyun’s Game Classes II
실행처리 CGCII Socket Layers (1)
• [ 저수준 ] Socket 기본 속성
• [ 저수준 ] Receive I/O 처리
• IReceiveable 에서 전달받은 데이터를 Message 별
로 분리
• IPacketable 에서 전달받은 Message 에 해당하는 처리
• 사용자 Send 함수 .
• Send 하려는 내용을 표준화된 전달 형식으로
ISendRequest 에 전달한다 .
• 중간 가공처리 . 전송하려는 내용을 ISendable 에
전달한다 .
• [ 저수준 ] I/O 로 Send 처리
• 전송이 완료된 후 처리를 위한 것 (Option)
• 접속 후 처리 / 접속 종료 처리를 정의한다 .
• 접속지향 (TCP) 면 필수 .
• 접속 요구 기능 (Client 측 )
CGCIICho sanghyun’s Game Classes II
실행처리 CGCII Socket Layers (2)
[ 저수준 I/O]
•저수준 함수를 호출하여 Receive I/O 처리
•ProcessReceivable() 에서
•데이터를 Receive 하고 IPacketable::ProcessPacketable() 을 호출
하여 받은 데이터를 넘긴다 !
[ 메시지 분리 ]
•ProcessPacketable() 에서 전달된 데이터를 Message 단위로 자른다 .
•잘려진 Message 는 ICGMessageable::ProcessMessage() 함수를
호출하여 전달한다 .
[ 메시지 처리 ]
•ProcessMessage() 함수에서 전달된 Message 에 따라 처리를 수행한다 .
CGCIICho sanghyun’s Game Classes II
실행처리 CGCII Socket Layers (3)
(v)
(v)
(v) (v)
(v) (v)
(v)
CGCIICho sanghyun’s Game Classes II
실행처리 CGCII Socket Layers (4)
class CSocketTCP :
public CGNetIO::Socket::NTCP,
public CGNetIO::Connectable::NTCP,
public CGNetIO::Sendable::NTCP,
public CGNetIO::SendRequest::NBase,
public CGNetIO::Sender::NStreamGather,
public CGNetIO::Receivable::NStream,
public CGNetIO::Packetable::NStream<WORD>,
public CGNetIO::Messageable::Nbase
{
public:
CSocketTCP() {}
virtual ~CSocketTCP(){}
};
class CSocketTCP :
public CGNetIO::Socket::NTCP,
public CGNetIO::Connectable::NTCP,
public CGNetIO::Sendable::NTCP,
public CGNetIO::SendRequest::NBase,
public CGNetIO::Sender::NStreamGather,
public CGNetIO::Receivable::NStream,
public CGNetIO::Packetable::NStream<WORD>,
public CGNetIO::Messageable::Nbase
{
public:
CSocketTCP() {}
virtual ~CSocketTCP(){}
};
CGCIICho sanghyun’s Game Classes II
실행처리 CGCII Socket Layers (5)
CGCIICho sanghyun’s Game Classes II
 자주 사용하는 다양한 Socket 을 미리 합성해 놓았다 .
실행처리 CGCII Socket Layers (6)
• 일반 TCP Socket
• 가변 Message 크기에 Message Head 를 가진
일반적 Message 처리
• 동일한 크기의 Message 를 처리하는 Socket
• CTCP<T> 에 Connector 를 상속 받은 Socket
• 일반 UDP Socket
• Reliable UDP 를 위한 Socket
• 재전송을 위한 처리 구조
• Web 용 Server/Client Socket
• 기본적으로 Text 로 동작
• 'rnrn' 으로 Message 를 구분
• HTTP Decoding
• Parsing
• 'GET', 'POST‘ 등의 명령어 처리
• 기타 Web 용 처리
CGCIICho sanghyun’s Game Classes II
실행처리 다중상속이란 ? (4)
 CGCII 은 Mixin 을 통해
• 확장성 (Extensibility)
• 유연성 (Flexibility)
• 은닉 (Encapsulation)
• 효율성 (Efficiency)
• 성능 (Performance)
개인적인 생각으론 C++ 만이 가능 !!
• 편리한 개발 (Easy to Developement)
CGCIICho sanghyun’s Game Classes II
질문 ?예외처리
중간질문 ?
sangduck@cgcii.co.kr

GCGC- CGCII 서버 엔진에 적용된 기술 (7) - Multiple Inhertance

  • 1.
    Multiple InheritanceCGCIICho sanghyun’sGame Classes II 1. Multiple-Inheritance 2. Virtual Inheritance 3. Mix-In 4. CGCII Socket Layers
  • 2.
    CGCIICho sanghyun’s GameClasses II 실행처리 다중상속이란 ? (1)  다중 상속은 악인가 ?  다중 상속이란 여러 개의 클래스로 부터 상속받는 것 !
  • 3.
    CGCIICho sanghyun’s GameClasses II 실행처리 다중상속이란 ? (2) The C++ Programming Language 이 책은 아는 사람이 봐야 알고 모르는 사람은 봐도 모르는 책 즉 , 아는 사람은 볼 필요 없고 모르는 사람은 봐도 모르는 책 아래는 다중 상속에 대한 내용 ~ 무슨 의미인지 이해 가는가 ?
  • 4.
    CGCIICho sanghyun’s GameClasses II 실행처리 다중상속이란 ? (3)
  • 5.
    CGCIICho sanghyun’s GameClasses II 실행처리 다중상속이란 ? (4)  다중 상속은 악인가 ?  현대의 많은 언어가 사실상 다중 상속을 지원  현실적으로 왠만한 프로그래밍에서는 다중 상속이 빠짐 없이 보임 .  다중상속에 대한 무조건적인 무용론은 다중 상속에 대한 오해 에서 비롯된 것으로 보임 .
  • 6.
    CGCIICho sanghyun’s GameClasses II 실행처리 다중상속이란 ? (5) 추상화 (Abstraction) 다 따로 !!  C++ 효율성의 핵심은 StartStop(…) Steering(…) Accel(…) Brake(…) SetGear(…) 구체화 (Implementation) 인터페이스 클래스 정의 { p->StartStop(true); for(int i=0; i<; ++i) { p->Steering(i); P->Accel (i) } p->brake(); p->StartStop(false); } void Drive(CarD* p) 공용 ! 추상화 (Abstraction) (v) (v) (v) (v) (v)
  • 7.
    CGCIICho sanghyun’s GameClasses II 실행처리 다중상속이란 ? (6)  한 객체는 여러 개의 Interface 를 가질 수 있다 .  여러 개의 Inteface 를 가진 다중 상속은 얼마든지 있을 수 있다 .  하지만 다중 상속의 진짜 힘은 여기서 부터닷 !!!  사실상 다중 상속이 없으면 효율적인 C++ 프로그래밍이 힘들다 .  Java 조차도 단일 상속만을 추구했지만 이런 다중상속의 효용성 문제로 Interface 상속이 란 변태적 개념으로 다중 상속을 넣었다 . ( 결국 이런 변태 상속이 또 다른 변태를 낳게 된다 .)
  • 8.
    CGCIICho sanghyun’s GameClasses II 실행처리 가상상속 (1)  그러나 다중상속의 문제점 !!!  가상 상속은 죽음의 다이아몬드를 만들어 준다 . IAnimal 이 중복됨 . (v) (v) 가상 (Virtual) 상속을 하면 IAnimal 이 중복을 막음 !  근데 이게 가상상속의 전부일까 ?
  • 9.
    CGCIICho sanghyun’s GameClasses II  아래와 같이 2 개의 class 가 정의 되어 있다고 한다면 ! 실행처리 가상상속 (2) class ICalculate { public: virtual int Calculate() =0; }; class ICalculate { public: virtual int Calculate() =0; }; class IObject { private: int m_iValue; public: int GetValue() const { return m_iValue;} virtual void PrintCalculated() =0; }; class IObject { private: int m_iValue; public: int GetValue() const { return m_iValue;} virtual void PrintCalculated() =0; }; 순수 가상 함수 ! 순수 가상 함수 !
  • 10.
    CGCIICho sanghyun’s GameClasses II 실행처리 가상상속 (2) class NCalculate : virtual public ICalculate, virtual public IObject { public: virtual int Calculate() { return GetValue() * 2; } }; class NCalculate : virtual public ICalculate, virtual public IObject { public: virtual int Calculate() { return GetValue() * 2; } }; class NObject : virtual public ICalculate, virtual public IObject { public: virtual void PrintCalculated() { printf(“Result is %d", Calculate()); } }; class NObject : virtual public ICalculate, virtual public IObject { public: virtual void PrintCalculated() { printf(“Result is %d", Calculate()); } };  CCalculate 는 ICalculate 부분만 구현 !  CObject 는 IObject 부분만 구현 ! IObject 함수 ICalculate 함수
  • 11.
    CGCIICho sanghyun’s GameClasses II 실행처리 가상상속 (3)  CCalculate 와 CObject 를 다중 상속하게 되면… 객체의 합성  일반적으로 이런 식의 객체 합성을 Mixin 이라 한다 .  Java 도 결국 mixin 을 또 다른 변태적 문법으로 지원을 해서 사실상 모든 다중상속을 지원하 게 됨 .
  • 12.
    CGCIICho sanghyun’s GameClasses II 실행처리 Mix-In (1)  CGCII 의 Socket 은 Socket 의 기능을 7 개의 Layer 로 구분하여 정의  Mixin 을 활용하여 정적 컴포넌트를 조합하도록 설계 • 다양한 Socket 을 유연하게 추가 / 변형 / 구성 가능 → Flexiblity • 성능 손실 최소화 !( 정적 컴포넌트 조합 ) → Performance • 코딩의 단순화 ( 상속만으로 합성 ) → Simple Coding
  • 13.
    CGCIICho sanghyun’s GameClasses II 실행처리 CGCII Socket Layers (1) • [ 저수준 ] Socket 기본 속성 • [ 저수준 ] Receive I/O 처리 • IReceiveable 에서 전달받은 데이터를 Message 별 로 분리 • IPacketable 에서 전달받은 Message 에 해당하는 처리 • 사용자 Send 함수 . • Send 하려는 내용을 표준화된 전달 형식으로 ISendRequest 에 전달한다 . • 중간 가공처리 . 전송하려는 내용을 ISendable 에 전달한다 . • [ 저수준 ] I/O 로 Send 처리 • 전송이 완료된 후 처리를 위한 것 (Option) • 접속 후 처리 / 접속 종료 처리를 정의한다 . • 접속지향 (TCP) 면 필수 . • 접속 요구 기능 (Client 측 )
  • 14.
    CGCIICho sanghyun’s GameClasses II 실행처리 CGCII Socket Layers (2) [ 저수준 I/O] •저수준 함수를 호출하여 Receive I/O 처리 •ProcessReceivable() 에서 •데이터를 Receive 하고 IPacketable::ProcessPacketable() 을 호출 하여 받은 데이터를 넘긴다 ! [ 메시지 분리 ] •ProcessPacketable() 에서 전달된 데이터를 Message 단위로 자른다 . •잘려진 Message 는 ICGMessageable::ProcessMessage() 함수를 호출하여 전달한다 . [ 메시지 처리 ] •ProcessMessage() 함수에서 전달된 Message 에 따라 처리를 수행한다 .
  • 15.
    CGCIICho sanghyun’s GameClasses II 실행처리 CGCII Socket Layers (3) (v) (v) (v) (v) (v) (v) (v)
  • 16.
    CGCIICho sanghyun’s GameClasses II 실행처리 CGCII Socket Layers (4)
  • 17.
    class CSocketTCP : publicCGNetIO::Socket::NTCP, public CGNetIO::Connectable::NTCP, public CGNetIO::Sendable::NTCP, public CGNetIO::SendRequest::NBase, public CGNetIO::Sender::NStreamGather, public CGNetIO::Receivable::NStream, public CGNetIO::Packetable::NStream<WORD>, public CGNetIO::Messageable::Nbase { public: CSocketTCP() {} virtual ~CSocketTCP(){} }; class CSocketTCP : public CGNetIO::Socket::NTCP, public CGNetIO::Connectable::NTCP, public CGNetIO::Sendable::NTCP, public CGNetIO::SendRequest::NBase, public CGNetIO::Sender::NStreamGather, public CGNetIO::Receivable::NStream, public CGNetIO::Packetable::NStream<WORD>, public CGNetIO::Messageable::Nbase { public: CSocketTCP() {} virtual ~CSocketTCP(){} }; CGCIICho sanghyun’s Game Classes II 실행처리 CGCII Socket Layers (5)
  • 18.
    CGCIICho sanghyun’s GameClasses II  자주 사용하는 다양한 Socket 을 미리 합성해 놓았다 . 실행처리 CGCII Socket Layers (6) • 일반 TCP Socket • 가변 Message 크기에 Message Head 를 가진 일반적 Message 처리 • 동일한 크기의 Message 를 처리하는 Socket • CTCP<T> 에 Connector 를 상속 받은 Socket • 일반 UDP Socket • Reliable UDP 를 위한 Socket • 재전송을 위한 처리 구조 • Web 용 Server/Client Socket • 기본적으로 Text 로 동작 • 'rnrn' 으로 Message 를 구분 • HTTP Decoding • Parsing • 'GET', 'POST‘ 등의 명령어 처리 • 기타 Web 용 처리
  • 19.
    CGCIICho sanghyun’s GameClasses II 실행처리 다중상속이란 ? (4)  CGCII 은 Mixin 을 통해 • 확장성 (Extensibility) • 유연성 (Flexibility) • 은닉 (Encapsulation) • 효율성 (Efficiency) • 성능 (Performance) 개인적인 생각으론 C++ 만이 가능 !! • 편리한 개발 (Easy to Developement)
  • 20.
    CGCIICho sanghyun’s GameClasses II 질문 ?예외처리 중간질문 ? sangduck@cgcii.co.kr