본문 바로가기
c++

[C++]캡슐화

by goblin- 2023. 2. 19.

정보은닉과 캡슐화는 객체지향 기반의 클래스 설계에서 가장 기본이면서도 가장 중요한 원칙이다.

 

다음 예제는 학원 조교가 선생님의 수업준비물을 챙기는 물품을 정리한 코드이다. 이 예제를 통하여 캡슐화를 설명하겠다.

#include <iostream>
using namespace std;

class laser{
    public:
        void take() const {cout<<"빔리모콘을 챙깁니다."<<endl;}
};

class notebook{
    public:
        void take() const {cout<<"노트북을 챙깁니다."<<endl;}
};

class eraser{
    public:
        void take() const {cout<<"칠판지우개를 챙깁니다."<<endl;}
};

class teacher{
    public:
        void takelaser(laser &laser) const{laser.take();}
        void takenotebook(notebook &notebook) const{notebook.take();}
        void takeeraser(eraser &eraser) const{eraser.take();}
};

int main(void){
    laser la;
    notebook note;
    eraser er;
    teacher lee;
    lee.takelaser(la);
    lee.takeeraser(er);
    lee.takenotebook(note);

    return 0;
}

결과

빔리모콘을 챙깁니다.
칠판지우개를 챙깁니다.
노트북을 챙깁니다.

위의 코드는 캡슐화가 되어있지 않은 상태이다. lee선생님의 수업준비를 하기 위해서는 빔리모컨, 노트북, 지우개가 필요하다 코드를 살펴보면 수업에 필요한 물품들을 따로따로 하나씩 작성하여 코드도 복잡해지고 만약 준비하는 과정순서가 중요한 경우 위의 클래스 설계는 매우 위험한 구조가 된다.(예 책상을 준비하고 그 위에 노트북을 올리시오) 따라서 캡슐화를 이용하여 프로그램의 전체의 복잡도를 낮추고 안전한 설계를 해야 한다.

 

캡슐화를 사용하여 lee선생님의 수업준비 물품들을 코딩화 하였다.

#include <iostream>
using namespace std;

class laser{
    public:
        void take() const{cout<<"빔리모콘을 챙깁니다."<<endl;}
};

class notebook{
    public:
        void take() const{cout<<"노트북을 챙깁니다."<<endl;}
};

class eraser{
    public:
        void take() const{cout<<"지우개를 챙깁니다."<<endl;}
};

class basic{
    private:
        laser la;
        notebook note;
        eraser er;
    public:
        void take() const{
            la.take();
            note.take();
            er.take();
        }
};
class teacher{
    public:
        void takebasic(const basic &ba) const{ba.take();}
};


int main(void){

    basic ba;
    teacher lee;
    lee.takebasic(ba);

    return 0;
}

결과

빔리모콘을 챙깁니다.
노트북을 챙깁니다.
지우개를 챙깁니다.

위의 코드를 살펴보면 basic이라는 객체를 생성하여 laser, eraser, notebook 객체를 멤버로 두고 캡슐화하였다. 

캡슐화를 하면 가독성도 좋아지고 코드도 간결해진다. 하지만 캡슐화는 범위를 결정하는 일이 쉽지 않기 때문에 어려운 개념이다. 

우리는 기본세팅으로 basic에 지우개, 빔리모컨, 노트북 세팅을 넣어놨지만, 다른 선생님의 기본세팅을 다를 수 있기 때문에 범위의 차이가 생길 수 있다. 따라서 캡슐화는 구현하는 프로그램의 성격과 특성에 따라서 적용하는 범위가 달라지는 정답이란 것이 딱히 없는 개념이다.