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

C++ 캡슐화(Encapsulation) 완벽 정리: 개념부터 예제 코드까지

캡슐화(Encapsulation)는 데이터와 그 데이터를 조작하는 메서드를 하나의 단위로 묶어 외부의 간섭으로부터 보호하는 객체 지향 프로그래밍의 핵심 원칙입니다. 즉, 데이터와 해당 데이터를 사용하는 함수들을 하나로 결합하는 것을 의미하며, 이를 통해 매우 중요한 정보 은닉(Data Hiding) 개념이 자연스럽게 실현됩니다.

C++에서는 사용자 정의 데이터 타입인 클래스(class)를 사용해 캡슐화를 구현합니다. 클래스에는 데이터 멤버와 메서드가 함께 묶여 있으며, 접근 지정자(private, public)를 통해 외부 접근 범위를 세밀하게 제어할 수 있습니다.

캡슐화 예제 코드

다음은 C++의 클래스를 활용해 캡슐화를 나타내는 프로그램입니다.

#include <iostream>
using namespace std;
class EncapsulationDemo {
    private:
    int length, breadth, height;
    public:
    void setValues(int l, int b, int h) {
        length = l;
        breadth = b;
        height = h;
    }
    void calcVolume() {
        cout<<"Length = " << length << endl;
        cout<<"Breadth = " << breadth << endl;
        cout<<"Height = " << height << endl;
        cout<<"Volume = " << length*breadth*height << endl;
    }
};
int main() {
    EncapsulationDemo obj;
    obj.setValues(5, 3, 2);
    obj.calcVolume();
    return 0;
}

실행 결과

Length = 5
Breadth = 3
Height = 2
Volume = 30

코드 분석

위 프로그램에서 변수와 메서드는 하나의 단위인 EncapsulationDemo 클래스 안에 함께 캡슐화되어 있습니다. 따라서 이 프로그램은 캡슐화 개념을 명확하게 보여주는 좋은 예시입니다.

클래스 내부의 length, breadth, height 변수는 private으로 선언되어 있어 클래스 외부에서 직접 접근할 수 없습니다. 대신 public 함수인 setValues()가 이 변수들을 초기화하며, calcVolume() 함수는 세 값을 곱해 부피를 계산해 출력합니다. 해당 코드는 다음과 같습니다.

class Encapsulation {
    private:
    int length, breadth, height;
    public:
    void setValues(int l, int b, int h) {
        length = l;
        breadth = b;
        height = h;
    }
    void calcVolume() {
        cout<<"Length = " << length << endl;
        cout<<"Breadth = " << breadth << endl;
        cout<<"Height = " << height << endl;
        cout<<"Volume = " << length*breadth*height << endl;
    }
};

main() 함수의 실행 흐름

main() 함수에서는 먼저 EncapsulationDemo 타입의 객체 obj를 생성합니다. 이후 setValues() 함수를 호출하면서 값 5, 3, 2를 전달해 멤버 변수를 초기화하고, 마지막으로 calcVolume() 함수를 통해 저장된 값과 계산된 부피를 화면에 출력합니다.

Encapsulation obj;
obj.setValues(5, 3, 2);
obj.calcVolume();

캡슐화의 주요 장점

  • 데이터 보호: private 멤버를 통해 외부의 직접적인 접근을 차단하고 데이터 무결성을 유지할 수 있습니다.
  • 정보 은닉: 내부 구현 세부 사항을 숨기고 필요한 인터페이스만 외부에 노출합니다.
  • 유지보수성 향상: 내부 구현을 변경하더라도 외부 코드에 미치는 영향을 최소화할 수 있습니다.
  • 모듈화 및 재사용성: 데이터와 기능이 하나의 단위로 관리되어 코드의 재사용성이 높아집니다.