본문 바로가기

복습/C++

[C++] 복습일지 part 2 - 1 #상속(Inheritance)

# 상속 (Inheritance)

# 오버로딩(Overloading)과 오버라이딩(Overriding)

# 가상함수, 순수가상함수 (Virtual Function, Pure Virtual Function)

# 멤버이니셜라이저 (Memeber Initializer)


오늘은 상속(Inheritance)에 대해서 복습을 하겠습니다.


상속

이 무엇인가?

'객체지향 프로그래밍' 에서 항상 강조를 하고 중요한 요소인 '상속'에 대해 알아보도록합시다.


상속은

무언가를 물려 받는 행위이다.

상속받는다



그렇단다.

중간쯤 보면 재산상속이있다.


그렇다면 컴퓨터, 그러니깐 프로그래밍에서 상속이란 어떻게 하는것이고, 왜 사용하는것인가?


어떻게 사용하는지부터 알아보자.


# 어떻게 사용?


class 클래스이름 : 접근제어자 상속받으려는클래스 {


};


여기서 접근제어자를 붙이는데요 


public 상속

protected 상속

private 상속


세가지가있습니다.


public 상속 

- 부모의 public, protected가 변경없이 그상태 그대로 상속받습니다.

protected 상속

- 부모의 public, protected가 protected로 바뀌어 상속받습니다.

private 상속

- 부모의 public, protected 멤버들이 전부 private로 상속받습니다.


간단히 말해서


접근제어자 보다 넓은 모든 멤버는 해당 접근제어자로 바뀌어서 상속을 받습니다.


priavte로 상속을 받게된다면

모든 멤버들이 private으로 바뀌게 되겠죠?

이렇게 된다면 상속을 하는의미가 사라집니다.


대부분 public으로 상속받기 마련입니다.


또한 생성자와 소멸자의 호출 순서인데요


생성자 : 부모클래스 -> 자식클래스 순서

소멸자 : 자식클래스 -> 부모클래스 순서

꼭 기억 해주세요


http://algobomyun.tistory.com/263 님 블로그를 참고하였습니다.



# 왜 사용?



class Sonata
{
public:
    Sonata()
    {
        door = 4;
        wheel = 4;
        color = "white";
    }
private:
    int door;
    int wheel;
    string color;
};
class Avante
{
public:
    Avante()
    {
        door = 4;
        wheel = 4;
        color = "red";
    }
private:
    int door;
    int wheel;
    string color;
};
class Morning
{
public:
    Morning()
    {
        door = 4;
        wheel = 4;
        color = "blue";
    }
private:
    int door;
    int wheel;
    string color;
};

이런 클래스가 있다고 친다면

Sonata, Avante, Morning 클래스 세개 전부 똑같이
int door;
int wheel
string color
라는 멤버들을 가지고있습니다.

이 외에도 다른 차종을 만들고싶은데 이렇게 똑같은 내용을 일일이 다 적어줘야 하는것일까요?
상속을 배운다면 그렇게 하지 않아도 됩니다.

공통점을 찾는것이죠

이 세가지 클래스를 하나로 공통 지을 수 있지않을까요?



class Car
{
public:
    Car()
    {
        door = 4;
        wheel = 4;
        color = "black";
    }
    int GetDoor()
    {
        return door;
    }
    int GetWheel()
    {
        return wheel;
    }
    string GetColor()
    {
        return color;
    }
protected:
    int door;
    int wheel;
    string color;
};

class Sonata : public Car
{
public:
    Sonata()
    {
        color = "white";
    }
};
class Avante : public Car
{
public:
    Avante()
    {
        color = "red";
    }
};
class Morning : public Car
{
public:
    Morning()
    {
        door = 2;
        color = "blue";
    }
};
    



int main() {
    Car *sonata = new Sonata();
    Car *avante = new Avante();
    Car *morning = new Morning();
    
    std::cout << "sonata Door : " << sonata->GetDoor() << std::endl;
    std::cout << "sonata Wheel : " << sonata->GetWheel() << std::endl;
    std::cout << "sonata Color : " << sonata->GetColor() << std::endl;
    std::cout << std::endl;
    std::cout << "avante Door : " << avante->GetDoor() << std::endl;
    std::cout << "avante Wheel : " << avante->GetWheel() << std::endl;
    std::cout << "avante Color : " << avante->GetColor() << std::endl;
    std::cout << std::endl;
    std::cout << "morning Door : " << morning->GetDoor() << std::endl;
    std::cout << "morning Wheel : " << morning->GetWheel() << std::endl;
    std::cout << "morning Color : " << morning->GetColor() << std::endl;
    
    return 0;
}


Car는 
protected 멤버변수 

int door;
int wheel;
string color;

public 멤버함수

int GetDoor()
int GetWheel()
string GetColor()

를 가지고있습니다.

생성자를 통해 기본값을
4, 4, "black"
로 설정해 주었습니다.

그렇다면, Car 클래스를 물려받은 Sonata, Avante, Morning 클래스는 어떤 멤버변수와 함수들을 가지고있을까요?

Car클래스에게서 public으로 물려받았으므로 접근제어자는 그대로 유지한채로

public:
int GetDoor()
int GetWheel()
string GetName()
protected:
int door;
int wheel;
string color;

을 각각 가지고있습니다. 그리고 4, 4, "black"이 설정되어있죠.
그리고 각각 원하는 값으로 바꾸어서 출력을 했습니다.
다음은 출력값입니다.


상속을 이용하면 수정해야 할 일이 적어지고, 타자를 치는 횟수도 줄어들겠습니다.


1.  코드의 재사용성이 높아집니다.

2. 유지 보수가 용이해집니다.


부족한점이 많습니다!

댓글로 지적해주시면 감사하겠습니다.


[깨달은점]

1. 상속이 편리하구나

2. 편리한만큼 설계를 잘해야겠구나