본문 바로가기
코딩/C++ - 핵심과 사용법만

[C++/핵심과 사용법만] 클래스 상속(inheritance)

by 오리로스 2024. 2. 11.

클래스 상속의 의의 :

1.작성한 클래스를 재사용함으로써 많은 코드를 줄일 수 있다.

2. 클래스 간의 계층적 관계를 구성하기 용이하다.(객체 지향프로그래밍에서 다형성, OOP의 토대가 됨)

 

[example]

 5년 전, 오리로스는 로봇의 모델명, 생산년월 이 두가지로 Robot 클래스를 작성했다.

 그런데 다음과 아래와 같은 기능 추가로 클래스를 새로 작성할 필요가 생겼다.

-수출용 로봇 : 수명 표시 기능, 수출 국가 출력 기능

-내수용 로봇 : 품질보증기간, 생산공장 출력 기능

 

이런 경우에 기존에 작성되어 있던 부모 클래스인 Robot을 상속받고 수출용, 내수용 각각 필요한 정보만 추가해준다면 공통 사항인 Robot을 새로 작성할 필요 없이 내수용, 수출용 클래스를 작성할 수 있게 된다.

 

부모 클래스(parent class or base class) : Robot

자식 클래스(child class or derived class) : RobotEx, RobotIn

 

#include <iostream>
#include <string>

class Robot
{
    public:
        Robot(std::string model_, int yymm_){//Robot의 생성자
            this->model = model_;
            this->yymm = yymm_ ;
        }
        std::string model;
        int yymm ;
    protected:
};

class RobotEx:public Robot{
    public:
        RobotEx(std::string model_, int yymm_, int lifeSpan_, std::string exCountry_): Robot(model_, yymm_){//RobotEx의 생성자
            this->lifeSpan = lifeSpan_;
            this->exCountry = exCountry_;
        }
        void show(){
            std::cout << "-*-*-*-ROBOT INFO-*-*-*-" <<  std::endl;
            std::cout << "모델명  : " << this->model<< std::endl;
            std::cout << "생산년월  : " << this->yymm << std::endl;
            std::cout << "수명  : " << this->lifeSpan << std::endl;
            std::cout << "수출국  : " << this->exCountry << std::endl;
        }
    private:
        int lifeSpan;
        std::string exCountry;
};


class RobotIn:public Robot{
    public:
        RobotIn(std::string model_, int yymm_, int warranty_, std::string factory_): Robot(model_, yymm_){//RobotEx의 생성자
            this->warranty = warranty_;
            this->factory = factory_;
        }
        void show(){
            std::cout << "-*-*-*-ROBOT INFO-*-*-*-" <<  std::endl;
            std::cout << "모델명  : " << this->model<< std::endl;
            std::cout << "생산년월  : " << this->yymm << std::endl;
            std::cout << "보증기간  : " << this->warranty << std::endl;
            std::cout << "공장명  : " << this->factory << std::endl;
        }
    private:
        int warranty;
        std::string factory;
};

int main(){
    RobotEx cuteBot1("optimus",3012,10,"Korea");
    RobotIn cuteBot2("atlas",2512,10,"Ulsan");
    cuteBot1.show();
    cuteBot2.show();
    return 0;
}

 

[RESULT]

-*-*-*-ROBOT INFO-*-*-*-
모델명  : optimus
생산년월  : 3012
수명  : 10
수출국  : Korea
-*-*-*-ROBOT INFO-*-*-*-
모델명  : atlas
생산년월  : 2512
보증기간  : 10
공장명  : Ulsan

 

[Further]

위 예제에서는 Public으로 Robot을 상속받았기 때문에 main 함수에서 부모 멤버에 대해 아래와 같은 접근이 가능하다.

int main(){
    RobotEx cuteBot1("optimus",3012,10,"Korea");
    RobotIn cuteBot2("atlas",2512,10,"Ulsan");
    std::cout << "cuteBot1의 모델명: "<< cuteBot1.model << std::endl;
    std::cout << "cuteBot2의 생산년월: "<< cuteBot2.yymm << std::endl;
    return 0;
}

만약 자식 클래스만 해당 멤버들을 사용할 수 있게 하고 싶다면, 접근 지정자 protected: 아래에 모델명과 생산년월을 넣으면 된다.

 

Next 상속, 멤버 이니셜라이저