오늘은 추상 클래스에 대해 알아보도록 하겠습니다. 이전 강좌에서 virtual(가상) 함수에 대해서 이야기 한 적이 있습니다. 이 가상 함수는 파생 클래스에서 재정의 가능한 함수를 말합니다. 즉, 부모 클래스에 정의 된 가상 함수가 있으면 자식 클래스에서 재정의 할 수도 있고 안할 수도 있는 함수를 가리킵니다. 하지만 추상 클래스는 순수 가상상함수를 가지고 있으면 반드시 파생클래스에서 재정의 되어야 하는 구조를 띄고 있습니다. 그럼 추상 클래스가 어떻게 사용하는지 자세히 알아보도록 하죠.
class AAA{
public:
virtual void output()=0;
};
위와 같은 가상 함수를 순수 가상함수라고 합니다. output()함수를 호출하면 에러가 발생합니다. AAA은 부모 클래스로 이렇게 선언 된 순수 가상함수는 파생 클래스에서 재정의를 반드시 해야 합니다.
class AAA{
public:
virtual void output()=0;
};
class BBB: public AAA{
public:
virtual void output(){
cout<<"BBB"<<endl;
}
};
추상 클래스는 하나 이상의 순수가상함수를 소유하고 있는데 AAA 클래스 코딩과 같습니다. 그리고 BBB 파생클래스는 이 순수가상함수를 재정의 됩니다. 이렇게 재정의 해야만 합니다.
즉, 추상클래스는 정의 되어 있지 않는 가상 함수를 선언한 형태이고 실질적으로 해당 함수는 파생클래스에서 재정의 된 함수를 사용하게 됩니다. 이렇게 함수 이름만 추상적으로 선언 되어 실질 동작은 파생 클래스에서 실행합니다.
어떤 느낌입니까? AAA 클래스는 실질적 동작이 아닌 추상적으로 이름만 명시해 놓았죠. 그리고 동작은 파생클래스에서 하니 AAA은 껍질 틀과 같은 형태만 선언되어 있고 실제 알멩이는 파생클래스에서 이루어지는 것이죠.
이 가상함수는 오버라이딩 함수라고 보면 아마 될 듯 싶네요.
추상 클래스를 실제 코딩해보고 그 결과를 봐야 겠지요.
[전체소스]
#include
using namespace std;
class AAA{
public:
virtual void output()=0;
};
class BBB: public AAA{
public:
virtual void output(){
cout<<"BBB"<<endl;
}
};
class CCC: public AAA{
public:
virtual void output(){
cout<<"CCC"<<endl;
}
};
int main(int argc, char** argv) {
BBB op1;
CCC op2;
op1.output();
op2.output();
return 0;
}
[결과]
오늘은 추상 클래스를 만들어 보는 시간을 가졌습니다. 어떤 특정한 동작을 수행하지 않는 하나의 틀을 미리 만들어 놓고 실질 동작은 파생 클래스에서 수행하는 형태를 가리킵니다. 즉, 틀만 만들어 놓은 형태로 생각하시면 됩니다.