본문 바로가기

프로그래밍 언어/열혈 C++

Chapter 04-1 정보은닉 by 윤성우의 열혈 C++

프로그래머의 실수에 대한 대책을 마련해야 한다.

변수값을 제한된 방법으로만 저장 혹은 변경할 수 있도록 하고 실수를 한다면 실수를 쉽게 발견하도록 해야한다.

따라서 변수에 직접적인 접근을 막고 함수로 접근시킬 필요가 있다.

 

멤버변수를 private로 선언을 하고 변수에 접근하는 함수를 public으로 선언해서 제한된 방법으로 접근하게끔 하는 것이 정보은닉이다.

 

  • Point.h
#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);
    bool SetY(int ypos);
};

#endif // __POINT_H__

int GetX() const; 를 보면 함수 뒤에 const 선언이 있는데 이는

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

라는 의미이다. 멤버변수를 변경하는 코드를 작성하면 컴파일 에러가 발생한다.

  • 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;
    return true;
}

int Point::GetX() 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;
}

 

  • main.cpp
#include <iostream>
#include "Point.h"

using namespace std;

int main()
{
    Point mypos;
    mypos.InitMembers(30, 40);
    cout << mypos.GetX() << endl;
    cout << mypos.GetY() << endl;

    mypos.SetX(90);
    cout << mypos.GetX() << endl;
    return 0;
}