[C++] 클래스와 상속
클래스 (Class)
struct Vector3D
{
float x;
float y;
float z;
};
class Vector3D
{
public:
float x;
float y;
float z;
};
데이터와 함수를 연결하는 하나의 방법으로 클래스의 특정 인스턴스를 개체라고하며, 개체는 자신만의 데이터를 포함하지만 동일 클래스의 모든 개체는 같은 함수를 공유한다. 구조체(struct)의 상위 버전이다.
구조체와는 달리 접근 제어의 차이가 있는데, 클래스는 public, protected, private이라는 세가지 접근 단계를 제공한다
(OOP의 캡슐성). 구조체는 기본적으로 public이며 클래스는 기본적으로 private이다.
클래스 선언 시 자동적으로 선언되는 암시적 멤버 메소드
메소드 : 어떤 작동을 구현하고 요청 서비스를 수행할수 있도록 만들어진 단일요구 메세지
1. 기본 생성자
2. 소멸자
3. 복사 생성자
4. 대입 연산자
상속
이미 존재하는 클래스를 기반으로 매우 손쉽게 변형 클래스를 만들 수 있게 해준다.
상속은 '사람은 동물이다'와 같이 '~이다'가 성립해야한다. '동물은 사람이다'는 안된다.
OOP의 상속성이며 다형성을 갖는다.
다형성
class Enemy { ~ };
class Enemy : public Skeleton { ~ };
//
int main()
{
Skeleton* pSkeleton = new Skeleton;
Enemy* pEnemy = pSkeleton;
}
오버라이딩(Overriding)
class Enemy
{
public:
void MoveAI();
};
class Boss : public Enemy
{
public:
void MoveAI();
};
함수의 재정의. 상속받은 자식 클래스에서 부모 클래스의 멤버함수를 재정의 한다.
오버로딩(Overloading)
add(int a, int b);
add(int* num);
서로 동일한 기능을 하고, 받는 매개변수만 다른 함수가 있다면 이름을 동일하게 할 수 있다.
다중 상속 (Multiple Inheritance)
두개 이상의 부모 클래스에 기반한 자식 클래스이다.
class Lucifer : public Angel, public Devil
{
public:
Actor* GetActor();
~
};
문제점
1. 모호함 / 부모의 같은 이름의 함수가 있을 경우 클래스 이름을 접두어로 붙이지 않을 경우 오류 발생
2. 형태적인 문제가 있음 / 중복되는 변수를 두개 이상 가지는 문제가 생김
ex) ↗ LandAI ↘
MovingAI HybridAI
↘ FlyAI ↗
* DOD(Diamond Of Death) : 잘못된 다이아몬드 형태의 구조
3. 프로그램 아키텍쳐 / 지나친 의존성을 불러오며 클래스 재사용과 관리에 어려움이 생긴다. 컴파일 시간도 증가
다형성
Lucifer* pLucifer = GetActor();
//Case01
Angel* pAngel;
pAngel = dynamic_cast<Angel*>(pLucifer); // Good
//Case02
Devil* pDevil;
pDevil = dynamic_cast<Devil*>(pLucifer); // Good
//Case03
God* pGod;
pGod = dynamic_cast<God*>(pLucifer); // Null값
클래스는 C와 C++의 가장 큰 차이라고 할 수 있으며 OOP의 특성을 보여준다. 그리고 이러한 클래스를 이용하여 상속을 할때에는 상속의 규칙을 잘 신경써서 해야겠다.
'Game Programming > 게임 프로그래밍 C++' 카테고리의 다른 글
[C++] 순차 컨테이너와 벡터 (0) | 2022.09.16 |
---|---|
[C++] STL (0) | 2022.09.16 |
[C++] 메모리 할당 (0) | 2022.09.12 |
[C++] 형변환과 템플릿 (0) | 2022.09.12 |
[C++] 포인터,상수, 참조 (0) | 2022.09.12 |