[C++] 상속

cheon2308
|2023. 12. 6. 16:47
728x90

황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!

https://search.shopping.naver.com/book/catalog/32436115747

 

C++ Programming : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

상속(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