■ 지난주에 보고 간 내용
● 연산자 중첩
● 단항 연산자 중첩 (전치,후치)
● 이항 연산자 중첩
● 형변환 함수
■ 이번주에 보고 갈 내용
● 기본 클래스와 상속 클래스
● 상속접근제어
● protected멤버
● 상속에서 생성자와 소멸자
● 계층적 다중 상속
● 여러개의 기본 클래스 상속
상속(inheritance) : 코드 재사용

↓ 상속에 관한 정보 (object-oriented programming) ↓
https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)
가볍게 생각해보죠.
만약에 여러분이 자동차 회사의 사장이라고 친다면,
1. 처음부터 완전히 새롭게 구상하여 새차를 만든다.
2. 기존에 있던 모델을 개선하여 만든다.
여러분들은 어떤게 더 빨리 성능 좋은 차를 만들수 있다고 생각하나요?
상속성(inheritance)
■ C에서는 이미 기계어로 번역되어 한번 개발된 라이브러리는 정적인 특성을 가지고 있어 새로운 내용을
추가할 수 없으며 새로운 내용을 추가하려면 처음부터 다시 작성해야 한다.
● printf()함수를 수정하고 싶어요? No
■ 객체지향언어인 C++에서는 상속성을 제공하여 이러한 작업의 중복을 지양하고 프로그램의 개발시간의
단축, 기존의 프로그램의 재사용, 경비절감 등을 이룰 수 있다.
■ 이미 존재하는 클래스로부터 기본적인 특성을 물려받아 그대로 사용하고 새로운 특성만을 추가로
정의한다.
클래스 상속의 형식


public 상속 접근제어
■ public 상속 접근인 경우에는 기본 클래스의 모든 public, protected멤버들은
파생 클래스의 public, protected 멤버가 된다.
■ 기본 클래스의 private 멤버는 private 멤버로 남고, 파생 클래스에 의해서 접근될 수 없다.
■ 일반적으로 가장 많이 사용하는 상속 접근 제어이다.
■ 상속 접근 제어에 따른 부모클래스에서 속성이 자식클래스에서 어떤 속성을 갖는가?

예시 : 기본적인 상속

Class B : public A
클래스 A에 있는 public 함수를 클래스 B에서도 같은 형식으로 사용할수 있게 만든다. (공유)
상속을 안했다면 말안해도 알꺼라 믿습니다.
12-1. public 상속 접근제어 1

아무리 파생 클래스여도 상위 클래스의 private 함수까지 물려받을수는 없습니다.
아까전에 써져 있던거처럼,
기본 클래스의 private 멤버는 private 멤버로 남고, 파생 클래스에 의해서 접근될 수 없기 때문이죠.
여기선 파생 클래스로 상위클래스에 있는 private함수 x에 접근하려 했기에 불가능합니다.
( public을 물려받아 초기화라면 몰라도 , 직접적으로 접근은 불가능하기 때문 )
12-2. public 상속 접근제어 2

이것도 1번과 같은 상황에 속합니다.
public 함수를 물려 받아도 , private 함수는 private 그대로 남기때문에 하위 클래스 B에서 상위클래스 A의 private은
건드릴수 없습니다.
private 상속 접근제어
■ private 상속 접근인 경우에는 기본 클래스의 모든 멤버가 파생 클래스의 private 멤버가 된다.
■ 기본 클래스의 public 멤버들은 클래스의 외부 (main함수 등)에서는 접근이 불가능 하고,
오직 파생클래스의 멤버함수에 의해서만 접근할 수 있다.
■ 다른 사람 모르게 자기 자식에게만 비밀리에 상속함


12-3. private 상속 접근제어 1

private로 상속하면 클래스 A에 있는 모든 함수들은 클래스 B의 private으로 자동으로 옮겨진다.
아니 그럼 공개적으로 상속하는것도 아니면서 접근도 못하게 할꺼면 뭔 의미로 사용하냐고요?
12-4. private 상속 접근제어 용도

