본문 바로가기

교육 노트/C++ 심화강의

[C++ 때려잡기] C++ 심화강의 10 클래스의 핵심 상속

2018/08/27 - [교육 노트/C++ 심화강의] - [C++ 때려잡기] C++ 심화강의 1 객체 지향 프로그래밍과 클래스

2018/08/27 - [교육 노트/C++ 심화강의] - [C++ 때려잡기] C++ 심화강의 2 접근 한정자

2018/08/27 - [교육 노트/C++ 심화강의] - [C++ 때려잡기] C++ 심화강의 3 생성자와 소멸자

2018/08/29 - [교육 노트/C++ 심화강의] - [C++ 때려잡기] C++ 심화강의 4 복사 생성자와 깊은 복사

2018/08/29 - [교육 노트/C++ 심화강의] - [C++ 때려잡기] C++ 심화강의 5 this 포인터

2018/08/29 - [교육 노트/C++ 심화강의] - [C++ 때려잡기] C++ 심화강의 6 Class 선언과 정의

2018/08/29 - [교육 노트/C++ 심화강의] - [C++ 때려잡기] C++ 심화강의 7 inline 함수

2018/08/31 - [교육 노트/C++ 심화강의] - [C++ 때려잡기] C++ 심화강의 8 Friend function, friend class

2018/08/31 - [교육 노트/C++ 심화강의] - [C++ 때려잡기] C++ 심화강의 9 연산자 오버로딩, chaining


이번 강의는 객체지향의 꽃이라고 볼수있는 상속을 알아보도록 하겠다.

C의 꽃이 포인터고

C++이 꽃이 클래스라면

객체지향의 꽃이 상속이다 (?)



1. 상속 (inheritance)

지금까지 주구장창 마리오만 사용했으니 조금 다르게

RPG게임을 만든다고 해보자

캐릭터는 마리오 게임에서 만든 클래스를 재사용 하자! (와! 클래스의 재사용성을 알았다)


RPG게임이라면 모름지기 무기를 가지고 있어야한다.

일단 간단하게 총 칼 활 무기 3개 클래스를 만들었다



근데 생각해보니까 3개다 무기라 공통된점이 너무 많다

그렇다고 같은 클래스로 퉁치기에는 총이랑 칼이랑 활은 너무 다르다.


아 무기를 서너개 더만든다면 또 똑같은 공격함수를 짜고 공격력 변수를 만들고...

너무 화가나서 더이상 게임 제작하기 싫을것이다.



프로그래머가 개발도중에 도망가는것을 막기위해 C++은 상속을 지원한다.

아 다 공통개념을 묶어 웨폰 클래스를 만들고 고걸 고대로 사용할수 있게하되 약간의 기능만 추가해서 새로운 클래스를 만들수가 있다.



다음과 같이 클래스를 선언할때 class Gun : public Weapon 처럼 뒤에 :public 부모클래스이름

을 적어 해당 클래스를 상속받을수 있다.

여기서 부모 클래스는 protected 접근 지정자를 사용하여 자식 클래스만 접근가능하게 접근을 제한 할 수 있다.

그렴   class Gun : public Weapon에서 public은 무엇이냐고?



상속을 받을때는 public/protected/private 상속이 있다. 해당 상속을 받게되면 부모 클래스(base 클래스)에 있는 변수가 어떻게 상속되냐를 정할수 있으며

public 상속은 고대로. protected 상속은 public맴버를 자식에서부터는 protected로 쓰게된다.

대충 표 보면 알겠지만 public -> protected -> private 상속 순으로 맴버를 제한하게 된다.


weapon의 attact 함수는 공격!! 을 출력하게 해놓았다.
bow와 knife 모두 어택 함수가 잘 동작하는 모양이다.





이제 해당 무기를 캐릭터가 가지고있게 해야겠다

2. has-a


캐릭터가 Knife를 무기로 가지게 되었다.

이런 관계를 소유의 관계(has - a 관계) 라고 한다
더 깊이들어가면 명칭도 몇개 있는데.. 생략하도록 하겠다.




3. 생성 순서

부모를 상속받으면 해당 클래스는 부모의 변수와 함수를 가지게된다.

이걸 가지게 되는 이유는 컴파일러가 우리몰래 코드를 손봐서 거기에 똑같이 동작하도록 함수와 변수를 삽입해주는것이 아니다.


자식이 만들어지면 그냥 부모도 만들어버린다


간단한 예제를 살펴보자


#include <iostream>
using namespace std;

class Mom
{
public:
    Mom();
    ~Mom();

};

class Son : public Mom
{
public:
    Son();
    ~Son();

private:

};

Son::Son()
{
    cout << "Drived 생성자" << endl;
}

Son::~Son()
{
    cout << "Drived 소멸자" << endl;
}

Mom::Mom()
{
    cout << "Base 생성자" << endl;
}

Mom::~Mom()
{
    cout << "Base 소멸자" << endl;
}

int main()
{
    
    Son son;

    return 0;
}

생성자 순서 부모 - 자식순

소멸자 순서 자식 - 부모 순

728x90