본문 바로가기

컴퓨터

4-1. 정보 은닉(Information Hiding)

정보 은닉(Information Hiding)의 필요성

#include <iostream>
using std::cout;
using std::endl;
using std::cin;

class Point {
public:
	int x; //x 좌표의 범위: 0~100
	int y; //y 좌표의 범위: 0~100
};

int main(void) {
	int x, y;
	cout << "좌표 입력: ";
	cin >> x >> y;

	Point p;
	p.x = x; //문제의 원인, 멤버 변수의 외부 접근을 허용
	p.y = y; //문제의 원인

	cout << "입력된 데이터를 이용해서 그림을 그림" << endl;
	return 0;
}

위의 코드는 실행하는 데에는 문제가 없다. 다만 Point 클래스의 x, y 멤버 변수의 범위에 맞지 않은 값을 외부 접근으로 정의할 수 있다는 것이 문제이다.

이런 실수를 막기 위해 객체의 외부에서 객체 내에 존재하는 멤버 변수(정보)에 직접 접근하는 것을 허용하지 아는 것이 바로 정보 은닉이다.

정보 은닉의 적용

모든 멤버 변수를 private으로 선언하면 외부에서의 직접 접근을 막을 수 있다. 단, 외부에서 멤버 변수에 간접적으로 접근할 수 있는 멤버 함수를 추가로 제공해야 할 것이다.

#include <iostream>
using std::cout;
using std::endl;
using std::cin;

class Point {
	int x; //x 좌표의 범위: 0~100
	int y; //y 좌표의 범위: 0~100
public:
	int GetX() { return x; }
	int GetY() { return y; }

	void SetX(int _x); //void SetX(int);
	void SetY(int _y); //void SetY(int);
};

void Point::SetX(int _x) {
	if (_x < 0 || _x>100) { //경계 검사
		cout << "x 좌표 입력 오류, 확인 요망" << endl;
		return;
	}
	x = _x;
}

void Point::SetY(int _y) {
	if (_y < 0 || _y>100) { //경계 검사
		cout << "y 좌표 입력 오류, 확인 요망" << endl;
		return;
	}
	y = _y;
}

int main(void) {
	int x, y;
	cout << "좌표 입력: ";
	cin >> x >> y;

	Point p;
	p.SetX(x);
	p.SetY(y);

	cout << "입력된 데이터를 이용해서 그림을 그림" << endl;
	return 0;
}

7: 멤버 변수의 선언이 시작되는 7번째 줄을 보면 아무런 선언도 존재하지 않는다.(private인지 public인지). 이런 경우 기본적으로(Default로) private으로 인식을 한다. 그런데 만약 6번째 줄에 있는 선언이 class가 아니라 struct 였다면 기본적으로(Default로) public 멤버가 된다. 이것이 바로 C++에서의 class와 struct의 유일한 차이점이다.

10~31: 멤버 변수 x와 y에 접근할 수 있는 함수들을 정의하고 있다. public 멤버이므로 외부에서 접근이 가능할 뿐만 아니라, Point 클래스의 멤버 변수 x, y에도 접근이 간으하다. 즉 클래스 외부에서는 이 함수들을 이용해서 멤버 변수 x, y에 간접적인 접근이 가능해진다. 함수를 통한 간접 접근의 경우 이렇게 경계 검사에 관련된 코드를 삽입할 수 있다.

멤버 함수의 정의를 클래스 외부로 빼낼 경우, 클래스 내에 존재하는 멤버 함수의 선언에서는 매개 변수의 타입과 개수에 대한 정보만 담고 있어도 된다. 즉 13~14 줄을 void SetX(int); void SetY(int); 로 선언해도 무방하다.

멤버 함수의 이름 중에서 Get 혹은 Set으로 시작되는 함수들은 대부분 멤버 변수의 접근을 위한 것이다. 이러한 함수들을 가리켜 보통은 액세스(access) 메소드(함수)라고 부른다.

 

'컴퓨터' 카테고리의 다른 글

4-4 클래스와 배열  (0) 2019.04.10
4-2. 캡슐화(Encapsulation)  (0) 2019.04.09
3-4 멤버 함수의 외부 정의  (0) 2019.04.07
3-3. 클래스 멤버의 접근 제어  (0) 2019.04.07
3-2. 클래스와 객체  (0) 2019.04.07