도순씨의 코딩일지

C++ :: 캡슐화(Encapsulation) 본문

𝐏𝐑𝐎𝐆𝐑𝐀𝐌𝐌𝐈𝐍𝐆/𝐂++

C++ :: 캡슐화(Encapsulation)

도순씨 2020. 8. 14. 12:00

캡슐화와 정보은닉은 구분하기 쉽지 않습니다. 먼저 캡슐화가 왜 중요한지 코드를 살펴보며 알아보도록 하겠습니다.

 

⭐️ Encaps1.cpp

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
using namespace std;
 
class SinivelCap{       // 콧물 처치용 캡슐
public:
    void Take() const {cout<<"콧물이 싹~ 납니다." << endl;}
};
 
class SneezeCap{        // 재채기 처치용 캡슐
public:
    void Take() constcout << "재채기가 맞습니다."<<endl; }
};
 
class SnuffleCap{       // 코막힘 처치용 캡슐
public:
    void Take() constcout << "코가 뻥 뚫립니다." << endl;}
};
 
class ColdPatient{
public:
    void TakeSinivelCap(const SinivelCap &cap) const{cap.Take();}
    void TakeSneezeCap(const SneezeCap &cap) const{cap.Take();}
    void TakeSnuffleCap(const SnuffleCap &cap) const{cap.Take();}
};
 
int main(void){
    SinivelCap scap;
    SneezeCap zcap;
    SnuffleCap ncap;
 
    ColdPatient sufferer;
    sufferer.TakeSinivelCap(scap);
    sufferer.TakeSneezeCap(zcap);
    sufferer.TakeSnuffleCap(ncap);
    return 0;
}
cs

 

⭐️ Encaps1.cpp 실행 결과

 

1
2
3
콧물이 싹~ 납니다.
재채기가 맞습니다.
코가 뻥 뚫립니다.
cs

 

만약에 다음과 같은 내용을 가정한다면, 위 코드는 캡슐화가 무너진 대표적인 사례가 됩니다.

"코감기는 항상 콧물, 재채기, 코막힘을 동반한다."

그렇다면 위의 코드에 어떻게 캡슐화를 적용할 수 있을까요? 다음 코드를 살펴보도록 합니다.

 

⭐️ Encaps2.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
using namespace std;
 
class SinivelCap{       // 콧물 처치용 캡슐
public:
    void Take() const {cout<<"콧물이 싹~ 납니다." << endl;}
};
 
class SneezeCap{        // 재채기 처치용 캡슐
public:
    void Take() constcout << "재채기가 맞습니다."<<endl; }
};
 
class SnuffleCap{       // 코막힘 처치용 캡슐
public:
    void Take() constcout << "코가 뻥 뚫립니다." << endl;}
};
 
class CONTAC600{        // 캡슐화 정의
private:
    SinivelCap sin;
    SneezeCap sne;
    SnuffleCap snu;
 
public:
    void Take() const{
        sin.Take();
        sne.Take();
        snu.Take();
    }
};
 
class ColdPatient{
public:
    void TakeCONTAC600(const CONTAC600 &cap) const {cap.Take();}
};
 
int main(void){
    CONTAC600 cap;
    ColdPatient sufferer;
    sufferer.TakeCONTAC600(cap);
    return 0;
}
cs

 

실행결과는 이전 예제와 동일하므로 생략합니다. 캡슐화를 한다고 해서 하나의 클래스로 모든 것을 구성해야하는 것은 아닙니다. 다른 클래스를 사용해도 됩니다.

 

캡슐화를 위해서 과연 CONTAC600 클래스에 기침, 몸살, 두통까지 넣어야 하는지에 대한 의문이 생길수도 있습니다. 코감기, 목감기, 몸살감기가 항상 함께 동반된다는 것은 CONTAC600 이외의 클래스가 항시 필요하다는 것을 의미합니다. 

 

캡슐화를 통해서 이전에 구조에서 단순하게 구조가 바뀌었음을 한 눈에 알 수 있습니다.

 

📜 출처

윤성우(2010). 윤성우 열혈 C++ 프로그래밍. 오렌지미디어.

Comments