c23 [C++] 상속
본문 바로가기
[C++]

[C++] 상속

by Jarvis2304 2022. 11. 8.

▶ 상속

- 객체 지향 언어에서의 상속은 부모 유전자를 자식이 물려받는 유전적 상속과 유사

유전적 상속과 관계된 생물 분류

 

 

 

 

▶ C++에서의 상속 (Inhreitance)

● 클래스 사이에서 상속관계 정의 (객체 사이에서는 상속 관계 없음)

● 기본 클래스의 속성과 기능을 파생 클래스에 물려주는 것

- 기본 클래스(base class) - 상속해주는 클래스, 부모 클래스

- 파생 클래스(derived class) - 상속받는 클래스, 자식 클래스

- 상속은 자식 클래스의 객체가 생성될 때, 자신의 멤버뿐 아니라 부모 클래스의 멤버를 포함시켜 생성(기본 클래스의 속성과 기능을 물려받고 자신 만의 속성과 기능을 추가하여 작성)

- 기본 클래스에서 파생 클래스로 갈수록 클래스의 개념 구체화

- 다중 상속을 통한 클래스의 재활용성 높임

 

 

▷ 상속의 표현

 

 

 

▷ 상속의 목적 및 장점

(1) 간결한 클래스 작성 - 기본 클래스의 기능을 물려받아 파생 클래스를 간결하게 작성

 

(2) 클래스 간의 계층적 분류 및 관리의 용이함 - 상속은 클래스들의 구조적 관계 파악 용이

 

(3) 클래스 재사용과 확장을 통한 소프트웨어 생산성 향상

- 빠른 소프트웨어 생산 필요

- 기존에 작성된 클래스의 재사용 - 상속 (상속받아 새로운 기능을 확장)

- 앞으로 있을 상속에 대비한 클래스의 객체 지향적 설계 필요

 

 

▷ 상속 관계 클래스의 간결화 사례

- 만일 '말하기' 기능에 오류가 있어 수정하게 되면, 4개의 클래스를 모두 수정, 이 처럼 동일한 코드가 여러 클래스에 중복되면 클래스의 유지 보수에 번거로운 일 발생  → 상속을 이용하여 중복을 제거하고 간결하게 클래스를 선언하여 문제해결

 

 

 

 

▶ 상속 선언

● class [파생클래스명] : [상속접근 지정자]  [기본클래스명]

- Student 클래스는 Person 클래스의 멤버를 물려받음

- StudentWorker 클래스는 Student의 멤버를 물려받음 (Student가 물려받은 Person 멤버도 함께 물려받음)

 

예제) Point 클래스를 상속받는 ColorPoint 클래스 만들기

 

 

▷ 파생 클래스의 객체 구성

 

▷ 파생 클래스에서 기본 클래스 멤버 접근

 

 

 

 

▷ 외부에서 파생 클래스 객체에 대한 접근

 

 

 

 

 

 

 

 

▶ 업 캐스팅(up-casting)

- 파생 클래스 포인터가 기본 클래스 포인터에 치환되는 것       ex) 사람을 동물로 봄

- 파생 클래스의 객체를 기본 클래스의 포인터로 가리키는 것

 

 

 

 

▶ 다운 캐스팅(up-casting)

- 기본 클래스의 포인터가 파생 클래스의 포인터에 치환되는 것

- 기본 클래스 포인터가 가리키는 객체를 파생 클래스의 포인터로 가리키는 것

 

 

 

 

▶ protected 접근 지정

▷ private (비공개)

- 선언된 클래스 내에서만 접근 가능

- 파생 클래스에서도 기본 클래스의 private 멤버 직접 접근 불가

 

▷ public (공개)

- 선언된 클래스나 외부 어떤 클래스, 모든 외부 함수에 접근 허용

- 파생 클래스에서 기본 클래스의 public 멤버 접근 가능

 

▷ protected (보호)

- 클래스 내의 멤버 함수와 이 클래스를 상속받는 파생 클래스의 멤버 함수에게만 접근이 허용

- 선언된 클래스에서 접근 가능

- 파생 클래스에서만 접근 허용

( 파생 클래스가 아닌 다른 클래스나 외부 함수에서는 protected 멤버를 접근할 수 없다)

 

▷ 멤버의 접근 지정에 따른 접근성

 

예제) protected 멤버에 대한 접근

 

 

 

 

 

▶ 상속 관계의 생성자와 소멸자 실행

▷생성자

- 파생 클래스와 기본 클래스는 각각 생성자를 가지고 있음

- 파생 클래스의 객체가 생성될 때, 파생 클래스의 생성자와 기본 클래스의 생성자가 모두 실행됨

