C++ 데이터 캡슐화


모든 C++ 프로그램에는 다음과 같은 두 가지 기본 요소가 있습니다.

  • 프로그램 명령문(코드): 이것은 작업을 수행하는 프로그램의 일부이며 이를 함수라고 합니다.

  • 프로그램 데이터: 데이터는 프로그램 정보이며 프로그램 기능에 영향을 받습니다.

캡슐화는 데이터와 데이터에서 작동하는 기능을 함께 바인딩하는 객체 지향 프로그래밍의 개념입니다. 이를 통해 외부 세계의 간섭과 오용을 방지하여 보안을 보장할 수 있습니다. 데이터 캡슐화는 또 다른 중요한 OOP 개념, 즉 데이터 숨기기로 이어집니다.

데이터 캡슐화는 데이터와 데이터에서 작동하는 기능을 묶는 메커니즘입니다. 데이터 추상화는 사용자에게 인터페이스만 노출하고 특정 구현 세부 정보를 숨기는 메커니즘입니다.

C++에서는 클래스를 생성하여 캡슐화 및 데이터 숨기기(공개, 보호, 비공개)를 지원합니다. 우리는 클래스에 비공개, 보호 및 공개 멤버가 포함되어 있다는 것을 이미 알고 있습니다. 기본적으로 클래스에 정의된 모든 항목은 비공개입니다. 예:

class Box
{
   public:
      double getVolume(void)
      {
         return length * breadth * height;
      }
   private:
      double length;      // 长度
      double breadth;     // 宽度
      double height;      // 高度
};

변수 length, width 및 height는 모두 비공개입니다. 즉, Box 클래스의 다른 멤버만 액세스할 수 있고 프로그램의 다른 부분에서는 액세스할 수 없습니다. 이는 캡슐화를 달성하는 한 가지 방법입니다.

클래스의 멤버를 공개로 만들려면(즉, 프로그램의 다른 부분에 액세스할 수 있도록) 해당 멤버 앞에 public 키워드를 사용하여 선언해야 합니다. 공용 식별자 다음에 정의된 모든 변수나 함수는 프로그램의 다른 모든 함수에서 액세스할 수 있습니다.

클래스를 다른 클래스의 친구 클래스로 정의하면 구현 세부 정보가 노출되므로 캡슐화가 줄어듭니다. 이상적인 접근 방식은 각 클래스의 구현 세부 사항을 외부에서 최대한 숨기는 것입니다.

데이터 캡슐화 인스턴스

C++ 프로그램에서는 공개 및 비공개 멤버가 있는 모든 클래스를 데이터 캡슐화 및 데이터 추상화의 인스턴스로 사용할 수 있습니다. 아래 예를 참조하세요.

#include <iostream>
using namespace std;

class Adder{
   public:
      // 构造函数
      Adder(int i = 0)
      {
        total = i;
      }
      // 对外的接口
      void addNum(int number)
      {
          total += number;
      }
      // 对外的接口
      int getTotal()
      {
          return total;
      };
   private:
      // 对外隐藏的数据
      int total;
};
int main( )
{
   Adder a;
   
   a.addNum(10);
   a.addNum(20);
   a.addNum(30);

   cout << "Total " << a.getTotal() <<endl;
   return 0;
}

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

Total 60

위 클래스는 숫자를 더하고 합계를 반환합니다. 공개 멤버 addNumgetTotal은 외부 인터페이스이므로 사용자가 클래스를 사용하려면 이를 알아야 합니다. 비공개 멤버 total은 외부 세계에 숨겨져 있으므로 사용자는 이에 대해 알 필요가 없지만 클래스가 제대로 작동하려면 필요합니다.

디자인 전략

일반적으로 좋은 캡슐화를 보장하기 위해 실제로 노출할 필요가 없는 한 클래스 멤버 상태를 비공개로 설정합니다.

이것은 일반적으로 데이터 멤버에 적용되지만 가상 함수를 포함한 모든 멤버에 동일하게 적용됩니다.