[C/C++] 접근 지정자
C++에서 제공하는 접근지정자 (public
, protected
, private
)은 크게 두 가지 종류로 역할이 나뉜다. 우선 각 접근 지정자에 대한 정의는 다음과 같다.
public
: 조건 없이 어디서든 접근 가능protected
: 상속받을 시 접근 가능private
: 해당 class 내에서만 접근 가능
Class 내 Member에 대한 접근지정자
#include <iostream> using namespace std; class A { public: int var1; A(): var1(1), var2(2), var3(3) { } protected: int var2; private: int var3; }; int main() { A a; cout << a.var1 << endl; // Build okay cout << a.var2 << endl; // Build error cout << a.var3 << endl; // Build error return 0; }
위 예시를 보면 protected
, private
의 경우 외부에서 접근이 금지된다.
Class 상속에 따른 접근지정자
#include <iostream> using namespace std; class A { public: int var1; A(): var1(1), var2(2), var3(3) { } protected: int var2; private: int var3; }; class B: public A { public: B() {} void printVar(void) { cout << var1 << endl; // Build okay cout << var2 << endl; // Build okay cout << var3 << endl; // Build error } }; int main() { A a; return 0; }
위 예시를 보면 B
class에서 A
class의 멤버에 접근을 할 때 private
변수에 접근시 error가 발생되는 것을 확인 할 수 있다.
#include <iostream> using namespace std; class A { public: int var1; A(): var1(1), var2(2), var3(3) { } void setVar (int _var1, int _var2, int _var3) { var1 = _var1; var2 = _var2; var3 = _var3; } protected: int var2; private: int var3; }; class B: protected A { public: B() {} void printVar(void) { cout << var1 << endl; // Build okay cout << var2 << endl; // Build okay cout << var3 << endl; // Build error } }; int main() { B b; b.setVar(10, 20, 30); // Build error cout << b.var1 << endl; // Build error cout << b.var2 << endl; // Build error cout << b.var3 << endl; // Build error return 0; }
위 예시를 보면 B
class에서 A
class를 protected
형태로 상속받기 떄문에, 이 의미는 상속받는 A class 내에서 protected 보다 접근 범위가 넓은 (public) 멤버들을 모두 protected로 받는다 라는 의미다.
따라서 B에서 바라보는 A
class의 멤버들은 protected
이기 떄문에 public
이 아닌 이상 외부에서 접근이 불가하다.