C / C++,  Programming

[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이 아닌 이상 외부에서 접근이 불가하다.

Leave a Reply

Your email address will not be published. Required fields are marked *