본문 바로가기

지식창고/프로그래밍

(C++)클래스의 정보은닉이란?

반응형

이번에는 c++에서 사용되는 클래스를 숨기는 정보 은닉에 대해 알아보겠습니다~~ 짝짝짝~

 

정보은닉이란 선언된 클래스 외부에서 직접적인 접근을 막는 것을 의미하는데요.

, A프로그래머가 값이 변동되지 않도록 하고 싶은 변수 a b를 사용하여 코딩을 하였는데,

B라는 프로그래머가 실수로 변수 a b의 값이 변동되었다고 가정할 때

이러한 실수로 인한 프로그래밍의 결과값 변경을 방지하고자 하여 사용 하는 것이

바로 정보 은닉이라는 개념이라고 보시면 되겠습니다.

 

더욱 쉽게 얘기를 하자면 자신이 은행에 실질적으로 입금한 금액은 100만원이라 가정하였을 때, 

타인이 실수로 접근을 하여 입금액을 70만원으로 변경되어 버렸다면 30만원이라는 적자가 생기는 실수와

같은 것을 방지할 수 있도록 도와주는 것이라고도 표현할 수 있을 것입니다.

(흠 이 예시문구 어디선가 본거 같지 않나유?... ㅎ...)

 

 직접적인 접근이 불가능 하기 때문에 각각의 변수 및 함수의 접근 허용범위를 별도로 선언하여야 합니다. 

이 때 접근할 수 있도록 도와주는 것이 바로 접근제어 지시자 라는 것이지요~

 

접근 제어지시자

public : 어디에서든 접근을 허용. (클래스 내에서만이 아닌 원하는 곳 어디에서든 접근이 가능).

private : 클래스 내(클래스 내에서 접근 허용 범위를 별도로 선언하여 접근)에서만 접근 허용.

           (요 녀석 어디선가 많이 본 놈 같쥬? ㅎ)

protected : 상속관계에 놓여있을 때, 유도클래스에서의 접근을 허용

(클래스 내부, 상속받은 클래스에서만 접근가능)

 

간단하게 이번에도 예제를 작성해 왔습니다~

 

예제)

#include <iostream>

 

using namespace std;

 

class Test

{

private:

 

public:

                  int x;

                  int y;

};

 

int main(void)

{

                  Test T;

 

                  T.x = 5;

                  T.y = 6;

 

                  cout << "T.x : " << T.x << endl;

                  cout << "T.y : " << T.y << endl;

 

                  return 0;

}

 

와 같이 x y라는 변수를 public에 두었을 때 main 함수에서 바로 직접적으로 접근하여

5 6이라는 값으로 초기화하는데 문제 없이 빌드가 된다는 점이지요.

 

이 코딩 소스를 아래와 같이 바꾸게 되면,

 

#include <iostream>

 

using namespace std;

 

class Test

{

private:

//error C2248: 'Test::x' : private 멤버('Test' 클래스에서 선언)

//액세스할  없습니다.

//'Test::x' 선언을 참조하십시오.

//'Test' 선언을 참조하십시오.

//'Test::y' : private 멤버('Test' 클래스에서 선언) 액세스할  없습니다.

//'Test::y' 선언을 참조하십시오.

//'Test' 선언을 참조하십시오.

//'Test::x' : private 멤버('Test' 클래스에서 선언) 액세스할  없습니다.

//'Test::x' 선언을 참조하십시오.

//'Test' 선언을 참조하십시오.

//'Test::y' : private 멤버('Test' 클래스에서 선언) 액세스할  없습니다.

//Test::y' 선언을 참조하십시오.

//Test' 선언을 참조하십시오.

                  int x;

                  int y;

 

public:

                 

};

 

int main(void)

{

                  Test T;

 

                  T.x = 5;

                  T.y = 6;

 

                  cout << "T.x : " << T.x << endl;

                  cout << "T.y : " << T.y << endl;

 

                  return 0;

}

라는 메시지가 주르륵 나오게 된다. 가장 쉽게 말하면 

자네는 대체 뭔데 허락지도 않은 방법으로 우리에게 접근을 시도하는가? 쓸데없이 접근하지 말라 라고

표현을 할 수 있겠습니다.

(이 문구도 어디선가... 썼던 기억이... ㅎ...)

 

이렇게 x y private로 정의를 하였을 경우에는

 

#include <iostream>

 

using namespace std;

 

class Test

{

private:

                  int x;

                  int y;

 

public:

                  void T_xy(int x1, int y1);

                  void Show_xy(void);

                 

};

 

void Test::T_xy(int x1, int y1)                                 

//같은 클래스 내의 함수를 통하여 x y 값을 인자로 받아 초기화하기 위하여.

{                                                                    

                  x = x1;

                  y = y1;

}

 

void Test::Show_xy(void)                       

//초기화된 x y 값을 출력하여 보여주기 위하여.

{

                  cout << "x  : " << x << ", y  : " << y << endl;

}

 

int main(void)

{

                  Test T;

 

 

                  T.T_xy(5, 6);

                  T.Show_xy();

                 

                  return 0;

}

 

 

와 같이 public 부분에서 private로 지정된 변수 x,y에 직접접근이 안되므로

간접적으로 우회하여 접근하기 위한 함수들을 만들어 주는 것입니다~.

 

팁.

public, private, protected를 잘 써주어야 원치 않은 외부접근으로 인해 값의 변동 등과 같은

것을 미연에 방지할 수 있다는 것~ 명심해주시구요~ ㅎ

 

다음에 또 찾아올께용~ 씨~~~ 유~~~

반응형

'지식창고 > 프로그래밍' 카테고리의 다른 글

(C++)클래스의 깊은 복사란?  (0) 2019.07.18
(C++)묵시적 변환이란?  (0) 2019.07.18
(C++)클래스의 private의 사용방법과 접근 방법  (0) 2019.07.14
(C++)this포인터란?  (0) 2019.07.09
(C++)new와 delete란?  (0) 2019.07.07