- 기본 클래스의 생성자가 먼저 실행된 후, 파생 클래스의 생성자가 실행됨

 

 

▷ 생성자 호출 관계 및 실행 순서

 

 

 

 

 

 

▷ 소멸자

- 파생 클래스의 객체가 소멸될 때, 파생 클래스의 소멸자가 먼저 실행되고 기본 클래스의 소멸자가 나중에 실행

- 생성자의 실행 순서와 반대로 실행

 

 

 

 

▷ 컴파일러에 의해 묵시적으로 기본 클래스의 생성자를 선택하는 경우

- 파생 클래스의 생성자에서 기본 클래스의 기본 생성자 호출

 

 

▷ 기본 클래스에 기본 생성자가 없는 경우

- 기본 클래스에 기본 생성자가 없는 경우, 컴파일 오류 발생

 

 

▷ 매개변수를 가진 파생 클래스의 생성자는 묵시적으로 기본 클래스의 기본 생성자 선택

- 파생 클래스의 매개변수를 가진 생성자가 기본 클래스의 기본 생성자 호출

 

 

▷ 파생 클래스의 생성자에서 명시적으로 기본 클래스의 생성자 선택

- 파생 클래스의 개체를 생성할 때, 파생 클래스의 생성자를 통해 기본 클래스의 생성자에게까지 매개변수 전달

 

 

▷ 컴파일러의 기본 생성자 호출 코드 삽입

- 클래스 B의 생성자가 기본 클래스의 생성자 A()를 묵시적으로 호출 하는 것은, 사실상 컴파일러가 다음과 같이 명시적으로 A()를 호출하도록 클래스 B의 생성자를 변형하기 때문

 

 

 

예제) TV, WideTV, SmartTV 생성자 매개 변수 전달

 

 

 

▶ 상속 지정

- 상속 선언 시 public, private, protected 3가지 중 하나 지정

- 기본 클래스의 멤버의 접근 속성을 어떻게 계승할지 지정

● public - public으로 상속 받으면, 기본 클래스의 protected, public 멤버 속성을 그대로 계승

● protected - protected으로 상속 받으면, 기본 클래스의 protected, public 멤버를 protected로 계승 

● private  - private으로 상속 받으면, 기본 클래스의 protected, public 멤버를 private으로 계승

 

 

▷ 상속 시 접근 지정에 따른 멤버의 접근지정 속성 변화

 

예제) private 상속 사례

 

 

예제) protected 상속 사례

 

 

예제) 상속이 중첩될 때 접근 지정 사례

 

 

 

 

▶  기기의 컨버전스(convergence, 융합)와 C++의 다중 상속

- 융합은 여러 기술이나 기능을 하나로 합친다는 뜻

- 무선 전화기와 MP3의 기능을 합친 제품들이 대표적인 사례

- 각 기능을 모듈화하고 여러 모듈을 조립하면 융합된 새로운 형태의 제품이 만들어짐

- 소프트웨어의 경우에도 모듈화를 통해 코드를 재사용하는 것이 대세이며, C++ 프로그래밍 관점에서는 코드를 클래스로 모듈화하고 상속을 통해 기능을 확장함

 

 

 

▷ 다중 상속 선언 및 멤버 호출

- 다중 상속으로 파생 클래스를 선언할 때는, 클래스 선언문에서 접근 지정과 함께 기본 클래스를 콤마(,)로 나열 하면 됨

 

 

예제) Adder와 Subtractor를 다중 상속 받는 Calculator 클래스 작성

 

 

▷ 다중 상속의 문제점 - 기본 클래스 멤버의 중복 상속

※ BaseIO() 의 멤버가 이중으로 객체 삽입되는 문제점  ※

※ mode 변수를 접근하는 프로그램이 서로 다른 mode 변수에 접근하는 결과를 낳게되어 잘못된 실행 오류가 발생 ※

※ 기본 클래스에 멤버 접근에 모호한 문제 발생

 

 

 

 

▶ 가상 상속

- 다중 상속으로 인한 기본 클래스 멤버의 중복 상속 해결

- 파생 클래스의 선언문에서 기본 클래스 앞에 virtual로 선언

- 파생클래스의 객체가 생성될 때 기본 클래스의 멤버는 오직 한번만 생성

- 기본 클래스의 멤버가 중복하여 생성되는것을 방지

 

▷ 가상 상속으로 다중 상속의 모호성 문제해결

 

'[C++]' 카테고리의 다른 글

[C++] 템플릿  (0) 2022.11.23
[C++] 가상함수와 추상 클래스 (다형성)  (0) 2022.11.17
[C++] 연산자 중복 (다형성)  (0) 2022.11.03
[C++] 프렌드  (0) 2022.11.01
[C++] static  (0) 2022.10.26

댓글