본문 바로가기
C/C++

C++ (12주) [상속 1]

by DeathStar183 2022. 10. 15.

■ 지난주에 보고 간 내용

 

● 연산자 중첩

● 단항 연산자 중첩 (전치,후치)

● 이항 연산자 중첩

● 형변환 함수

 

 

■ 이번주에 보고 갈 내용

 

● 기본 클래스와 상속 클래스

● 상속접근제어

● 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에 있는 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프로그래밍 한성현 교수님 강좌에서 발췌한 내용입니다.

강좌 내용을 원저작자 허락없이 무단 이용시, 처벌의 대상이 될수 있습니다.

댓글