본문 바로가기
프로그래밍/C++

C++ public, protected, private에 대한 설명

by Hwan2 2019. 2. 19.
728x90
반응형

public = 어디서든 접근이 가능.

protected = 상속관계일 때 접근이 가능

private = 해당 클래스에서만 접근이 가능

 

 

 

#include<iostream>

using namespace std;

class A {
public:
    int num1;

    A() : num1(5), num2(6), num3(7) {}
protected:
    int num2;
private:
    int num3;

};

int main(void) {
    A a;

    cout << a.num1 << endl; //컴파일 OK!!
    cout << a.num2 << endl; //컴파일 Error!!
    cout << a.num3 << endl; //컴파일 Error!!

 

다른 함수(main())에서 사용할 때는 public으로 선언된 변수 외엔 사용할 수 없습니다.

 

 

 

 

 

상속 관계일때 모습

#include<iostream>

using namespace std;

class A {
public:
    int num1;

    A() : num1(5), num2(6), num3(7) {}
protected:
    int num2;
private:
    int num3;

};

class B : public A {
public:
     
    void setNum() {
        num1 = 10;   //컴파일 OK!!
        num2 = 100;  //컴파일 OK!!
        num3 = 1000; //컴파일 Error!!
    }
};
​

 

위 소스는 상속 관계일 때 자식 클래스인 B에서 A에 대한 접근을 했을 때의 모습입니다.

 

이것들을 접근제어 지시자 라고 하며 이렇게 접근을 막고 외부로 부터 노출을 줄이는 것을 정보은닉 이라고 부릅니다.

 

이는 객체지향 언어의 특징인데, 의도치 않은 코드의 수정을 막고 객체와 객체간의 간섭이 최대한 없도록 하기 위함 입니다.

 

그리고 여러 class를 정의하고 사용하다 보면 필요한 기능이 있는 함수만을 갖고 사용하는 면이 많아집니다.

 

따라서 주 기능들만 외부로 들어내고 나머지 기능들은 외부로 노출을 시키지 않는 것입니다.

 

 

 

#include<iostream>

using namespace std;

class A {
public:
    int num1;

    A() : num1(5), num2(6), num3(7) {}
    void pri() { cout << "hi" << endl; };

protected:
    int num2;
private:
    int num3;

};

class B : protected A {
public:
     
    void setNum() {
        num1 = 10;   //컴파일 OK!!
        num2 = 100;  //컴파일 OK!!
        num3 = 1000; //컴파일 Error!!
    }
};


int main(void) {

    B b;
    b.pri();                //컴파일 Error!!
    cout << b.num1 << endl; //컴파일 Error!!
    cout << b.num2 << endl; //컴파일 Error!!
    cout << b.num3 << endl; //컴파일 Error!!

}​

 

 

위 소스는 상속 부분 class B : public A -> class B : protected A 로 변경한 것입니다.

 

이 뜻은 "B class가 A class를 상속받되 protected보다 접근 범위가 넓은 것들(public)을 모두 protected로 바꾸겠다!" 라는 뜻입니다.

 

즉, B의 입장에서 봤을 때 A class의 맴버변수들은 private을 제외한 모든 변수들을 protected로 인식하겠다! 라는 뜻이 됩니다.

 

이 때문에 위에 보이는 것 처럼 컴파일 에러가 발생하는 것이고요. 이건 함수도 마찬가지 입니다.

 

class B : private A 로 바꾼다면??

 

당연히 접근 범위들은 모두 private으로 바뀌게 되고 B클래스 에선 class A에 대한 접근이 모두 private으로 보이게 됩니다.

반응형

댓글


스킨편집 -> html 편집에서