Upload
-
View
154
Download
0
Embed Size (px)
Citation preview
Multiple InheritanceCGCIICho sanghyun’s Game Classes II
1. Multiple-Inheritance2. Virtual Inheritance3. Mix-In4. 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 로 동작• '\r\n\r\n' 으로 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)