상속(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()
상속 살펴보기
상속을 받았는데 상속한 클래스에 접근 하고 싶을 때에 방법이 있다.
-
상속 객체의 멤버변수를 public으로 바꾸는 방법
-
멤버 변수가 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 |
---|