일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- LG
- AI
- LLM
- PCA
- 회귀
- 분류
- Classification
- 지도학습
- GPT-4
- 딥러닝
- deep learning
- 해커톤
- Machine Learning
- 머신러닝
- OpenAI
- supervised learning
- regression
- gpt
- LG Aimers 4th
- 티스토리챌린지
- 오블완
- ChatGPT
- LG Aimers
Archives
- Today
- Total
SYDev
C++ Chapter 04-2: 캡슐화(Encapsulation) 본문
캡슐화의 이해
지난 글에서 좋은 클래스를 만들기 위한 조건으로 '정보은닉'과 '캡슐화'에 대해서 언급했을 것이다. 정보은닉에 대해서는 설명했으니 이번에는 캡슐화에 대해서 공부해보자.캡슐화는 간단하게 말해서 하나의 목적 하에 둘 이상의 기능을 모아서 그 목적을 달성하게 하는 것이다.
다음 예제는 캡슐화가 이루어지지 못한 사례이다.
#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;
}
콧물이 낫습니다.
재채기가 멎습니다.
코가 뚫립니다.
여기서 "코감기는 항상 콧물, 재채기, 코막힘을 동반한다."라고 가정해버리면, 캡슐화가 무너진 대표적인 사례가 된다. 위 예제에서는 복용의 과정이 너무 복잡하다는 문제를 가지고 있다. 이런 문제를 해결하기 위해서 복용 과정을 하나로 묶는 절차가 필요한데 이것이 캡슐화이다.
또한, 여기에 "약의 복용은 반드시 SinivelCap, SneezeCap, SnuffleCap 순으로 이뤄져야 한다."라는 가정이 추가된다면 객체의 활용이 상당히 어려워진다. 때문에 이런 클래스들의 상호관계 복잡도를 줄이기 위해서 캡슐화가 필요하다.
그렇다면, 이번에는 위 예제에 캡슐화를 진행해보자.
#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 Contact600
{
private:
SinivelCap sin;
SneezeCap sne;
SnuffleCap snu;
public:
void Take() const
{
sin.Take();
sne.Take();
snu.Take();
}
};
class ColdPatient
{
public:
void TakeCONTACT600(const Contact600 &cap) const {cap.Take();}
};
int main(void)
{
Contact600 cap;
ColdPatient sufferer;
sufferer.TakeCONTACT600(cap);
return 0;
}
콧물이 낫습니다.
재채기가 멎습니다.
코가 뚫립니다.
마지막으로 우리는 이러한 상황을 가정할 수 있다. "감기는 콧물, 재채기, 코막힘을 동반할 수도 있고 개별적으로 진행되기도 한다." 그렇다면 이때는 콧물약, 재채기약, 코막힘약이 별개로 존재하는 것이 답일 수도 있고 종합감기약이 답일 수도 있다. 이 경우에는 답이 없기 때문에 클래스를 캡슐화시키는 것은 다양한 사례를 접하면서 감을 익혀야 한다.
출처 : 윤성우, <윤성우의 열혈 C++ 프로그래밍>, 오렌지미디어, 2010.05.12
'Programming Lang > C++' 카테고리의 다른 글
C++ Chapter 04-2 : 캡슐화(Encapsulation) 문제풀이 (0) | 2023.07.15 |
---|---|
C++ Chapter 04-2 : 캡슐화(Encapsulation) 문제풀이 (0) | 2023.07.15 |
C++ Chapter 04-1 : 정보은닉(Information Hiding) (0) | 2023.07.15 |
C++ Chapter 03-2 : 객체지향 프로그래밍의 이해 (0) | 2023.07.13 |
C++ Chapter 03-2 : 클래스(Class)와 객체(Object)(3) (0) | 2023.07.13 |