오븐 노트

[C++] 은닉성 본문

Develop/C++

[C++] 은닉성

오 븐 2022. 9. 21. 11:48
#include <iostream>
using namespace std;

// 객체지향 (OOP Object Oriented Programming)
// - 상속성
// - 은닉성 = (캡슐화)
// - 다형성

// 은닉성(Data Hiding) = 캡슐화(Encapsulation)
// 몰라도 되는 것을 숨긴다
// 숨기는 이유?
// - 1) 정말 위험하고 건드리면 안되는 경우
// - 2) 다른 경로로 접근하길 원하는 경우

// ex) 자동차
// - 핸들
// - 페달
// - 엔진
// - 문
// - 각종 전기선

// 일반 구매자 입장에서 사용하는 것?
// - 핸들/페달/문
// 몰라도 되는 부분 (오히려 건드리면 큰일남)
// - 엔진, 각종 전기선

// public(공개적) protected(보호받는) private(개인의)
// - public : 누구에게나 공개
// - protected : 나의 자손들한테만 허락
// - private : 나만 사용 << class Car 내부에서만 사용 가능

// 상속 접근 지정자 : 다음 세대한테 부모님의 유산을 어떻게 물려줄지?
// 부모님한테 물려받은 유산을 꼭 나의 자손들한테도 똑같이 물려줘야 하지는 않음
// - public : (실질적으로 거의 이것만 사용) 공개적 상속? 부모님의 설계 그대로 - (public -> public, protected -> protected)
// - protected : 보호받은 상속? 내 자손들한테만 물려줄 것. 보호 레벨을 올리는 개념 - (public -> protected, protected -> protected)
// - private : 개인적인 상속? 나까지만 사용하고 자손에게는 상속 X - (public -> private, protected -> private)
// 다만, 부모 멤버에서 private 였던 요소는 말 그대로 부모 멤버에서만 사용되므로 상속 자체가 X

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

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

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

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

class SuperCar : public Car // 상속 접근 지정자 -> public 지정 안할 시 기본값은 private
{
public:
    void PushRemoteController()
    {
        RunEngine();
    }
}

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

    // 사양 : 체력이 50 이하로 떨어지면 광폭
    // 최대한 같이 동작해야하는 로직은 하나로 묶어서 하나의 함수, 인터페이스로 만들어서 이 부분만 외부에서 사용할 수 있도록 해야함
    int SetHP(int hp)
    {
        _hp = hp;
        if (_hp <= 50)
            SetBerserkerMode();
    }

private:
    void SetBerserkerMode()
    {
        cout << "광폭" << endl;
    }

private:
    // 결과적으로 멤버 변수를 생성하는 경우, 외부에서 직접 건들게 하는 경우는 거의 없고 getter setter와 같이 함수에 접근하도록 설계하는것이 일반적이다.
    int _hp = 100;
}

int main()
{
    // SuperCar car;
    // // Car car;

    // car.DisassembleCar(); // 접근 지정 access error 
    // car.RunEngine();

    Berserker b;
    
    b.SetHP(20);

    return 0;
}

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 - 인프런 | 강의
 
C++ 카테고리의 글은 인프런 Rookiss님의 강의를 공부하며 정리하는 내용입니다.
이미 알고 있는 내용도 다시 정리 되어있을 수 있습니다.

 

모든 글은 제가 공부하기 위해 작성합니다.

'Develop > C++' 카테고리의 다른 글

[C++] 초기화 리스트  (0) 2022.10.05
[C++] 다형성 #1 ~ 2  (0) 2022.09.28
[C++] 상속성  (0) 2022.09.20
[C++] 생성자와 소멸자 #1 ~ 2  (0) 2022.09.07
[C++] 객체지향의 시작  (0) 2022.09.05