영넌 개발로그

[C++ 기초] Inheritance 상속이란? / Multiple inheritance 다중상속? 본문

코딩/C++

[C++ 기초] Inheritance 상속이란? / Multiple inheritance 다중상속?

영넌 2020. 12. 6. 05:36

Inheritance 상속?

부모로부터 물려받는 것이다. 코드를 간결하게 짤 수 있다는 장점이 있다. 복사붙여넣기와 같은 개념이지만, 코드가 잘못되어 수정이 필요한 경우 번거로움이 있기 때문에 상속을 사용하는 것이 좋다.

하지만 아무리 자식이라도 부모의 private한 것은 건들 수 없다. 그래서 자식 직접적으로 변수를 접근하도록 만들어 주고 싶다면, 접근 지정자를 protected로 지정해주어야 한다. protected는 class 외부에서는 private과 같은 기능을 하고, 자기 자식(상속 받은)한테는 public과 같은 기능을 한다. 상속 받을 때 public을 적지 않고 class 자식이름 : 부모이름 으로 적으면  부모로부터 받아온 모든 변수,메소드를 private으로 묶어버린다. 즉, 클래스 밖에서 사용할 수 없다. 

(default 상속==private 상속)

 

아래 코드는 2D 클래스의 public만 3D 클래스에서 상속받는 코드이다. class 자식이름 : public 부모이름 으로 작성한다. 이렇게 되면 부모의 모든 public 변수, 메소드가 public으로 된다는 의미이다. 이러면 부모 클래스의 private 변수, 메소드는 사용할 수 없다. (public 상속)

생성자는 부모가 먼저 불려 생성된 후, 자식이 불리며 생성된다.

소멸자의 경우 자식이 먼저 불려 사라지고, 부모가 불려 사라진다.

#include <iostream>

using namespace std;


//2차원 좌표
class Coord_2D {
private:
	int x;
	int y;
public:
	Coord_2D(int _x, int _y): x(_x),y(_y){}
	void showCoord();

};

void Coord_2D::showCoord() {
	cout << x << ", " << y;
}

//------------------------------------------



//3차원 좌표
class Coord_3D : public Coord_2D
{
private:
	int z;
public:
	Coord_3D(int _x, int _y, int _z): Coord_2D(_x,_y), z(_z){}
	void showCoord_3D();
};

void Coord_3D::showCoord_3D() {
	showCoord();
	cout <<", " << z << endl;
}


int main() {
	Coord_2D a(10, 10);
	Coord_3D b(10, 20, 30);

	a.showCoord();
	cout << endl;
	b.showCoord_3D();
	

	return 0;
}

 

Method Overriding

상속관계에 있는 클래스가 있을 때, 자식 클래스의 메소드로 인해 부모 클래스의 메소드가 가려지는 현상이다. 부모(A)와 자식(B)이 같은 이름의 메소드를 가지고 있을 때, 자식이 같은 이름의 메소드를 부르면 자식 클래스의 있는 메소드만 실행된다. 부모 클래스의 객체를 만들었다면 당연히 부모 클래스에 있는 메소드가 불린다.

 

#include <iostream>

using namespace std;


//2차원 좌표
class Coord_2D {
private:
	int x;
	int y;
public:
	Coord_2D(int _x, int _y): x(_x),y(_y){}
	void showCoord();

};

void Coord_2D::showCoord() {
	cout << x << ", " << y;
}

//------------------------------------------



//3차원 좌표
class Coord_3D : public Coord_2D
{
private:
	int z;
public:
	Coord_3D(int _x, int _y, int _z): Coord_2D(_x,_y), z(_z){}
	void showCoord();
};

void Coord_3D::showCoord() {
	showCoord();
	cout <<", " << z << endl;
}


int main() {
	Coord_2D a(10, 10);
	Coord_3D b(10, 20, 30);

	a.showCoord();
	cout << endl;
	b.showCoord();
	

	return 0;
}

 

부모클래스의 overriden된 method 호출

자식 클래스에서 부모 클래스 안에 있는 같은 이름의 메소드를 호출할 수 있다. scope resolution operator(::)를 사용하여 어느 범위에 속하는 메소드인지 확실하게 정의할 수 있다. 

자식객체.부모클래스이름::함수이름();

int main() {
	Coord_3D b(10, 20, 30);

	b.showCoord();
	
	b.Coord_2D::showCoord();

	return 0;
}

 

 

 


Multiple inheritance 다중 상속?

C++에서는 여러 개의 상속을 받아 부모가 여러 개일 수도 있다. 부모끼리는 아무런 관계가 없는 클래스이다.

상속 받을 때 " , "로 구분하여 나열하면 된다.

 

부모끼리 변수 이름이 같을 경우, 어느 부모로부터 오는건지 확실치 않아 문제가 생길 수 있다. 그럴 때에는 앞에 scope resolution operator(::)을 통해 확실하게 해주어야한다.

프로그래밍할 때 권장되는 사항은 아니다. 그래서 JAVA에서는 다중 상속을 아예 막아버렸다.

 

#include <iostream>

using namespace std;

class PA {
public:
	int x;
	PA(int _x) :x(_x)
	{
		cout << "PA constructor" << endl;
	}
};

class PB {
public:
	int y;
	PB(int _y) :y(_y)
	{
		cout << "PB constructor" << endl;
	}
};

class ChildC : public PA, public PB {
public:
	ChildC(int _x, int _y) : PA(_x), PB(_y)
	{
		cout << "CC constructor" << endl;
	}
};

int main() {
	ChildC obj(10, 20);
	cout << "-------------" << endl;

	cout << "x is: " << obj.x << endl;
	cout << "y is: " << obj.y << endl;

}

Comments