Introduce
객체 지향 프로그래밍의 주요 특성 중 하나인 캡슐화(은닉성)에 대한 개념을 이해한다.
캡슐화의 특징 1
- 실제 구현 내용 일부를 내부에 감추어 은닉한다.
- 내부에 감추는 방법으로는 접근지정자를 두어 은닉의 정도를 기술하여 구현합니다. 은닉의 정도를 접근지정자로 기술하고 해당 영역에 들어가는 속성이나 메서드를 제한하면 됩니다.
C++에서 접근지정자
- private : 자기 클래스 내부의 메서드에서만 접근 허용
- protected : 자기 클래스 내부 또는 상속받은 자식 클래스에서 접근 허용
- public : 모든 접근을 허용
#include <iostream>
using namespace std;
class Car
{
public:
void MoveHandle() {}
void PushPedal() {}
void OpenDoor() {}
void TurnKey() {}
private:
void DisassembleCar() {}
void RunEngine() { cout << "Run Engine" << endl; }
};
예를들어 자동차 클래스를 만든다고 가정합시다. 운전자 입장에서 자동차에는 핸들, 문, 시동에 관련된 기능이 있어야 할 것입니다. 만약에 운전자 임의로 엔진을 건든다거나, 차를 분해한다는 것은 운전자가 전문가가 아닌이상 매우 위험한 일입니다. 이 기능들은 모두가 접근할 수 있도록 접근지정자를 public 하면 추후 예기치 못한 에러를 일으킬 수 있습니다. 그래서 접근지정자를 private로 함으로써 밑의 그림에서 Car 객체가 DisassembleCar()와 RunEngine()함수를 접근하지 못하도록 막아주는 것입니다.
하지만 private는 자기 클래스 내부에서만 사용해야하는 단점이 있습니다. 즉, 상속받은 클래스에서 부모클래스의 필요한 기능이 private로 잠겨있으면 쓰질 못할 것입니다. 이때 접근지장자 protected를 사용합니다. 다음과 같이 상속받은 SuperCar가 Car의 RunEngin() 기능을 사용할 수 있습니다.
#include <iostream>
using namespace std;
class Car
{
public:
void MoveHandle() {}
void PushPedal() {}
void OpenDoor() {}
void TurnKey() {}
protected:
void DisassembleCar() {}
void RunEngine() { cout << "Run Engine" << endl; }
};
class SuperCar : public Car{
public:
void RunController(){
RunEngine();
}
};
int main()
{
Car car;
SuperCar car1;
car1.RunController();
return 0;
}
===== 실행 결과 =====
Run Engine
캡슐화의 특징 2
- 객체의 속성(data fields)과 행위(메서드)를 하나로 묶는다.
- 속성인 데이터와 메서드의 결합은 C++의 경우 멤버함수를 호출할 때 객체의 저장공간을 멤버함수에 넘겨 데이터 처리를 하도록 하는 방법을 사용한다.
어떻게 연관된 데이터와 함수를 논리적으로 묶어놓는지 살펴봅시다.
#include <iostream>
using namespace std;
class Berserker
{
private:
int _hp = 100;
public:
int GetHp() { return _hp; }
void SetHp(int hp)
{
_hp = hp;
if (_hp < 50)
SetBerserkerMode();
}
private:
void SetBerserkerMode()
{
cout << "BerserkerMode" << endl;
}
};
int main()
{
Berserker b;
b.GetHp();
b.SetHp(20);
return 0;
}
Berserker 클래스를 만든다고 가정합시다. 일반적으로 버서커는 체력이 일정 수준이하로 떨어지면 더 강해지는 특성이 있습니다. 이를 버서커모드라고 합시다. 다른 캐릭터에 비해 체력이 떨어지는 조건에 한해 강력해지는 것이므로 임의로 체력을 조절해 체력이 떨어지지 않았는데도 강력해지면 문제가 발생할 것입니다. 즉, 체력(_hp)와 버서커모드(SetBerserkerMode)를 private로 묶음으로써, 외부에서 이와 관련된 조작을 막는것 입니다. 이렇게 되면, SetHp함수에서 체력을 조정해야만 버서커모드를 활성화할 수 있습니다.
'Language > C++' 카테고리의 다른 글
[C++] OOP(객체지향)의 특성 - 멤버변수 초기화 (0) | 2022.06.06 |
---|---|
[C++] OOP(객체지향)의 특성 - 다형성(polymorphism) (0) | 2022.06.06 |
[C++] OOP(객체지향)의 특성 - 상속성(inheritance) (0) | 2022.06.06 |
[C++] OOP(객체지향)의 개념 (0) | 2022.06.06 |
[C++] 참조 (0) | 2022.06.05 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!