protected는 public과 private특징을 섞었습니다.

멤버 변수에 protected를 지정하면 파생 클래스에서는 public처럼 접근이 가능하지만 객체에서는 직접 접근이 불가능합니다.

#include <iostream>
using namespace std;
class Person {
private:
        int stat;
protected:
        int power;
public:
        virtual void Show(int A) {
               cout << "a";
        }
};
class Man : public Person {
public:
        void PowerUp() {
               stat++; //에러!! //접근 불가능
               power++;
        }
        
};
int main(void) {
        Man man = Man();
        man.power = 0; //에러!! 접근 불가능
        
}

만약 멤버 변수에 대한 값 변경은 특정 멤버 함수를 거쳐야만 가능하게 하려면 데이터 은닉 관점에서는 안전하지 않는 설계가 됩니다.

(상속받은 파생 클래스에서는, 직접 멤버에 접근이 가능하기 때문입니다.)

그래서 가능하면 private 접근제어자를 사용하는 게 좋습니다.

때로는 protected접근제어자도 파생클래스에서 접근할 수 있게 되니 유용할 수도 있습니다.

 

댓글을 달아 주세요