728x90



정보 은닉(Data Hiding)은 말그대로 정보를 숨긴다는 의미입니다. 

자동차의 타이어를 만드는 공장에서 핸들이 어떤 기술을 사용해서 만들어지는지 몰라도 된다는 것입니다.


객체로 말하면 다른 객체가 어떻게 구현되었는지 몰라도 된다는 것


좀 더 능동적으로 보자면 다른 객체의 내부 구현을 몰라도 된다는 것에 그치는것이 아니라. 다른 객체의 내부 구현을 반드시 몰라야 한다고 강요하는것입니다. 그래서 정보 무관심이 아니라 정보 은닉 이라고 합니다.



객체 A는 내부적인 사정으로 인해서 객체 B에게 본래 100바이트를 넘겨주는것이 약속이었지만 108바이트를 넘겨 주고 있었다.


객체 B는 객체 A에 대해서 여분의 8바이트가 더 오는것을 확인하고 계속해서 108바이트를 사용했다.


객체 A는 소스 코드를 수정하여 다시 100바이트를 넘겨 주었다.


객체 B는 여분의 8바이트가 사라져버려서 문제를 일으키게 된다.


이것이 바로 정보 은닉의 필요성입니다. 객체 B가 객체 A에대해 약속한 범위를 넘어서 버리는 오히려 아는것이 더 많아서 다쳐버렸습니다.


결국 정보 은닉은 서로 약속되어 있는 부분이 아니라면 보여주지도 말고 보지도 말자 라는 것입니다.


캡슐화(Encapsulation)은 텔레비젼 속에는 많은 전기 장치들이 들어있지만 케이스로 둘러 쌓여있어 보이지 않습니다.

보이는 것은 화면과 단추 뿐입니다. (여기서 화면과 단추는 텔레비전과 사용자간의 약속입니다.)


이렇게 약속된 부분을 제외한 나머지 부분을 감싸서 숨겨버리는 것을 캡슐화라고 합니다.


캡슐화를 사용해서 정보 은닉을 달성할수 있고. 객체간에 약속한 부분만이 드러나고 나머지 부분은 캡슐로 감싸서 다른 객체가 볼 수 없게 만드는 것입니다.


하지만 C++에서는 정보 은닉이나 캡슐화에 1:1로 매치되는 기능은 가지고 있지 않습니다.

하지만 클래스에 멤버 변수나 함수를 정의하면서 그 멤버를 외부에 보이게 할지 여부를 지정할 수 있습니다.

다른 객체와 약속된 부분이라면 외부에 보이게 저장하고, 아니라면 외부에 보이지 않게 지정하면 됩니다.


이렇게 함으로써 정보 은닉이나 캡슐화가 지향하는 목표를 상당부분 달성 할 수 있습니다.




728x90
Posted by 정망스
,
728x90

C++에서 기본적으로 제공되는 표준 라이브러리에는.. 아래 모양처럼 헤더파일을 추가합니다.


#include <iostream>

#include <string>

#include <cmath>

.

.

.




저희가 직접 만드는 헤더 파일은 아래와 같이 헤더파일 추가합니다.


#include "make.h"


차이점이 보이시나요..? 바로 <> " "의 차이입니다.


이 두 가지의 차이점은 헤더 파일을 찾는 위치에 있습니다.


<> : 표준 라이브러리의 헤더파일이 위치한 폴더에서 파일을 찾는다.

(비쥬얼 스튜디오를 사용하는 경우에는 비쥬얼 스튜디오를 설치한 폴더 안에 헤더 파일들이 위치한 폴더가 존재하는데 <>는 이곳에서 헤더 파일을 찾게 됩니다.)


" " : 현재 소스 파일이 있는 위치에서 찾는다.

(make.cpp에서 " "로 된 헤더파일을 직접 포함했다면. make.cpp가 존재하는 폴더에서 헤더 파일을 찾게 됩니다.)






728x90

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

이클립스 C++ 환경 구축  (0) 2013.10.05
상속과 다형성  (0) 2013.09.27
정보은닉(Data Hiding)과 캡슐화(Encapsulation)  (0) 2013.09.02
클래스와 객체..?  (0) 2013.08.31
#ifdef 와 #ifndef의 기능 (#define.... #endif)  (0) 2013.08.31
Posted by 정망스
,

클래스와 객체..?

C++ 2013. 8. 31. 00:13
728x90



클래스객체를 이 퍼즐조각에 비유할수 있을 것 같습니다.


변수나, 함수나 이러한 틀이 잡혀있는 퍼즐조각과도 같은 클래스들을 잘 사용해서 퍼즐의 완성품과도 같은 객체를 만들어내는 것입니다.


클래스는 구조체와 같은 개념이긴 한데 다른점은 함수까지도 클래스는 멤버로 넣어서 사용할수 있다는 점입니다.


물론 클래스 또한 사용자 정의 타입을 만들수 있고, 클래스를 타입으로 사용해서 정의한 변수들은 해당 클래스의 객체가 됩니다.




퍼즐이라는 클래스가 정의되어 있고 이 퍼즐을 타입으로 이용해서 puz1, puz2라는 객체를 만들었습니다.


이 각 객체들은 퍼즐 클래스에 있는 멤버들, 즉 변수나 함수들을 사용할수 있게됩니다.


ps. 구조체는 함수를 가질 수 없다?

X


C++에서는 구조체도 함수를 멤버로 가질 수 있다고 합니다. 하지만 그렇게 사용하지 않는 것이 일반적이라고 합니다. 


왜냐하면 C에서의 구조체는 변수만을 멤버로 가질 수 있었기 때문에 C로부터 이어져 온 관습이라고도 하고, C 소스 코드와의 호환성을 위한 것이라고도 합니다. 


어쨋든 이러한 이유 때문에 구조체에 함수를 멤버로 넣는 일은 흔치 않다고 합니다.




728x90
Posted by 정망스
,
728x90

#ifdef#ifndef가 무엇이냐... 


우선 간단한 코드로 설명을 한번 해보겠습니다.


#define _STUDY


func() {

#ifdef _STUDY

printf("정의 되었다면...\n");

#endif


#ifndef _STUDY

printf("정의 되지 않았다면...\n");

#endif

}



ifdef 는 if define의 약자입니다. 즉 해석해보면 만약 정의되어있다면 .. 이라는 정도로 해석할수 있겠죠. 

여기선 _STUDY가 #define문으로 정의되어 있다면 아래라인부터 #endif 까지 사이의 코드가 적용됩니다.


ifndef는 not 즉 정의되어 있지 않다면입니다. _STUDY가 #define문으로 정의되어 있지 않다면 그 아래라인부터 #endif까지 사이의 코드가 적용되는거죠


위의 예제 코드는 #define으로 정의가 되어있으므로 최종적으로 코드는 


func() {

printf("정의 되었다면...\n");

}


이렇게 되어 적용된다는 겁니다. 비교적 간단합니다.


보통의 표준 라이브러리의 헤더 파일에도 이렇게 적용되어 있다 하고,,

프로젝트 파일이 커서 어느순간 자기도 모르게 동일한 헤더파일을 두번 이상 중복으로 등록한다거나 뭐 그런 경우도 있다합니다,,

뭐 이런 순간을 예방하기위해 #ifdef#ifndef등이 쓰인다고 합니다. 


거대한 프로젝트의 모든 소스를 한곳에 쓸리는 없고 나누어서 헤더파일 포함해서 서로 연결시키니 뭐 이런 잦은 실수도 일어날수 있는거겠죠..?




728x90
Posted by 정망스
,


맨 위로
홈으로 ▲위로 ▼아래로 ♥댓글쓰기 새로고침