전체 코드


✅ 1. 객체지향 프로그래밍(OOP)의 3대 특성

💡 OOP의 핵심 개념

개념설명
상속성(Inheritance)부모 클래스의 속성과 기능을 자식 클래스가 물려받는 것
은닉성(Encapsulation)중요한 정보를 외부로부터 숨기고, 제한된 방법으로만 접근할 수 있도록 하는 개념
다형성(Polymorphism)같은 이름의 함수가 다양한 객체에서 다르게 동작하도록 하는 개념

📌 은닉성(Encapsulation)은 데이터를 외부에서 직접 접근하지 못하도록 하고, 제한된 방법으로만 조작할 수 있도록 하는 개념입니다.


📌 2. 은닉성이 중요한 이유

은닉성을 적용하는 이유는 크게 두 가지입니다.
1. 정말 위험하고 건드리면 안 되는 경우

  • 예) 자동차 엔진, 전기선 → 일반 사용자가 직접 조작하면 위험
  1. 특정한 방식으로만 접근하게 만들고 싶은 경우
    • 예) 캐릭터의 HP를 SetHp()를 통해 변경하도록 강제

📌 3. 코드 분석 (Car, SuperCar, Berserker 클래스)

✅ 3.1 헤더 포함 및 네임스페이스 설정

#include <iostream>  // 입출력 기능 제공
using namespace std; // std:: 생략
  • #include <iostream> : cout, cin을 사용하기 위해 포함
  • using namespace std; : std::cout 대신 cout으로 사용 가능

✅ 3.2 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로 지정하여 외부에서 직접 호출하지 못하도록 막음
  • 엔진, 전기선 등을 직접 조작할 수 없도록 하여 안전성을 높임

✅ 3.3 SuperCar 클래스 (상속 접근 지정자 실습)

class SuperCar : private Car
{
public:
    void PushRemoteController()
    {
        RunEngine();
    }
};

📌 SuperCar 클래스 (🚗 Car 상속)

  • class SuperCar : private Car
    • Car 클래스를 private으로 상속받음
    • Carprotected 멤버가 SuperCar 내에서 private으로 변환됨
    • 즉, SuperCar의 자식 클래스에서는 Car의 멤버에 접근할 수 없음
  • PushRemoteController()
    • RunEngine()을 호출하지만, private 상속이므로 SuperCar 내부에서만 사용 가능
    • SuperCar의 자손 클래스는 RunEngine()을 사용할 수 없음

✅ 3.4 TestSuperCar 클래스 (상속 접근 지정자 실습 2)

class TestSuperCar : SuperCar
{
public:
    void Test()
    {
        // 사용 불가능
        // RunEngine(); // 에러 발생 (SuperCar가 private 상속이라 접근 불가)
    }
};

📌 TestSuperCar 클래스

  • SuperCar를 상속받았지만 private으로 상속받았기 때문에 Car의 멤버를 사용할 수 없음
  • RunEngine()SuperCar 내에서만 사용할 수 있으므로, TestSuperCar에서는 접근 불가

✅ 3.5 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으로 설정
  1. public 메서드 SetHp()
    • 체력을 변경하는 유일한 경로
    • 체력이 50 이하로 떨어지면 자동으로 SetBerserkerMode() 호출
  2. private 메서드 SetBerserkerMode()
    • 체력이 낮아졌을 때만 발동하도록 제한

📌 🚀 캡슐화의 장점

  • SetHp()를 통해서만 _hp를 변경할 수 있어, 체력 감소 시 자동으로 SetBerserkerMode()를 실행하도록 설계할 수 있음
  • 데이터를 보호하고, 특정 조건에서만 기능이 실행되도록 할 수 있음

📌 4. 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() 실행
  1. Berserker 객체 생성
    • b.SetHp(20); 호출 → 체력이 50 이하가 되어 "매우 강해짐!" 출력
  2. TestSuperCar 객체 생성
    • Tcar.PushRemoteController(); 호출 시도 → 에러 발생 (private 상속)

📌 5. private, protected, public 차이점

접근 지정자클래스 내부자식 클래스외부
publicOOO
protectedOOX
privateOXX

📌 상속 접근 지정자
| 상속 타입 | 부모 public | 부모 protected | 부모 private |
|----------|-------------|---------------|---------------|
| public 상속 | public 유지 | protected 유지 | 접근 불가 |
| protected 상속 | protected 유지 | protected 유지 | 접근 불가 |
| private 상속 | private 변환 | private 변환 | 접근 불가 |


profile
李家네_공부방

0개의 댓글