
콘택600을 아시나요?
콘택600이라는 코과 관련 있는 증상의 감기약이 있다. 콘택600을 예로 들면서 캡슐화를 설명해보겠다.
콘택600에 숨겨져 있는 캡슐화와 캡슐화의 중요성
콘택600이 복용자에게 제공되는 기능은 "재채기, 콧물, 코막힘"의 완화이다. 그런데 이러한 콘택600이 재채기용 캡슐, 콧물용 캡슐, 그리고 코막힘용 캡슐로 나눠져 있다면, 그래서 코감기에 걸렸을 때, 총 세알의 캡슐을 복용해야 한다면, 이는 캡슐화가 성립되지 않는 상황이다.
캡슐화가 중요한 이유에 대해 다음 예제를 통해 살펴보자.
Encaps1.cpp
#include <iostream>
using namespace std;
class SinivelCap // 콧물 처치용 캡슐
{
public:
void Take() const {cout<<"콧물이 싹~ 납니다."<<endl;}
};
class SneezeCap // 재치기 처치용 캡슐
{
public:
void Take() const {cout<<"재치기가 맞습니다."<<endl;}
};
class SnuffleCap // 코막힘 처치용 캡슐
{
public:
void Take() const {cout<<"코가 뻥 뚫립니다."<<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;
}
콧물이 싹~ 납니다.
재치기가 맞습니다.
코가 뻥 뚫립니다.
위의 예제를 보면 복용의 절차가 너무 복잡하다. 코감기는 콧물, 재치기, 코막힘을 동반하므로
sufferer.TakeSinivelCap(scap);
sufferer.TakeSneezeCap(zcap);
sufferer.TakeSnuffleCap(ncap);
를 모두 항상 거쳐야만 한다. 그런데 이를 콘택600처럼 하나의 캡슐로 만들어 놓았다면(캡슐화 해 놓았다면), 위와 같은 복용과정이 간소화된다.
콘택600의 구현을 통한 캡슐화의 정확한 이해
Encaps2.cpp
#include <iostream>
using namespace std;
class SinivelCap // 콧물 처치용 캡슐
{
public:
void Take() const {cout<<"콧물이 싹~ 납니다."<<endl;}
};
class SneezeCap // 재치기 처치용 캡슐
{
public:
void Take() const {cout<<"재치기가 맞습니다."<<endl;}
};
class SnuffleCap // 코막힘 처치용 캡슐
{
public:
void Take() const {cout<<"코가 뻥 뚫립니다."<<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;
}
콧물이 싹~ 납니다.
재치기가 맞습니다.
코가 뻥 뚫립니다.
위 예제를 보면 CONTAC600이라는 클래스로 캡슐화를 한 모습을 볼 수 있다.
SinivelCap sin;
SneezeCap sne;
SnuffleCap snu;
앞서 정의한 클래스 3개를 멤버변수 형태로 포함하고 코감기와 관련있는 것을 하나의 클래스로 묶었다.
void Take() const
{
sin.Take();
sne.Take();
snu.Take();
}
묶음으로 인해서 복잡한 복용의 방법을 약 복용자에게 노출시킬 필요가 없게 되었다.
public:
void TakeCONTAC600(const
CONTAC600 &cap) const { cap.Take(); }
콘택600을 복용하는데에 있어 Take 함수 호출만 하면 된다.
이 예제와 같이 CONTAC600이 잘 캡슐화가 되었다면(코감기와 관련된 모든 것들이 다 저장되어있다 하면), CONTAC600의 어떠한 변화도 ColdPatient에 영향을 미치지 않는다.