C++ 접근 제한자

mohadang·2022년 12월 4일
0

C++

목록 보기
34/48
post-thumbnail
post-custom-banner

멤버 접근 제한자

  1. private : 자신의 클래스 내에서만 멤버 접근이 가능.
  2. protected : 파생 클래스(자식 클래스)와 자신의 클래스에서만 멤버 접근이 가능.
  3. public : 클래스 외부에서도 멤버 접근이 가능.

자식 클래스에서 접근

#include <iostream>
using namespace std;

class A
{
private :
	void Print_Private_A( ) { cout << "Print_Private_A( )" << endl; }
protected :
	void Print_Protected_A( ) { cout << "Print_Protected_A( )" << endl; }
public :
	void Print_Public_A( ) { cout << "Print_Public_A( )" << endl; }
};

class B : public A
{
public :
	void PrintAll( )
	{
		//Print_Private_A( );     // 접근 불가! 컴파일 에러!
		Print_Protected_A( ); // 접근 가능
		Print_Public_A( );     // 접근 가능
	}
};

상속 유형에 따른 접근 제한자

  • 상속 유형에 따라 부모 클래스의 멤버들이 자식 클래스의 각 접근 제한을 가지며 상속된다..

상속 유형

  1. private 상속
private 멤버는 상속되지 않고
protected 멤버는 'private'
public 멤버는 'private'으로 상속됨
  1. protected 상속
private 멤버는 상속되지 않고
protected 멤버는 'protected'
public 멤버는 'protected'으로 상속됨
  1. public 상속
private 멤버는 상속되지 않고
protected 멤버는 'protected' 
public 멤버 모두 'public'으로 상속됨

private 상속

class A 
{
private :
	void Print_Private_A( ) { cout << "Print_Private_A( )" << endl; }
protected :
	void Print_Protected_A( ) { cout << "Print_Protected_A( )" << endl; }
public :
	void Print_Public_A( ) { cout << "Print_Public_A( )" << endl; }
};
class B : private A
{
private :
	void Print_Private_B( ) { cout << "Print_Private_B( )" << endl; }
protected :
	void Print_Protected_B( ) { cout << "Print_Protected_B( )" << endl; }
public :
	void Print_Public_B( ) { cout << "Print_Public( )_B" << endl; }
public :
	void PrintAll_B( )
	{
		// 클래스 내부
		//Print_Private_A();     // 상속되지 않으므로 사용할 수 없음!
		Print_Protected_A(); // private로 상속되므로 접근 가능!
		Print_Public_A();     // private로 상속되므로 접근 가능!
	}
};

void main( )
{
	B ob;

	// 클래스 외부
	//ob.Print_Private_A(); // 상속되지 않으므로 사용할 수 없음!
	//ob.Print_Protected_A(); // private이므로 접근 불가!
	//ob.Print_Public_A(); // private이므로 접근 불가!
	//ob.Print_Private_B(); // private이므로 접근 불가!
	//ob.Print_Protected_B(); // protected이므로 접근 불가!
	ob.Print_Public_B(); // public 이므로 접근 가능!
} 

protected 상속

class A 
{
private :
	void Print_Private_A( ) { cout << "Print_Private_A( )" << endl; }
protected :
	void Print_Protected_A( ) { cout << "Print_Protected_A( )" << endl; }
public :
	void Print_Public_A( ) { cout << "Print_Public_A( )" << endl; }
};
class B : protected A
{
private :
	void Print_Private_B( ) { cout << "Print_Private_B( )" << endl; }
protected :
	void Print_Protected_B( ) { cout << "Print_Protected_B( )" << endl; }
public :
	void Print_Public_B( ) { cout << "Print_Public( )_B" << endl; }
public :
	void PrintAll_B( )
	{
		// 클래스 내부
		//Print_Private_A();     // 상속되지 않으므로 사용할 수 없음!
		Print_Protected_A(); // protected로 상속되므로 접근 가능!
		Print_Public_A();     // protected로 상속되므로 접근 가능!
	}
};
void main( )
{
	B ob;

	// 클래스 외부
	//ob.Print_Private_A(); // 상속되지 않으므로 사용할 수 없음!
	//ob.Print_Protected_A(); // protected이므로 접근 불가!
	//ob.Print_Public_A(); // protected이므로 접근 불가!
	//ob.Print_Private_B(); // private이므로 접근 불가!
	//ob.Print_Protected_B(); // protected이므로 접근 불가!
	ob.Print_Public_B(); // public 이므로 접근 가능!
} 

public 상속

class A 
{
private :
	void Print_Private_A( ) { cout << "Print_Private_A( )" << endl; }
protected :
	void Print_Protected_A( ) { cout << "Print_Protected_A( )" << endl; }
public :
	void Print_Public_A( ) { cout << "Print_Public_A( )" << endl; }
};
class B : public A
{
private :
	void Print_Private_B( ) { cout << "Print_Private_B( )" << endl; }
protected :
	void Print_Protected_B( ) { cout << "Print_Protected_B( )" << endl; }
public :
	void Print_Public_B( ) { cout << "Print_Public( )_B" << endl; }
public :
	void PrintAll_B( )
	{
		// 클래스 내부
		//Print_Private_A();     // 상속되지 않으므로 사용할 수 없음!
		Print_Protected_A(); // protected로 상속되므로 접근 가능!
		Print_Public_A();     // public로 상속되므로 접근 가능!
	}

};
void main( )
{
	B ob;

	// 클래스 외부
	//ob.Print_Private_A(); // 상속되지 않으므로 사용할 수 없음!
	//ob.Print_Protected_A(); // protected이므로 접근 불가!
	ob.Print_Public_A(); // public이므로 접근 가능!
	
	//ob.Print_Private_B(); // private이므로 접근 불가!
	//ob.Print_Protected_B(); // protected이므로 접근 불가!
	ob.Print_Public_B(); // public 이므로 접근 가능!
} 

결론

  • 상속 유형에서 private 상속이나 protected 상속은 잘 사용하지 않는다.
profile
mohadang
post-custom-banner

0개의 댓글