LANG/C++

[C++]04-1.정보은닉(Information Hiding)

혀니리리 2023. 5. 12. 16:06
728x90

if) 좌상단 좌표값 하나 (0 이상 100 이하), 우하단 좌표값 하나(0 이상 100 이하)를 받아서 직사각형을 정의하는 class를 만드는 경우

->1 ) 좌표값은 0 ~ 100을 벗어나선 안되며 2) 좌상단 좌표 < 우하단 좌표여야 함.

이것이 벗어나면 오류를 나타내야 함

정보은닉이 필요한 이유 : 1) 제한된 방법으로의 접근만 허용해서 잘못된 값이 저장되지 않도록 도와야 하고

                                         2)실수했을 때 실수가 쉽게 발견되도록 해야 함

like this

//Point.h
class Point
{
private:
	int x;
    int y;
...
}

//Point.cpp
bool Point::InitMembers(int xpos, int ypos)
{
	if(xpos < 0 || ypos < 0)
    {
    	cout << "벗어난 범위의 값 전달" <<endl;
        return false;
    }
    x = xpos;
    y = ypos;
    return true;
}

private으로 정보은닉, 범위를 벗어나면 에러 출력 

"멤버 변수를 private로 선언, 해당 변수에 접근하는 함수를 별도로 정의해서 안전한 형태로 멤버변수의 접근을 유도하는 것이 '정보 은닉' => 좋은 클래스가 되기 위한 기본조건!"

 

* 액세스 함수(Access function)

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;
}

GetXXX, SetXXX

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

호출하지 않아도 정의하는 이유: 지금 당장은 필요하지 않지만 필요할 수 있다고 판단되므로

 

*const함수

int GetX() const;

int GetY() const;

void ShowRecInfo() const;

 

"이 함수 내에서는 멤버변수에 저장된 값을 변경하지 않겠다!"

실수로 자신의 의도와 다르게 멤버변수의 값을 변경했을 때 컴파일 에러를 통해 이를 확인 가능

프로그래머의 실수를 최소화하기 위한 매우 의미있는 선언.

 

class EashClass
{
private:
	int num;
public:
	void InitNum(int n)
    {
    	num = n;
	}
    int GetNum() const!!!!!!!!!!!!!!!!!!!!!!!
    {
    	return num;
    }
}

class LiveClass
{
private:
	int num;
public:
	void InitNum(const EasyClass &easy)
    {
    	num = easy.GetNum(); //위에 const가 있어야 컴파일 에러 안뜸.
	}
}

"const 함수 내에서는 const가 아닌 함수의 호출이 제한됨"

그만큼 코드의 안정성을 높일 수 있음.

728x90