C++ 상속 접근 지정자: public, protected, private 완벽 이해
C++ public, protected, private 상속
이 튜토리얼에서는 예제를 통해 C++에서 public, protected, private 상속을 사용하는 방법을 학습합니다.
소개
C++ 상속에서 자식 클래스를 기반 클래스로부터 다양한 접근 모드로 파생할 수 있습니다. 예를 들어:
class Base {
.... ... ....
};
class Derived : public Base {
.... ... ....
};
코드에서 public 키워드를 주목하세요.
class Derived : public Base
이는 기반 클래스로부터 public 모드로 파생 클래스를 생성했음을 의미합니다. 또는 protected 또는 private 모드로 클래스를 파생할 수도 있습니다.
이 3개의 키워드(public, protected, private)를 C++ 상속에서 접근 지정자라고 합니다.
C++에서 public, protected, private 상속
public, protected, private 상속의 특징은 다음과 같습니다:
- public 상속: 기반 클래스의
public 멤버가 파생 클래스에서 public으로, protected 멤버는 protected로 유지됩니다.
- protected 상속: 기반 클래스의
public과 protected 멤버가 파생 클래스에서 protected가 됩니다.
- private 상속: 기반 클래스의
public과 protected 멤버가 파생 클래스에서 private가 됩니다.
참고: 기반 클래스의 private 멤버는 파생 클래스에서 접근할 수 없습니다.
class Base {
public:
int x;
protected:
int y;
private:
int z;
};
class PublicDerived: public Base {
// x는 public
// y는 protected
// z는 PublicDerived에서 접근 불가
};
class ProtectedDerived: protected Base {
// x는 protected
// y는 protected
// z는 ProtectedDerived에서 접근 불가
};
class PrivateDerived: private Base {
// x는 private
// y는 private
// z는 PrivateDerived에서 접근 불가
}
예제 1: C++ public 상속
// C++ public 상속의 작동을 보여주는 프로그램
#include <iostream>
using namespace std;
class Base {
private:
int pvt = 1;
protected:
int prot = 2;
public:
int pub = 3;
// private 멤버 접근 함수
int getPVT() {
return pvt;
}
};
class PublicDerived : public Base {
public:
// Base의 protected 멤버 접근 함수
int getProt() {
return prot;
}
};
int main() {
PublicDerived object1;
cout << "Private = " << object1.getPVT() << endl;
cout << "Protected = " << object1.getProt() << endl;
cout << "Public = " << object1.pub << endl;
return 0;
}
출력
Private = 1
Protected = 2
Public = 3
여기서 PublicDerived를 Base로부터 public 모드로 파생했습니다.
결과적으로 PublicDerived에서:
- prot는 protected로 상속됩니다.
- pub과
getPVT()는 public으로 상속됩니다.
- pvt는
Base에서 private이므로 접근 불가합니다.
private과 protected 멤버는 main()에서 직접 접근할 수 없으므로 getPVT()와 getProt() 같은 public 함수를 만들어 접근해야 합니다:
// 오류: "Base::pvt" 멤버에 접근 불가
cout << "Private = " << object1.pvt;
// 오류: "Base::prot" 멤버에 접근 불가
cout << "Protected = " << object1.prot;
getPVT() 함수는 Base 내부에 정의되었지만 getProt() 함수는 PublicDerived 내부에 정의되었음에 주목하세요.
이는 pvt가 Base에서 private이므로 PublicDerived에서 접근할 수 없기 때문입니다.
그러나 prot는 public 상속으로 인해 PublicDerived에서 접근 가능하므로 getProt()가 PublicDerived 내부에서 protected 변수에 접근할 수 있습니다.
public 상속에서의 접근성
| 접근성 | private 멤버 | protected 멤버 | public 멤버 |
| 기반 클래스 | Yes | Yes | Yes |
| 파생 클래스 | No | Yes | Yes |
예제 2: C++ protected 상속
// C++ protected 상속의 작동을 보여주는 프로그램
#include <iostream>
using namespace std;
class Base {
private:
int pvt = 1;
protected:
int prot = 2;
public:
int pub = 3;
// private 멤버 접근 함수
int getPVT() {
return pvt;
}
};
class ProtectedDerived : protected Base {
public:
// Base의 protected 멤버 접근 함수
int getProt() {
return prot;
}
// Base의 public 멤버 접근 함수
int getPub() {
return pub;
}
};
int main() {
ProtectedDerived object1;
cout << "Private cannot be accessed." << endl;
cout << "Protected = " << object1.getProt() << endl;
cout << "Public = " << object1.getPub() << endl;
return 0;
}
출력
Private cannot be accessed.
Protected = 2
Public = 3
여기서 ProtectedDerived를 Base로부터 protected 모드로 파생했습니다.
결과적으로 ProtectedDerived에서:
- prot, pub,
getPVT()가 protected로 상속됩니다.
pvt는 Base에서 private이므로 접근 불가합니다.
알다시피 protected 멤버는 클래스 외부에서 직접 접근할 수 없습니다. 따라서 ProtectedDerived에서 getPVT()를 사용할 수 없습니다.
이 때문에 ProtectedDerived에서 pub 변수에 접근하기 위해 getPub() 함수를 만들어야 했습니다.
// 오류: "Base::getPVT()" 멤버에 접근 불가
cout << "Private = " << object1.getPVT();
// 오류: "Base::pub" 멤버에 접근 불가
cout << "Public = " << object1.pub;
protected 상속에서의 접근성
| 접근성 | private 멤버 | protected 멤버 | public 멤버 |
| 기반 클래스 | Yes | Yes | Yes |
| 파생 클래스 | No | Yes | Yes (protected 변수로 상속됨) |
예제 3: C++ private 상속
// C++ private 상속의 작동을 보여주는 프로그램
#include <iostream>
using namespace std;
class Base {
private:
int pvt = 1;
protected:
int prot = 2;
public:
int pub = 3;
// private 멤버 접근 함수
int getPVT() {
return pvt;
}
};
class PrivateDerived : private Base {
public:
// Base의 protected 멤버 접근 함수
int getProt() {
return prot;
}
// Base의 public 멤버 접근 함수
int getPub() {
return pub;
}
};
int main() {
PrivateDerived object1;
cout << "Private cannot be accessed." << endl;
cout << "Protected = " << object1.getProt() << endl;
cout << "Public = " << object1.getPub() << endl;
return 0;
}
출력
Private cannot be accessed.
Protected = 2
Public = 3
여기서 PrivateDerived를 Base로부터 private 모드로 파생했습니다.
결과적으로 PrivateDerived에서:
- prot,
pub, getPVT()가 private로 상속됩니다.
- pvt는
Base에서 private이므로 접근 불가합니다.
알다시피 private 멤버는 클래스 외부에서 직접 접근할 수 없습니다. 따라서 PrivateDerived에서 getPVT()를 사용할 수 없습니다.
이 때문에 PrivateDerived에서 pub 변수에 접근하기 위해 getPub() 함수를 만들어야 했습니다.
// 오류: "Base::getPVT()" 멤버에 접근 불가
cout << "Private = " << object1.getPVT();
// 오류: "Base::pub" 멤버에 접근 불가
cout << "Public = " << object1.pub;
private 상속에서의 접근성
| 접근성 | private 멤버 | protected 멤버 | public 멤버 |
| 기반 클래스 | Yes | Yes | Yes |
| 파생 클래스 | No | Yes (private 변수로 상속됨) | Yes (private 변수로 상속됨) |