오늘의 주제는 포함 클래스와 상속 클래스에 대해 알아보도록 하죠. 포함 클래스는 클래스 안에 특정 클래스 변수를 선언하여 포함시키는 것을 말하고 상속 클래스는 부모 클래스가 있을 때 자식 클래스로 상속 시키는 것을 말하는데 포함과 비슷하지만 이 경우는 부모의 모든 멤버변수와 멤버함수를 물려 받는 것이 상속이고, 포함은 특정 클래스를 현재 클래스 안에서 접근하여 사용할 수 있는 것을 말하는 것으로 구분하시면 될 듯 싶네요. 둘 다 현재 클래스에서 다른 클래의 것을 사용 할 수 있다는 것은 유사하지만 포함과 상속은 좀 다르니 구별하여 개념을 잡아 주시기 바래요.
class AAA{
public:
int a=10;
public:
output(){ };
}
class CCC{
public:
int c=30;
AAA p;
public:
output(){ cout<<p.a+b<<endl;;};
}
이렇게 AAA 클래스가 있는 상태에서 CCC 클래스 안에 AAA 클래스 변수를 선언하는 경우를 포함 크래스라고 부릅니다. 이 경우는 CCC 클래스 안에서 AAA 클래스 객체를 통해 AAA 클래스 안에 멤버변수와 멤버 함수를 사용할 수 있습니다.
[예제]
#include
using namespace std;
class AAA{
public:
int a=10;
public:
AAA(){ cout<<"생성자AAA"<<endl;}
~AAA(){ cout<<"소멸자AAA"<<endl;}
void output1(){
cout<<"AAA : "<<a<<endl;
}
};
class CCC{
public:
int c=30;
AAA p;
public:
CCC(){ cout<<"생성자CCC"<<endl;}
~CCC(){ cout<<"소멸자CCC"<<endl;}
void output3(){
p.output1();
cout<<"AAA 포함 : "<<p.a+b<<endl;
}
};
int main(int argc, char** argv) {
class CCC op1;
op1.output3();
return 0;
}
main()함수 안에서 CCC 클래스 객체 변수 하나만 선언 되어 있고. CCC 클래스 안에서 AAA 클래스 객체 변수가 선언 되어 있습니다. 이렇게 표현 하면 CCC 클래스 객체를 통해 AAA 클래스를 접근하는데 한다리 건너서 접근한다고 생각하면 되겠죠.
[결과]
코딩과 결과를 보시면 포함 클래스가 어떻게 접근이 되어 결과가 나오는지 아실 수 있을 거에요.
그리고, 포함과 상속 클래스에서 생성자와 소멸자 함수의 호출이 있는데 여기서 보면 CCC 클래스 객체 변수가 선언과 종료 될때의 생성자와 소멸자 함수의 순서를 위 결과를 보시고 이해하시기 바랍니다.
class AAA{
public:
int a=10;
public:
output1(){ };
}
class BBB: public AAA{
public:
int b=20;
public:
void output2(){
cout<<a+b<<endl;
}
};
상속 클래스는 다음같이 표현합니다.
class 자식클래스: 접근형태 부모클래스{
}
부모 클래스로 부터 자식 클래스로 상속 시킵니다. 즉, 부모의 모든 멤버변수와 멤버함수가 전부 자식 클래스로 넘겨준다고 생각 하시면 됩니다. 이렇게 표현하면 포함 클래스와 다르게 직접 자식 클래스는 부모 클래스에 멤버변수와 멤버 함수를 사용 할 수 있습니다.
[예제]
#include
using namespace std;
class AAA{
public:
int a=10;
public:
AAA(){ cout<<"생성자AAA"<<endl;}
~AAA(){ cout<<"소멸자AAA"<<endl;}
void output1(){
cout<<"AAA : "<<a<<endl;
}
};
class BBB: public AAA{
public:
int b=20;
public:
BBB(){ cout<<"생성자BBB"<<endl;}
~BBB(){ cout<<"소멸자BBB"<<endl;}
void output2(){
cout<<"BBB : "<<a+b<<endl;
}
};
int main(int argc, char** argv) {
class BBB op1;
op1.output1();
op1.output2();
return 0;
}
위를 보면 AAA 클래스의 output1()함수를 BBB클래스의 op1이라는 객체변수에서 접근하여 사용하는 코딩을 보실 수 있을 거에요. BBB 클래스에 상속이 되었기 때문에 op1이라는 객체변수로 접근하여 사용됩니다. 이처럼 여러개의 클래스가 있고 여러개의 클래스를 특정 클래스의 상속을 할 수 있는 이 원리를 이용하면 어떤 목적의 클래스를 설계할 때 외부의 다른 클래스를 상속 받음으로 중복 되는 코딩을 줄일 수 있고 코딩을 클래스 단위로 확장 시킬 수 있는 이점이 있습니다. 그리고 클래스 별 수정을 통한 회손을 막을 수 있고요. 어떤 특정한 형태로 클래스를 만들어 놓고 그 클래스를 수정 하지 않고 상속 클래스 개념을 이용하여 새로운 클래스로 수정 가능하다는 의미이기도 하죠.
[결과]
여기에서도 생성자와 소멸자함수의 호출 순서를 잘 알아 두세요.
포함 클래스 경우는 잘 안쓰는 것 같아요. 활용도에서는 상속 클래스로 많이 쓰고요. 상속 클래스에 대해서도 알아야 할 것은 많지만 간단히 포함 클래스와 상속 클래스의 기본 동작만 오늘 설명했네요. 느낌만 알아두세요.