내일배움캠프 10일차 - C++ 객체지향 프로그래밍 : 클래스 상속

상속

속도, 색상 등의 차량의 공통적인 특성을 매번 모든 차량에 개별적으로 구현하는 대신, 

하나의 기본 클래스를 정의하고 공통 속성을 구현하고 이를 활용하면 유지 보수가 쉬워지고 코드의 중복을 줄일 수 있다.


여기서 상속 대상이 클래스를 "기본 클래스"라고 한다. (한국에서는 '부모 클래스'라고도 하나 기본클래스가 맞음)
그리고 기본 클래스로부터 상속받는 클래스를 "파생 클래스" 라고 한다 (한국에서는 '자식클래스'라고도 하지만 파생클래스가 맞음)

※ 어떤 클래스가 기본이 되고 어떤 클래스가 파생이 되어야 하는가?
 : Is a 관계인지 확인해보기
 - 동물을 사자다. → 모든 동물이 사자는 아니다.
 - 사자는 동물이다. → 사자는 동물이 맞다.

1) 자식 클래스의 생성자는 부모 클래스의 생성자를 호출 할 수 있다.

위 그림에서 Derived():Base(3,4)는 파생 클래스 Derived()에서 '멤버 초기화 리스트'를 사용해 코드를 수행하기 전에 부모클래스 생성자 Base(3,4)를 먼저 실행하라는 의미이다.

이러한 방식으로 기본 클래스는 기본 클래스의 생성자가 초기화하고, 파생 클래스는 파생 클래스의 생성자가 초기화할 수 있다.


2) 다형성

기본이 되는 클래스를 만들어 함수의 인터페이스를 정의하고, 실제 구현은 파생 클래스에서 담당하게 되는 기법을 말한다.

기본 클래스의 함수를 정의할 때, 함수 앞에 'virtual' 키워드를 붙이면 가상함수가 되어 호출될때 파생 클래스에서 재정의된 함수가 실행된다. (그렇지 않으면 기본 클래스의 함수가 실행됨)

※ 재정의 시 함수 뒤에 override를 붙이면 파생 클래스의 함수 재정의 시 코딩 실수에 대해 컴파일 에러로 경고해준다.

순수 가상함수
 : 기본 클래스에서 구현하지 않고 반드시 파생 클래스에서 구현하도록 강제하는 가상 함수
 : 가상함수를 정의하고 '= 0'을 붙여주면 선언된다. ( virtual int memFunc() = 0; )


※ 상속 클래스 등을 .h, .cpp 분리해서 정의할 경우 주의사항

 - 평소 #include는 cpp파일에서 선언하는것이 원칙이나(컴파일속도, 의존성관리 향상), 파일이 분리되면서 기존 main.cpp에 선언했던 include헤더가 포함되지 않았을 수도 있다.

 - 파생클래스에서 기본클래스.h 또는 값자료형 헤더를 부득이하게 선언해야할 필요가 있을때 .h, .cpp 가리지 않고 #include 전방선언해도 된다. #pragma once가 중복선언을 막아주기 때문이다.

 - using namespace std 또한 같이 선언하는 것이 좋으나, 코딩테스트 등에서의 실수를 피하기 위해 네임스페이스 선언 없이 "std::"를 같이 쓰는 연습도 하면 좋을 것이다.

댓글

이 블로그의 인기 게시물

내일배움캠프 사전캠프 - 사전캠프설 연휴 커피 파밍 이벤트 작품 [ EXTREMITY ]

내일배움캠프 29일차 - 커리어데이 2일차 : 클라이언트 프로그래머로서 포트폴리오, 입사준비팁