Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

SYDev

C++ Chapter 07-3 : protected 선언과 세 가지 형태의 상속 본문

Programming Lang/C++

C++ Chapter 07-3 : protected 선언과 세 가지 형태의 상속

시데브 2023. 7. 18. 18:51

 앞서 public과 private 선언에 대해 설명할 때 protected 선언은 상속과 관련있기 때문에 설명을 미뤘었다. 그렇다면 상속을 배웠으니 이제 protected 선언에 대해 공부해보자.

 

protected로 선언된 멤버가 허용하는 접근의 범위

 C++의 접근제어 지시자에는 private, protected, public 이렇게 세가지가 존재한다. 여기서 private이 허용하는 접근의 범위가 가장 좁고, public이 허용하는 범위가 가장 넓으며 protected는 그 중간의 범위에 해당한다.

 

 protected는 private과 거의 모든 부분에서 유사하지만, 단 한 가지 차이점이 있다. 바로 private 선언된 멤버변수는 유도 클래스에서 접근이 불가능하지만, protected 선언된 멤버변수는 접근이 가능하다는 점이다. 하지만, 기본적으로는 기초 클래스와 유도 클래스 사이에서도 '정보 은닉'은 지켜지는 것이 좋기 때문에 protected는 private과 public에 비해 자주 쓰이지는 않는다.

 

 또한, 이러한 private, protected, public을 이용해서 세 가지 형태의 상속을 명시할 수 있다. 

 

protected 상속

 protected 상속은 다음과 같이 선언할 수 있다.

class Derived : protected Base
{
	//empty
};

 protected 상속protected보다 접근의 범위가 넓은 멤버는 protected로 변경시켜서 상속하겠다는 의미를 가진다.

 

 그렇다면 다음 예제를 통해서 해당 내용을 더 알아보자.

#include <iostream>
using namespace std;

class Base
{
private:
    int num1;
protected:
    int num2;
public:
    int num3;

    Base() : num1(1), num2(2), num3(3)
    { }
};

class Derived : protected Base 
{ 
/*
접근불가 :  <- private 영역은 Base 클래스 이외의 영역에서 접근 불가능
    int num1;
protected:
    int num2;
protected:  <- 클래스가 protected 선언되었기 때문에 범위가 protected보다 넓은 public은 protected로 변환
    int num3;
*/
}; 

int main(void)
{
    Derived drv;
    // cout<<drv.num3<<endl; <- 컴파일 에러 발생
    return 0;
}

 

private 상속

 private 상속 private보다 접근의 범위가 넓은 멤버는 private으로 변경시켜서 상속하겠다는 의미를 가진다.

 

 그렇다는 것은 해당 Base 클래스가 있을 때,

class Base
{
private:
    int num1;
protected:
    int num2;
public:
    int num3;
};

 이를 상속한 Derived 클래스는 다음과 같은 형태가 된다.

class Derived : private Base
{
접근불가:
    int num1;
private:
    int num2;
private:
    int num3;
};

 그러므로 num2, num3는 클래스 derived 내부에서만 접근 가능한 멤버가 된다. 또한, 이미 private 상속된 클래스를 다시 상속할 경우에는 모든 멤버가 접근불가이기 때문에 의미 없는 상속이 된다.

 

public 상속

 public 상속도 마찬가지로 public보다 접근의 범위가 넓은 멤버는 public으로 변경시켜서 상속하겠다는 의미를 가진다.

 

 그런데 public 상속은 가장 넓은 범위의 접근을 허용하기 때문에 private을 제외한 나머지는 그냥 그대로 상속한다는 의미가 된다. 결론적으로 private 상속은 '접근 불가'의 상태가 되고, protected 멤버는 그대로 protected 멤버로, public 멤버는 public으로 상속된다.

 

 마지막으로, C++에서 대부분의 상속은 public 상속이다. 실제로 public 이외의 상속은 다중상속과 같이 특별한 경우가 아니면 잘 사용하지 않는다.

 


출처 : 윤성우, <윤성우의 열혈 C++ 프로그래밍>, 오렌지미디어, 2010.05.12