은닉성

 

인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다. 
😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기!

 

 


 

은닉성


-  은닉성 (Data Hiding)  = 캡슐화 (Encapsulation)
-  몰라도 되는 것은 깔끔하게 숨기겠다!

-  숨기는 이유?

  1.   정말 위험하고 건드리면 안되는 경우
  2.   다른 경로로 접근하길 원하는 경우

 

자동차 예시
- 핸들

- 페달

- 엔진

- 문

- 각종 전기선

-  일반 구매자 입장에서 사용하는 것?

  • 핸들 / 페달 / 문

-  몰라도 되는 부품은? (오히려 건드리면 큰일남)

  • - 엔진, 각종 전기선

 

public / protected / private

-  public : 누구한테나 공개. 실컷 사용하세요~~

-  protected : 나의 자손들한테만 허락

-  private : 나만 사용할꺼야! << class Car 내부에서만!

-  상속 접근 지정자 

  • 다음 세대한테 부모님의 유산을 어떻게 물려줄지?
  • 부모님한테 물려받은 유산을 꼭 나의 자손들한테도 똑같이 물려줘야 하진 않음
    • -  public : 공개적 상속? 부모님의 유산 설계 그대로~
      • public -> public, protected -> protected
    • -  protected : 보호받은 상속? 내 자손들한테만 물려줄거야.
      • public -> protected, protected -> protected
    • -  private : 개인적인 상속? 나까지만 잘 쓰고 자손들한테는 아예 안 물려줄거야~
      • public -> private, protected -> private
    • 거의 public만 쓴다. 아무것도 쓰지 않으면 private과 같다.

 


 

코드

 

#include <iostream>
using namespace std;

class Car {
public: // (멤버) 접근 지정자
    void MoveHandle() {}
    void PushPedal() {}
    void OpenDoor() {}

    void TurnKey()
    {
        // ....
        RunEngine();
    }

protected:
    void DisassembleCar() {}  // 차를 분해한다
    void RunEngine() {}      // 엔진을 구동시킨다
    void ConnectCircuit() {} // 전기선 연결

public:
    // 핸들
    // 페달
    // 엔진
    // 문
    // 각종 전기선
};

class SuperCar : private Car  // 상속 접근 지정자
{
public:
    void PushRemoteController()
    {
        RunEngine();
    }
};

class TestSuperCar : private SuperCar   // public SuperCar이라고 작성을 안 하고 SuperCar이라고 작성하면 private으로 인식한다. 생략시 private으로 인식. 
{
public:
    void Test()
    {
    //    DisassembleCar(); // 사용불가능. SuperCar에서 private으로 상속 받아서 DisassembleCar를 불러올 수 없다
    }
};

// '캡슐화'
// 연관된 데이터와 함수를 논리적으로 묶어놓은 것
class Berserker
{
public:
    
    int GetHp() { return _hp; }

    // 사양 : 체력이 50 이하로 떨어지면 버서커 모드 발동 (강해짐)
    void SetHp(int hp)
    {
        _hp = hp;
        if (_hp <= 50)
            SetBerserkerMode();
    }

private:
    void SetBerserkerMode()
    {
        cout << "매우 강해짐!" << endl;
    }

private: 
    int _hp = 100;
};

int main()
{
    SuperCar car;
    car.PushRemoteController();

    Berserker b;
    b.SetHp(20);

    TestSuperCar Tcar;
    Tcar.PushRemoteController();

    return 0;
}