C++에서 클래스(class)는 public, private, protected라는 세 가지 접근 지정자 섹션을 가질 수 있으며, 각 섹션에는 그에 해당하는 클래스 멤버들이 포함됩니다.
private 멤버란?
private으로 선언된 데이터 멤버는 클래스 외부에서 직접 접근할 수 없습니다. 오직 해당 클래스의 멤버 함수나 friend로 선언된 함수만이 접근 가능합니다. 또한 접근 지정자를 명시하지 않으면 클래스의 모든 멤버는 기본적으로 private으로 설정됩니다.
protected 멤버란?
protected 멤버는 private 멤버와 매우 유사하지만 한 가지 중요한 차이점이 있습니다. 바로 파생 클래스(derived class), 즉 자식 클래스에서도 접근할 수 있다는 점입니다. 반면 private 멤버는 상속 관계에 있더라도 자식 클래스에서 접근할 수 없습니다.
다음 프로그램은 클래스에서 private 멤버와 protected 멤버가 어떻게 동작하는지 보여줍니다.
예제 코드
#include <iostream>
using namespace std;
class Base {
public :
int a = 8;
protected :
int b = 10;
private :
int c = 20;
};
class Derived : public Base {
public :
void func() {
cout << "The value of a : " << a;
cout << "\nThe value of b : " << b;
}
};
int main() {
Derived obj;
obj.func();
return 0;
}실행 결과
위 프로그램의 출력 결과는 다음과 같습니다.
The value of a : 8 The value of b : 10
코드 분석
1. Base 클래스 정의
Base 클래스에는 세 개의 데이터 멤버 a, b, c가 있으며, 각각 public, protected, private으로 선언되어 있습니다.
class Base {
public :
int a = 8;
protected :
int b = 10;
private :
int c = 20;
};2. Derived 클래스와 func() 함수
Derived 클래스는 Base 클래스를 상속받습니다. func() 함수는 a와 b의 값을 출력하지만, c의 값은 출력할 수 없습니다. c는 Base 클래스에서 private으로 선언되었기 때문에 파생 클래스인 Derived에서도 접근이 허용되지 않기 때문입니다.
class Derived : public Base {
public :
void func() {
cout << "The value of a : " << a;
cout << "\nThe value of b : " << b;
}
};3. main() 함수
main() 함수에서는 Derived 클래스의 객체 obj를 생성한 뒤 func() 함수를 호출하여 결과를 출력합니다.
int main() {
Derived obj;
obj.func();
return 0;
}핵심 정리
private은 클래스 내부와 friend 함수에서만 접근할 수 있고, protected는 여기에 더해 파생 클래스에서도 접근이 가능하며, public은 클래스 외부 어디에서든 자유롭게 접근할 수 있습니다. 이러한 접근 지정자를 적절히 활용하면 캡슐화를 강화하고 안전한 객체지향 설계를 구현할 수 있습니다.