| 개념 | 설명 |
|---|---|
| 상속성(Inheritance) | 부모 클래스의 속성과 기능을 자식 클래스가 물려받는 것 |
| 은닉성(Encapsulation) | 중요한 정보를 외부로부터 숨기고, 제한된 방법으로만 접근할 수 있도록 하는 개념 |
| 다형성(Polymorphism) | 같은 이름의 함수가 다양한 객체에서 다르게 동작하도록 하는 개념 |
📌 은닉성(Encapsulation)은 데이터를 외부에서 직접 접근하지 못하도록 하고, 제한된 방법으로만 조작할 수 있도록 하는 개념입니다.
은닉성을 적용하는 이유는 크게 두 가지입니다.
1. 정말 위험하고 건드리면 안 되는 경우
SetHp()를 통해 변경하도록 강제 Car, SuperCar, Berserker 클래스)#include <iostream> // 입출력 기능 제공
using namespace std; // std:: 생략
#include <iostream> : cout, cin을 사용하기 위해 포함 using namespace std; : std::cout 대신 cout으로 사용 가능 Car 클래스 (자동차 - 은닉성 적용 예시)class Car
{
public:
void MoveHandle() {}
void PushPedal() {}
void OpenDoor() {}
void TurnKey() {
RunEngine();
}
protected:
void DisassembleCar() {} // 차를 분해한다.
void RunEngine() {} // 엔진을 구동시킨다.
void ConnectCircuit() {} // 전기선을 연결한다.
};
📌 Car 클래스 분석
public : 외부에서 접근 가능한 자동차의 기능 (MoveHandle(), PushPedal(), OpenDoor(), TurnKey())protected : 자동차 내부에서만 접근 가능한 중요한 기능 (DisassembleCar(), RunEngine(), ConnectCircuit())protected 멤버는 자식 클래스에서 접근 가능하지만, 외부에서는 접근 불가📌 🚗 Car 클래스 설계의 은닉성 적용
TurnKey()를 호출하면 내부적으로 RunEngine()이 실행됨 RunEngine()을 protected로 지정하여 외부에서 직접 호출하지 못하도록 막음 SuperCar 클래스 (상속 접근 지정자 실습)class SuperCar : private Car
{
public:
void PushRemoteController()
{
RunEngine();
}
};
📌 SuperCar 클래스 (🚗 Car 상속)
class SuperCar : private CarCar 클래스를 private으로 상속받음Car의 protected 멤버가 SuperCar 내에서 private으로 변환됨SuperCar의 자식 클래스에서는 Car의 멤버에 접근할 수 없음RunEngine()을 호출하지만, private 상속이므로 SuperCar 내부에서만 사용 가능 SuperCar의 자손 클래스는 RunEngine()을 사용할 수 없음TestSuperCar 클래스 (상속 접근 지정자 실습 2)class TestSuperCar : SuperCar
{
public:
void Test()
{
// 사용 불가능
// RunEngine(); // 에러 발생 (SuperCar가 private 상속이라 접근 불가)
}
};
📌 TestSuperCar 클래스
SuperCar를 상속받았지만 private으로 상속받았기 때문에 Car의 멤버를 사용할 수 없음 RunEngine()은 SuperCar 내에서만 사용할 수 있으므로, TestSuperCar에서는 접근 불가 Berserker 클래스 (데이터 보호 및 캡슐화 예시)class Berserker
{
public:
int GetHp() { return _hp; }
void SetHp(int hp)
{
_hp = hp;
if (_hp <= 50)
SetBerserkerMode();
}
private:
void SetBerserkerMode()
{
cout << "매우 강해짐!" << endl;
}
private:
int _hp = 100;
};
📌 🛡️ Berserker 클래스의 은닉성 적용
1. private 변수 _hp
private으로 설정 public 메서드 SetHp() SetBerserkerMode() 호출 private 메서드 SetBerserkerMode() 📌 🚀 캡슐화의 장점
SetHp()를 통해서만 _hp를 변경할 수 있어, 체력 감소 시 자동으로 SetBerserkerMode()를 실행하도록 설계할 수 있음 main() 함수 - 객체 생성 및 사용int main()
{
SuperCar car;
car.PushRemoteController(); // 엔진 가동
Berserker b;
b.SetHp(20); // 체력을 20으로 변경 → "매우 강해짐!" 출력
TestSuperCar Tcar;
// Tcar.PushRemoteController(); // 사용 불가 (private 상속)
return 0;
}
📌 출력 예시
매우 강해짐!
📌 실행 흐름
1. SuperCar 객체 생성
car.PushRemoteController(); 호출 → 내부적으로 RunEngine() 실행Berserker 객체 생성b.SetHp(20); 호출 → 체력이 50 이하가 되어 "매우 강해짐!" 출력TestSuperCar 객체 생성Tcar.PushRemoteController(); 호출 시도 → 에러 발생 (private 상속)private, protected, public 차이점| 접근 지정자 | 클래스 내부 | 자식 클래스 | 외부 |
|---|---|---|---|
public | O | O | O |
protected | O | O | X |
private | O | X | X |
📌 상속 접근 지정자
| 상속 타입 | 부모 public | 부모 protected | 부모 private |
|----------|-------------|---------------|---------------|
| public 상속 | public 유지 | protected 유지 | 접근 불가 |
| protected 상속 | protected 유지 | protected 유지 | 접근 불가 |
| private 상속 | private 변환 | private 변환 | 접근 불가 |