아까전에 써놓은
클래스의 public 멤버들은 클래스의 외부 (main함수 등)에서는 접근이 불가능 하고,
오직 파생클래스의 멤버함수에 의해서만 접근할 수 있다.
를 읽으셨다면 알고 계시다시피, 외부함수에서는 접근이 불가능하고,
오직 파생클래스 public 내에서만 접근을 허용하는 방식입니다.
private 상속은 기본클래스의 public멤버를 파생클래스에서만 접근 가능하게 하는 방식이죠
protected 접근제어속성
● 거의 사용하지 않음
● 어떠한 방식으로 상속 받더라도 파생 클래스는 기본 클래스의 private 멤버를 접근할 수 없다.
● 파생 클래스가 기본 클래스의 어떤 멤버를 접근할 수 있으려면 그 멤버는 public이 되어야 한다.
● 그러나 기본 클래스에서 private 멤버 속성을 유지하면서 파생 클래스가 접근하는 것이 가능하도록
하는 경우가 있는데, 이 때 사용하는 것이 protected 접근이다.
● protected 접근은 기본 클래스의 protected 멤버들이 파생 클래스의 멤버에 의해 접근될 수 있다는 것을
제외하고는 private 접근과 같다.
● 기본 클래스나 파생클래스 이외의 부분에서는 protected 멤버를 접근할 수 없다.

12-5. protected 멤버 변수

주석부분 처럼 protected 멤버들은
파생클래스에서도 사용가능하게 (즉, 접근이 가능하게) 만들수 있습니다. (우측 밑에있는 부분 집중)
상속에서 생성자와 소멸자
● 기본 클래스, 파생클래스, 또는 두 클래스 모두가 생성자나 소멸자를 가질 수 있다.
● 기본 클래스와 파생 클래스가 모두 생성자와 소멸자를 가질 때, 생성자는 파생된 순서에 따라 실행된다.
● 즉, 기본 클래스 생성자는 파생 클래스 생성자보다 먼저 실행된다(부모가 있어야 자식이 태어남).
● 소멸자는 역순으로 실행된다.
● 즉, 파생 클래스의 소멸자는 기본 클래스의 소멸자보다 먼저 실행된다.
■ 부모 생성자
■ 자식 생성자
■ 자식 소멸자
■ 부모 소멸자
12-6. 상속에서 생성자와 소멸자

매개변수가 있는 생성자를 갖는 클래스의 상속
● 부모클래스의 생성자에 매개변수가 있으면 어떻게 되나?
● 자식클래스의 객체가 만들어지기 위해서는 부모클래스의 생성자를 자동적으로 먼저 호출하는데 매개변수가
없이는 생성자가 실행되지 않는다.
● 그러므로 부모클래스의 생성자가 매개변수를 가지고 있으면 그 매개변수 개수 만큼 자식클래스의 객체를 만들 때
넘겨줘야 한다.
12-7. 파생 클래스 생성자에서 기본 클래스 생성자에 매개변수 전달 형식

계층적 다중 상속
●파생 클래스가 여러 개의 기본 클래스를 상속 받을 수 있다.
●파생 클래스가 또 다른 파생 클래스의 기본 클래스로 사용되는 방법으로 다중 클래스 계층을 형성한다.
●할아버지 클래스로부터 아버지 클래스를 상속 받고, 아버지 클래스로부터 자식 클래스가 상속되는
것이 그 예이다.
12-8: 계층적 다중상속에서 계층적 매개변수 전달 1

12-9: 계층적 다중상속에서 계층적 매개변수 전달 2

해당 내용은 인덕대학교 2021년도 2학기 C프로그래밍 한성현 교수님 강좌에서 발췌한 내용입니다.
강좌 내용을 원저작자 허락없이 무단 이용시, 처벌의 대상이 될수 있습니다.
'C > C++' 카테고리의 다른 글
C++ (14주) [템플릿 , STL , friend , 예외처리] (0) | 2022.10.27 |
---|---|
C++ (13주) [상속 2 , 가상 함수] (0) | 2022.10.19 |
C++ (11주) [연산자 중첩] (0) | 2022.10.07 |
C++ (10주) [ 함수 중첩 , 디폴트 인자 ] (0) | 2022.10.01 |
C++ (9주) [const , new , delete] (2) | 2022.10.01 |
댓글