참조: 윤성우의 열혈 c++
#include <iostream>
using namespace std;
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.x << ",";
cout << lowRight.y << ']' << endl;
}
};
int main(void)
{
Point pos1 = {-2, 4};
Point pos2 = {5, 9};
Rectangle rec = {pos2, pos1};
rec.ShowRecInfo();
return 0;
}
문제 발생
따라서, 제한된 방법으로의 접근만 허용해서 잘못된 값이 저장되지 않도록 해야한다.
해결 방법
따라서, 멤버변수를 private으로 선언하고 해당변수에 접근하는 함수를 별도로 정의해서 안전한 형태로 멤버변수의 접근을 유도하는것이 바로 '정보은닉'이다.
<Point.h>
#include <iostream>
using namespace std;
class Point
{
private:
int x;
int y;
public:
bool InitMembers(int xpos, int ypos);
int GetX() const;
int GetY() const;
bool SetX(int xpos);
bool SetY(int ypos);
};
<Point.cpp>
#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;
}
// Get 함수는 '반환' Set 함수는 '저장'
int Point :: GetX() const //const 함수
{
return x;
}
int Point :: GetY() const
{
return y;
}
bool Point:: SetX(int xpos)
{
if(xpos<0 || xpos > 100)
{
cout << "잘못된 값 전달" << endl;
return false;
}
x= xpos;
return true;
}
bool Point:: SetY(int ypos)
{
if(ypos<0 || ypos>100)
{
cout << "잘못된 값 전달" << endl;
return false;
}
y=ypos;
return true;
}
Rectangle Class
<Rectangle.h>
#include "Point.h"
class Rectangle
{
private:
Point upLeft;
Point lowRight;
public:
bool InitMembers(const Point &ul, const Point &r);
void ShowRecInfo() const;
};
<Rectangle.cpp>
#include <iostream>
#include "rectangle.h"
using namespace std;
bool Rectangle::InitMembers(const Point &ul, const Point &lr)
{
if (ul.GetX() > lr.GetX() || ul.GetY() > lr.GetY())
{
cout << "잘못된 위치정보 전달" << endl;
return false;
}
upLeft = ul;
lowRight = lr;
return true;
}
void Rectangle::ShowRecInfo() const
{
cout << "좌 상단: " << '[' << upLeft.GetX() << ",";
cout << upLeft.GetY() << ']' << endl;
cout << "우 하단: " << '[' << lowRight.GetX() << ",";
cout << lowRight.GetY() << ']' << endl;
}
const 함수