본문 바로가기

C++/윤성우의 열혈 프로그래밍 C++

윤성우의 열혈 C++ chpt5.

정보 은닉의 이해

class point
{
public:
    int x;	// x좌표의 범위는 0 이상 100 이하
    int y;	// y좌표의 범위는 0 이상 100 이하
    // 정보 은닉 실패
};

class Rectangle
{
public:
    Point upLeft;
    Point lowRight;
    // 정보 은닉 실패
public:
    void ShowRecInfo()
    {
        cout << "좌 상단: " << '[' << upLeft.x << ", ";
        cout << upLeft.y << ']' << endl;
        cout << "우 하단: " << '[' << lowRight << ", ";
        cout << lowRight.y << ']' << endl << endl;
    }
};

int main(void)
{
    Point pos1 = {-2, 4};
    Point pos2 = {5, 9};

    Rectangle rec = {pos1, pos2};
    red.ShowRecInfo();

    return 0;
}

예제에서 보이듯이 멤버변수의 외부접근을 허용하면, 잘못된 값이 저장되는 문제가 발생할 수 있다. 

따라서 멤버변수의 외부접근을 막게 되는데, 이를 가리켜 '정보은닉'이라 한다.

 

Point의 멤버변수에는 0~100 이외의 값이 들어오는 것을 막는 장치가 없고,

Rectangle의 멤버변수에는 좌우 정보가 뒤바뀌어 저장되는 것을 막을 장치가 없다.

 

 

Redtangle 객체의 이해

 

Point 클래스의 정보은닉 결과

 

Rectangle 클래스의 정보은닉 결과

 

 

 

const 함수

// 멤버 함수의 const 선언
int GetX() const;
itn GetY() const;
void ShowRecInfo() cpnst;
// const 함수 내에서는 동일 클래스에 선언된 멤버변수의 값을 변경하지 못한다.

int GetNum()
{
    return num;
}
void ShowNum() const
{
    cout << GetNum() << endl;	// 컴파일 에러 발생
    // const 함수는 const 가 아닌 함수를 호출하지 못한다.
    // 간접적인 멤버의 변경 가능성까지 완전히 차단
}

void InitNum(const EasyClass &easy)
{
    num = easy.GetNum();	// 컴파일 에러 발생
    // const 상수화 된 객체를 대상으로는 const 멤버함수만 호출이 가능하다.
}

 


콘택 600 과 캡슐화

class SinivelCap	// 콧물 처치용 캡슐
{
public:
    void Take() const { cout << "콧물이 싹~ 납니다." << endl; }
};

class SneezeCap		// 재채기 처치용 캡슐
{
public:
    void Take() const { cout << "재채기가 멎습니다." << endl; }
};

class SnuffleCap	// 코막힘 처치용 캡슐
{
public:
    void Take() const { cout << "코가 뻥 뚫립니다." << endl; }
};
// 약의 복용순서가 정해져 있다고 한다면, 캡슐화가 매우 필요한 상황이 된다!

콘택 600을 표현한 클래스들...  코감기는 항상 콧물, 재채기, 코막힘을 동반한다고 가정하면 캡슐화 실패!

 

캡슐화란 관련 있는 모든 것을 하나의 클래스 안에 묶어 두는 것!

Private 설정된 멤버등에 직접적인 접근을 차단하고, 다른 Public 메서드(멤버함수)를 통해 우회해서 접근하게 하는 것

 

 

 

캡슐화 된 콘택600

class CONTAC600
{
private:
    SinivelCap sin;
    SneezeCap sne;
    SnuffleCap snu;
    // 코감기와 관련 있는 것을 하나의 클래스로 묶음
public:
    void Take() const
    {
        sin.Take();
        sne.Take();
        snu.Take();
    }
    // 묶음으로 인해서 복잡한 복용의 방법을 약 복용자에게 노출시킬 필요가 없게 되었음
};

class ColdPatient
{
public:
    void TakeCONTAC600(const CONTAC600 &cap) const { cap.Take(); }
};

 

'C++ > 윤성우의 열혈 프로그래밍 C++' 카테고리의 다른 글

윤성우의 열혈 C++ chpt7.  (0) 2025.06.26
윤성우의 열혈 C++ chpt6.  (2) 2025.06.08
윤성우의 열혈 C++ chpt4.  (0) 2025.05.12
윤성우의 열혈 C++ chpt3.  (0) 2025.05.12
윤성우의 열혈 C++ chpt2.  (0) 2025.05.11