본문 바로가기
Computer & Program/잡다한 이모저모

[C++]계승

by TDRemon 2009. 7. 28.
반응형
C언어와 C++언어를 구별 짓는 특수한 기능들이 있는데 그 중에 하나가 계승(Inheritance)이다.
그럼 계승이란 무엇인가? 계승을 쉽게 말하면 똑같은 요소(함수, 인자)들이 있으면 그것을 각자 가지고 있지 말고 물려받아서 쓰면 효율적이다. 라는 것이다.
그럼 계승에는 어떤것이 있을까? 우선 무엇인가를 계승시켜주는 클래스를 기본 클래스, 기저 클래스, 베이스 클래스, 슈퍼 클래스라고 부른다. 그리고 계승받는 클래스를 파생 클래스, 서브 클래스라고 부른다.
간단한 예를 보면...

#include<iostream>
using namespace std;

class 기본클래스
{
     public :
          int temp;
          char array[10];
};

class 파생클래스 : public 기본클래스
{
     public :
          int imsi;
          void show_data();
};

void 파생클래스::show_data()
{
     cout << "temp : " << temp << endl;
     cout << "array : " << array << endl;
     cout << "imsi : " << imsi << endl;
}

void main()
{
     파생클래스 TDR;
     TDR.temp = 1;
     strcpy(TDR.array, "test code")
     TDR.imsi = 2;
     TDR.show_data();
}


이렇게 실행을 하면 결과 화면이

 temp : 1
array : test code
imsi : 2

이렇게 출력된다.

위의 코드를 잠시보면 "class 파생클래스 : public 기본클래스" 라고 쓴 부분이 있다. 앞의 "class 파생클래스"는 클래스 정의라고 하고 뒤의 " : public 기본클래스"는 무엇인가? 이건 계승에서의 엑세스 지정자의 역활을 하는 것이다.
그럼 엑세스 지정자란 무엇인가? 쉽게말해 접근 권한을 지정해 주는 것이다. 엑세스 지정자에는 private, public, protected가 있다. private, public은 간단한 C++ 코드를 짜보신 분이라면 누구나 한번은 써보셨을 것이다.
그럼 마지막의 protected란 무엇인가? 이건 계승에서만 쓰이는 엑세스 지정자로 즉 파생 클래스 외에는 접근을 불허하는 것이다.
그럼 여기서 엑세스 지정자에 따른 파생 클래스의 변화를 살펴보면...

                         기본 클래스    계  승                                   파생 클래스
class 기본클래스
{
     private :     int temp;
     public :     int temp;
     protected :     int temp;
}
      → class 파생클래스 : private 기본클래스
{
     private :     int temp;
     private :     int temp;
     private :     int temp;
}
class 기본클래스
{
     private :     int temp;
     public :     int temp;
     protected :     int temp;
}
      → class 파생클래스 : public 기본클래스
{
     private :     int temp;
     public :     int temp;
     protected :     int temp;
}
class 기본클래스
{
     private :     int temp;
     public :     int temp;
     protected :     int temp;
}
      → class 파생클래스 : protected 기본클래스
{
     private :     int temp;
     protected :     int temp;
     protected :     int temp;
}

이렇게 된다. 즉, 쉽게 말해서 특별한 경우를 제외하고는 엑세스 지정자는 public으로 하면 되는 것이다.

그럼 다음으로 궁금해 지는 것은 기본 클래스와 파생 클래스에 각각 생성자 & 소멸자가 있을 경우 어떤것이 먼저 어떻게 호출되는가 하는 의문이다. 직접 test를 해 보면 아실꺼라 믿고 간단히 말하면 호출되는 순서는

 기본 클래스 생성자  →  파생 클래스 생성자  →  파생 클래스 소멸자  →  기본 클래스 소멸자

순이다. 즉 파생 클래스에서 기본 클래스로부터 계승 받은 값을 자신의 클래스에 맞게 사용하고 싶다면 반드시 파생 클래스 내의 생성자로 초기화를 해 주어야 하는 것이다. 꼭 그런 경우가 아니더라도 직관적인 코드를 위해서 해주는 것이 바람직하다.

그럼 만약에 기본 클래스 안에 있는 모든 인자, 함수들이 필요하지는 않고 몇몇개만 필요하고 별도로 다른 인자, 함수가 필요한 경우 어떻게 해야할까? 그건 재정의(override)로 해결 할 수 있다. 즉 기본 클래스에 있는 함수를 동일한 이름으로 파생 클래스에서 다시 정의를 하면 되는 것이다. 그렇게 하면 기본 클래스에서 계승한 함수가 아닌 파생 클래스에서 새로 정의한 함수를 호출 할 수 있게 된다.

사실 이 뒤에 가상함수(virtual function)의 내용이 있는데 이건 다음 기회에 올리겠다.
반응형

'Computer & Program > 잡다한 이모저모' 카테고리의 다른 글

ctags 설정 방법  (0) 2009.09.28
[Computer]방 구석에 굴러 다니던거 정리  (0) 2009.07.29
[Linux]디렉토리 구조  (2) 2009.07.27
[Linux]리눅스의 특징  (0) 2009.07.23
[C/C++]컴파일 & 링크  (0) 2009.07.22

댓글