Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++의 비공개(private)와 보호(protected) 멤버 완벽 이해하기

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은 클래스 외부 어디에서든 자유롭게 접근할 수 있습니다. 이러한 접근 지정자를 적절히 활용하면 캡슐화를 강화하고 안전한 객체지향 설계를 구현할 수 있습니다.