상속(Inheritance)란?


클래스에서 상속을 쓰는 이유는 "프로그램 코드의 재사용" 을 목적으로 한다.

직업을 표현하는 객체를 생성한다고 가정하자. 직업이 다양하기에 "판사" , "프로그래머" , "교사" 등 하루 종일 나열할 수 있을 정도로 직업을 무수히 많다.

이런 직업을 표현할 수 있는 객체를 만들 때 직업은 사람이 가지는 직무를 의미하기에 사람의 특징인 "키" , "성별", "몸무게", "나이"공통된 속성이 있다. 이런 공통된 것을 "Person" 클래스로 만들고 "job" 의 클래스에 상속을 하여 코드를 재사용해 직업 마다 모든 걸 매순간 타이핑 하지 않고 상속을 통해 시간을 단축하고 효율적인 작업을 하기 위함으로 사용 된다.

 

 

상속 방법 C++


상속을 받는 클래스 이름을 derived , 상속을 하는 클래스 이름을 Mother 이라고 칭하겠다.

이럴 경우 C++에서는 아래와 같이 표현으로 선언할 수 있다.

// 형태 : Class derived : 접근지정자(public,private,protected) Mother

// ex)
Class Teacher : public Person{
    ...
};

만일 같은 이름의 멤버함수가 있을때는 어떨까?

#include <iostream>
using namespace std;

class Person {
    int age;
public:
    void foo() {
        cout << "Person" << endl;
    }
};

class Teacher : public Person {
    int salary;
public:
    void foo() {
        cout << "job" << endl;
    }
};

int main() {
    Teacher t;
    Person p;

    p.foo(); // Person이 출력될 것이다.
    t.foo(); // Person? job?


    return 0;
}

위의 코드에서 t.foo()는 분명 Person이 출력될것이다. 하지만 p.foo()는 Person을 상속받았고 상속받은 객체는 상속의 멤버함수를 사용할 수 있다. public 일 경우에는 그렇다면 이럴 경우에는 Person이 출력되는지 job이 출력되는지 헷갈릴 수 있다.

  • 이와 같은 경우에는 항상 객체를 우선적으로 실행하게 된다. 무슨 말이냐면 p는 Teacher 객체이다. 그러므로 Teacher의 foo 함수가 실행될 것이다. 그리고 t는 Teacher의 객체이므로 Teacher의 foo 가 실행되게 된다.
  • 만일 Teacher::foo 에서 Person::foo 를 실행시키고 싶다면 범위확인연산자( :: ) 를 사용하면 된다. → Person::foo()

 

 

상속 살펴보기


상속을 받았는데 상속한 클래스에 접근 하고 싶을 때에 방법이 있다.

  1. 상속 객체의 멤버변수를 public으로 바꾸는 방법

  2. 멤버 변수가 private 로 선언 된 클래스에 접근하기 위해서는 상속해준 클래스의 멤버 함수를 이용한다. 추천 

     #include <iostream>
     using namespace std;
    
     class Person {
         int m_age;
     public:
         void setAge(int age) {
             m_age = age;
         }
         void Show() { cout << "age " << m_age << endl; }
     };
    
     class Teacher : public Person {
         int m_salary;
     public:
         void setD(int sal)
         {
             m_salary = sal;
         }
         void setAge(int age)
         {
             Person::setAge(age); // Person의 멤버함수를 호출한다.
         }
    
         void Show() {
             Person::Show();
         }
     };
    
     int main() {
         Teacher t;
    
         t.setAge(10);
         t.Show();
    
        return 0;
    }
    

'프로그래밍 언어 > C++' 카테고리의 다른 글

[따라배우는 C++] 상속의 기본(2)  (0) 2020.10.29

+ Recent posts