protected 선언


C++ 의 접근 제어 지시자에는 private, protected, public 이렇게 세가지가 존재한다. 그리고 이들이 허용하는 접근의 범위에는 다음의 관계가 있다.


private < protected < public


즉, public이 허용하는 접근의 범위가 가장 넓고, private이 허용하는 접근의 범위가 가장 좁다. 반면, protected는 그 중간 범위의 접근을 허용한다. 하지만 protected는 private과 매우 유사하다.


class A

{

private:

int num1;


protected:

int num2;


public:

int num3;

A(int n1, int n2, int n3)

:num1(n1), num2(n2), num3(n3)

{ }

void Show() const

{

cout<<num1<<num2<<num3<<endl;

}

};


이 상태에서는 private과 protected가 차이를 보이지 않는다. 둘 다 클래스의 외부에서는 접근이 불가능한 반면, 클래스 내부에서는 접근이 가능하기 때문이다. 

하지만, 이 클래스가 상속이 되면, 이야기는 달라진다.


class B :public A

{

public:

B(int n1, int n2, int n3)

:A(n1, n2, n3)

{ }

void ShowData() const

{

cout<<num1; // 컴파일 에러

cout<<num2; // 컴파일 OK

cout<<num3; // 컴파일 Ok

}

};


위의 클래스는 A 클래스를 상속하고 있다. 따라서 public으로 선언된 멤버변수 num3에 접근이 가능하지만 private으로 선언된 멤버변수 num1에는 접근이 불가능하다. 

여기서 protected는 "protected로 선언된 멤버변수는 이를 상속하는 유도 클래스에서 접근이 가능하다."


protected 멤버는 유도 클래스에서 접근이 가능하다. 그리고 이것이 private과 protected의 유일한 차이점이다!!


protected선언은 private과 public에 비해 그리 많이 사용되지 않는다. 물론 유도 클래스에게만 제한적으로 접근을 허용한다는 측면에서 유용하게 사용될 수 있는 키워드이다. 하지만 기본적으로는 기초 클래스와 이를 상속하는 유도 클래스 사이에서도 '정보 은닉'은 지켜지는 게 좋다.







세가지 형태의 상속


class B :public A

{

...

}

상속을 명시하는데 있어서 public이 사용되었음을 알 수 있다. 따라서 이러한 경우 A클래스는 "public으로 상속되었다." 라고 한다. 


class B :protected A        //A클래스가 protected로 상속되었다.

{

...

}


class B :private A            //A클래스가 private으로 상속되었다.

{

...

}


이렇듯 상속에는 세가지 형태의 상속이 존재한다. 그리고 키워드 public, protected, private은 멤버의 접근권한을 명시하는 용도로도 사용되지만, 상속의 형태를 명시하는 용도로도 사용이 된다.




proteced 상속


class B :protected A

{

...

}


'protected 상속'이 의미하는 바는 다음과 같다.


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


protected보다 접근범위가 넓은 멤버는 public 멤버뿐이니, protected 상속을 한 클래스는 public이 protected로 변경되어서 상속이 이루어진다.


class B :protected A

{

접근불가:

int num1;

protected:

int num2;

protected:

int num3;

};

그리고 중요한 것이 있는데 private은 접근불가이다. 




private 상속


class B :private A

{

...

}


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


private보다 접근범위가 넓은 멤버는 protected와 public이니 모두 private으로 변경되어 상속이 이루어진다.


class B :private A

{

접근불가:

int num1;

private:

int num2;

private:

int num3;

};


그리고 만약, 다른 클래스가 이 클래스를 다음과 같이 다시 상속한다면...

class C :public B

{

...

}


C 클래스의 모든 멤버가 private(접근불가) 이기 대문에 다음과 같은 형태가 되어버린다.

class C :public B

{

접근불가:

int num1;

접근불가:

int num2;

접근불가:

int num3;

};


이렇듯, private 상속이 이뤄진 클래스를 다시 상속할 경우, 멤버함수를 포함하여 모든 멤버가 '접근불가'가 되기 때문에 사실상 의미 없는 상속이 되고 만다.




public 상속


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


그런데 public보다 넓은 멤버는 public밖에 없다. 고로 "private을 제외한 나머지는 그냥 그대로 상속한다."


즉, private 멤버는 '접근불가'의 형태로 상속을 하지만 protected 멤버는 protected로, public 멤버는 public으로 상속이 진행된다.


※ 참고로 상속의 대부분은 public 상속이다.

'Programming > C++' 카테고리의 다른 글

상속을 이용한 프로그램  (0) 2012.06.21
상속을 위한 조건  (0) 2012.06.19
상속(inheritance)  (0) 2012.06.06
C++에서의 static  (0) 2012.05.30
friend  (0) 2012.05.26
Posted by scii
: