도순씨의 코딩일지

C++:: 정보은닉(Information Hiding) 본문

𝐏𝐑𝐎𝐆𝐑𝐀𝐌𝐌𝐈𝐍𝐆/𝐂++

C++:: 정보은닉(Information Hiding)

도순씨 2020. 8. 14. 00:00

정보은닉은 말 그대로 정보를 숨기는 것을 의미합니다. 이렇게 말하면 조금 와닿지 않는 감이 있습니다. 그래서 먼저 예제를 살펴보도록 하겠습니다.

 

⭐️ 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
using namespace std;
 
class Point{
public:
    int x; int y;
};
 
class Rectangle{
public:
    Point upLeft;
    Point lowRight;
public:
    void ShowRecInfo(){
        cout<<"좌 상단: "<<'['<<upLeft.x<<", ";
        cout<<upLeft.y<<']'<<endl;
        cout<<"우 상단: "<<'['<<lowRight.x<<", ";
        cout<<lowRight.y<<']'<<endl;
    }
};
 
int main(void){
    Point pos1 = {-24};
    Point pos2 = {59};
    Rectangle rec = {pos2, pos1};
    rec.ShowRecInfo();
    return 0;
}
cs

 

⭐️ 실행 결과

 

1
2
좌 상단: [5, 9]
우 상단: [-2, 4]
cs

 

이렇게 될 경우 다음과 같은 문제가 있습니다.

💡 점의 좌표는 0이상 100이하가 되어야 하는데, 그렇지 못한 Point 객체가 있다.

💡 직사각형을 의히마는 Rectangle 객체의 좌 상단 좌표 값이 우 하단 좌표 값보다 크다.

 

결국, 프로그래머의 실수에 대한 대책이 하나도 준비되어 있지 않은 것입니다. 때문에 제한된 방법으로의 접근만 허용을 하여 잘못된 값이 저장되지 않도록 도와주어야 합니다. 다음의 변경된 코드를 살펴보도록 합시다.

 

⭐️ Point.h

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef __POINT_H__
#define __POINT_H__
 
class Point{
private:
    int x;
    int y; 
public:
    bool InitMembers(int xpos, int ypos);
    int GetX() const;
    int GetY() const;
    bool SetX(int xpos);
    boll SetY(int ypos);
};
 
#endif
cs

멤버변수(x, y)를 private로 선언하여 임의로 변경하는 것을 막았습니다. 

 

⭐️ Point.cpp

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include "Point.h"
using namespace std;
 
bool Point::InitMembers(int xpos, int ypos) {
    if(xpos < 0 || ypos<0){
        cout << "벗어난 범위의 값 전달" << endl;
        return false;
    }
    x = xpos;
    y = ypos;
    return true;
}
 
int Point::GetX() const {
    return x;
}
 
int Point::GetY() const {
    return y;
}
 
bool Point::SetX(int xpos) {
    if(0 > xpos || xpos > 100){
        cout << "벗어난 범위의 값 전달" << endl;
        return false;
    }
    x = xpos;
    return true;
}
 
bool Point::SetY(int ypos) {
    if(0>ypos || ypos > 100){
        cout << "벗어난 범위의 값 전달"<<endl;
        return false;
    }
    y = ypos;
    return true;
}
cs

 

멤버 변수를 private로 선언하고, 해당 변수에 접근하는 함수를 별도로 정의하여, 안전한 형태로 멤버 변수의 접근을 유도하는 것을 정보은닉이라고 합니다.

 

위의 예시를 보면 함수의 이름이 GetXXX, SetXXX 형태로 된 것을 확인할 수 있는데, 이들을 액세스 함수(acess function)라고 합니다. 이들은 멤버변수를 private로 선언하면서 클래스 외부에서의 멤버변수 접근을 목적으로 정의되는 함수들입니다. 

 

또, 뒤에 const 선언이 추가되어 있는 함수들이 있습니다. 이 선언은 멤버변수에 저장된 값을 변경하지 않겠다는 선언입니다. 

 

 

 

 

 

📜 출처

윤성우(2010). 윤성우 열혈 C++ 프로그래밍. 오렌지미디어.

Comments