728x90
황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!
https://search.shopping.naver.com/book/catalog/32436115747
상속(Inheritance)
객체 지향 언어의 본질적 특성으로 sw의 재사용을 가능하게 하며, 동적 바인딩을 통해 객체 지향 프로그래밍의 묘미를 그대로 살리는 매우 중요한 기능이다.
C++ 클래스 상속
- C++에서는 두 클래스(class) 사이에 부모 - 자식의 상속 관계를 선언하며 상속은 자식 클래스의 객체가 생성될 때, 자신의 멤버뿐 아니라 부모 클래스의 멤버를 포함할 것을 지시
- 부모 클래스를 기본 클래스(base class), 자식 클래스를 파생 클래스(derived class)라고 부른다.
- 코드의 중복 작성을 없애 코드 작성에 드는 시간과 비용을 줄이게 하며 특히, 여러 개의 클래스를 동시에 상속받는 다중 상속(multiple inheritance)를 C++에서는 허용한다.
- 상속 관계에 있는 두 클래스를 부르르 이름은 프로그래밍 언어마다 다르다.
- JAVA에서는 SUPER CLASS, SUB CLASS
- C#에서는 PARENT CLASS, CHILD CLASS
상속의 목적과 장점
간결한 클래스 작성
- 동일한 코드가 여러 클래스에 중복되면 클래스의 유지 보수에 번거로운 일이 발생한다.
- 아래와 같은 4개의 클래스가 있을 때 공통된 '말하기' 기능에 오류가 발생하면 4개 모두 수정해야 된다.
- 상속을 이용하면 이 문제는 쉽게 해결된다.
- 공통된 기능을 가진 Person 클래스를 추가 작성하고, 상속 관계로 선언하면 코드를 중복 작성할 필요가 없다.
클래스 간의 계층적 분류 및 관리의 용이함
- 상속은 서로 관련된 클래스를 계층 관계로 표현함으로써 구조적인 관계 파악을 쉽게 해준다.
- 위의 그림에서도 서로의 관계를 계층 관계로 표현해줌으로써 관리를 용이하게 한다.
클래스 재사용과 확장을 통한 소프트웨어의 생산성 향상
- C++ 표준 입출력 라이브러리나 마이크로소프트에서 제공하는 윈도우 MFC 라이브러리는 모두 C++ 클래스로 작성되어 개발자에게 제공
- 개발자는 이들을 간단히 상속받아 응용 프로그램을 쉽고 빠르게 작성할 수 있음.
주의할 점!
- 기능이 필요하다는 이유만으로 연관성 없는 클래스를 상속해서는 안 됨
- 서로 관련 있는 클래스들을 상속 관계로 정의해야 객체 지향적 특성이 살아나며, 코드의 재사용성이 높아진다.
클래스 상속과 객체
상속 선언
- 두 클래스 사이의 상속 관계를 선언하는 방법은 간단하다.
- class 선언 뒤에, 콜론(:)과 기본 클래스 이름을 선언하면 된다.
- 이 때 반드시 상속 접근을 지정해야 되는데, public, private, protected 중 선택하면 된다.
class Student : public Person {
...
};
class StudentWorker : public Student {
...
};
파생 클래스 객체와 멤버 호출
- Point 클래스를 기본 클래스로 하고 ColorPoint를 파생 클래스로 하는 아래 예제를 보자
#include <iostream>
#include <string>
using namespace std;
class Point { // 2차원 평면에서 한 점을 표현하는 클래스 Point 선언
int x, y; //한 점 (x,y) 좌표값
public:
void set(int x, int y) { this->x = x; this->y = y; }
void showPoint() {
cout << "(" << x << "," << y << ")" << endl;
}
};
class ColorPoint : public Point { // 2차원 평면에서 컬러 점을 표현하는 클래스 ColorPoint. Point를 상속받음
string color;// 점의 색 표현
public:
void setColor(string color) { this->color = color; }
void showColorPoint();
};
void ColorPoint::showColorPoint() {
cout << color << ":";
showPoint(); // Point의 showPoint() 호출
}
int main() {
Point p; // 기본 클래스의 객체 생성
ColorPoint cp; // 파생 클래스의 객체 생성
cp.set(3,4); // 기본 클래스의 멤버 호출
cp.setColor("Red"); // 파생 클래스의 멤버 호출
cp.showColorPoint(); // 파생 클래스의 멤버 호출
}
// 실행결과 Red : (3, 4)
- Point 타입의 p와 ColorPoint 타입의 객체 cp는 위와 같이 생성된다.
- 객체 p는 Point 클래스의 멤버만 가지지만, cp는 Point 멤버와 ColorPoint의 멤버를 모두 가진다.
- 파생 클래스는 상속을 통해 기본 클래스의 멤버를 자신의 멤버로 확장
- 기본 클래스의 private 멤버 외에 모든 멤버를 접근할 수 있다.
여기서 private 멤버 상속에 대해 조금 더 살펴보고 가자!
- 우선 Point 클래스에 x, y 멤버를 private로 선언함은, x, y는 Point 클래스의 set(), showPoint() 함수만 접근 가능하다는 뜻
- 이런 의미는 파생 클래스에도 여전히 적용된다.
기본 클래스의 private 멤버도 파생 클래스에 상속되며, 파생 클래스의 객체가 생길 때 클래스의 객체 내에 생성된다.
- 위의 그림에서 ColorPoint 객체 cp에는 상속받은 x, y를 포함하여 7개의 멤버가 존재하지만,
- x, y 멤버는 set()과 showPoint() 함수에게만 접근이 허용되므로 x,y에 접근하고자 하면 간접적으로 set()과 showPoint() 함수를 이용해야 함
- 즉, 기본 클래스에 선언된 private 멤버는 파생 클래스에 상속되고 파생 클래스의 객체에도 포함되지만, 파생 클레스의 어떤 함수에서도 직접 접근할 수 없다.
클래스 외부에서 파생 클래스의 멤버 호출
- main() 함수와 같이 파생 클래스 외부에서 파생 클래스 객체의 public 멤버와 기본 클래스의 public 멤버를 모두 접근할 수 있다.
- 하지만 마찬가지로 private x, y에 접근하기 위해서는 set()과 showPoint()을 이용해야 된다.
728x90
'Programming Language > C++' 카테고리의 다른 글
[C++] protected 접근 지정 (0) | 2023.12.14 |
---|---|
[C++] 상속과 객체 포인터 (0) | 2023.12.14 |
[C++] 단항 연산자 중복과 프렌드로 구현하기 (2) | 2023.12.06 |
[C++] 연산자 중복 (0) | 2023.12.06 |
[C++] 프렌드 (1) | 2023.12.05 |