본문 바로가기

C++

[C++] 정보은닉과 캡슐화

정보은닉

보통 클래스의 멤버변수는 private으로 선언하는 경우가 많다.

public으로 선언하여 어디서든 접근하면 편리하지 않을까? 하는 생각이 들겠지만, public으로 모든 변수를 선언하게 되면 실수나 예외상황에 대처하기가 어려울 수 있다.



예를 들어 프로그램을 작성할 때 포인트의 범위가 0이상으로 정의되어있다고 하자.

이를 모르는 사람은 실수로 음수를 입력할 수도 있다.

멤버변수를 모두 private 선언하여 접근하지 못하게 하고, SetX, SetY 함수로 접근하도록 유도하면

아래와 같이 프로그램 내에서 음수를 입력했을 경우 예외를 처리할 수 있다.



Point.h

class Point
{
private:
	int xpos;
	int ypos;
public:
	int GetX() const;
	int GetY() const;
	bool SetX(int x);
	bool SetY(int y);
};


Point.cpp

#include "Point.h"

int Point::GetX() const {
	return xpos;
}
int Point::GetY() const {
	return ypos;
}
bool Point::SetX(int x) {
	if (x < 0) return false;

	xpos = x;
	return true;
}
bool Point::SetY(int y) {
	if (y < 0) return false;

	ypos = y;
	return true;
}



액세스 함수

위에서 작성된 GetX(), GetY, SetX(int x), SetY(int y)는 액세스 함수라고 한다.

이들은 멤버변수를 private으로 선언하면서 클래스 외부에서의 멤버변수 접근을 목적으로 정의되는 함수들이다.



const

앞 예제를 보면 GetX(), GetY()에 const 선언이 추가되어 있다.

함수에 const를 선언하면, 그 함수 내에서는 멤버변수에 저장된 값을 변경하는 것이 불가능하다.

또한 const함수 내에서는 const함수만 호출이 가능하므로, 변수에 저장된 값을 변경하지 못하도록 할 때 사용하면 코드의 안정성이 높아질 수 있다.



캡슐화란?

1. 객체 내부의 성질을 객체 외부에서 직접 관여하지 못하게 하는 것이다.

2. 관련있는 데이터와 함수를 하나의 클래스 안에 묶는 것이다.


1번의 의미로 캡슐화는, 위의 get, set을 정의한 것을 예로 볼 수 있다.


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

[C++] 문자열, 입력  (0) 2019.03.18
[C++] 생성자와 소멸자  (0) 2019.03.13
[C++] 객체지향 프로그래밍  (0) 2019.03.13
[C++] 클래스  (0) 2019.03.08
[C++] 구조체  (0) 2019.03.08