본문 바로가기
Coding Test/C++ 기초

[C++ 기초] 상속

by seoyamin 2022. 8. 3.

1. 상속

상속이란 객체 지향 프로그램의 한 특성으로,
부모 클래스의 멤버 변수 / 멤버 함수를 그대로 자식 클래스가 물려받아서 재사용한다는 개념이다.

 

* 부모 클래스 = 슈퍼 클래스 = base class      자식 클래스 = 서브 클래스 = derived class

 

 

1-1. 상속의 효과

① 경제성  :  불필요한 코드의 중복을 제거

② 편의성  :  유지, 보수에 유리함

 

 

1-2. 상속 형식

class Base명 {

};

class Derived명 : [접근제어자] Base명 {

};

 

 

1-3. 접근 제어자와 상속

public protected private
모든 함수에서 접근 가능
(클래스 내/외)
클래스 내 모든 멤버 함수와
이 클래스를 상속받는 자녀 클래스의
멤버 함수에서 접근 가능
클래스 내 모든 멤버 함수에서
접근 가능

 

캡슐화

캡슐화란, 말 그대로 코드를 캡슐로 감싸서 보호한다는 개념이다.
접근 제어자를 통해 클래스 내부의 멤버들에 대한 access를 통제하고, getter/setter를 통해 접근하게 하여 프로그램의 안전성을 확보한다.

 

#include <iostream>

using namespace std;

class Dog {

private:
	int age;

public:
	//  생성자
	Dog(int a) {
    		age = a;
    };
    
    void getAge() {
    		return age;
    };
    
	void showAge() {
    		cout << "age is " << age << endl;
    };
    
};


class Husky : public Dog {

private: 
	int weight;

public: 
	Husky(int a, int w) : Dog(a) {  // 생성자
    		weight = w;
	};
    
    void showWeigh() {
    		cout << "weight is " << weight << endl;
    };
};


int main() {
	Dog dog1(5);
    dog1.showAge();
    
    Husky h1(2, 20);
    h1.showWeight();
    // h1.weight = 25; 불가능 (private)
    
    return 0;
 }

 

 

 

2. 오버라이딩

오버라이딩 (Overriding)은 상속 관계에서 부모 클래스에 이미 정의되어 있는 함수를 자식 클래스에서 재정의하여 사용하는 것을 의미한다. 이때, 자식 클래스에서 해당 함수를 사용하면 부모 클래스의 함수가 아닌 새롭게 오버라이딩된 함수가 사용된다.

 

2-1. 오버라이딩의 조건

부모 클래스의 멤버 함수와 재정의한 자식 클래스의 멤버 함수의 원형이 동일해야 한다.

(함수의 원형 : 함수명, 매개변수 타입, 매개변수 개수 등)

 

#include <iostream>

using namespace std;

class A {
public:
	void myFun() {
    	cout << "myFun of A" << endl;
    };
};


class B : public A {
public: 	
	void myFun() {
    	cout << "myFun of B" << endl;
    };
};


int main() {
	A a1;
    B b1;
    
    a1.myFun();
    b1.myFun();
    
    return 0;
}

 

2-2. 기타

자식 클래스에서 원래 부모 클래스의 원본 함수를 사용하고 싶은 경우에는 범위 지정자 (::)를 사용하면 된다.

 

#include <iostream>

using namespace std;

class A {
public:
	void myFun() {
    	cout << "myFun of A" << endl;
    };
};


class B : public A {
public: 	
	void myFun() {
    	A::myFun();
    	cout << "myFun of B" << endl;
    };
};


int main() {
	A a1;
    B b1;
    
    b1.myFun();
    // myFun of A
	// myFun of B
    
    return 0;
}

 

 

3. 다중 상속

다중상속이란, 여러 부모에게서 상속을 받는 경우를 말한다. 

일반적으로 다중상속은 권장되지 않는데, 그 이유는 아래와 같다

상속 받은 두 부모 클래스 A, B에 동일한 이름의 함수가 있는 경우, 자식 클래스 C에서 둘 중 어느 클래스의 함수를 사용해야 하는지 모르게 되는 모호성이 있다.

 

#include <iostream>

using namespace std;

class A {
public:
	void aFun() {
    	cout << "myFun of A" << endl;
    };
};


class B : public A {
public: 	
	void bFun() {
    	cout << "myFun of B" << endl;
    };
};


class C : public A, public B {
public: 	
	void cFun() {
    	cout << "myFun of C" << endl;
    };
};

 

'Coding Test > C++ 기초' 카테고리의 다른 글

[C++ 기초] 템플릿  (0) 2022.08.18
[C++ 기초] 오버로딩  (0) 2022.08.11
[C++ 기초] 클래스  (0) 2022.08.03
[C++ 기초] 포인터  (0) 2022.07.20
[C++ 기초] 배열  (0) 2022.07.20