1.C++이 무엇인가?

본장에서는 C++프로그래밍의 기본 형태에 대해서 설명을 합니다. 지금까지 우리는 C를 배웠으며 C를 이용하여 윈도우 프로그래밍을 했습니다. C언어로 프로그래밍 할 때 느끼는 것은 전역변수또는 static변수를 많이 사용한다는것입니다. 그이유는 프로시저가 수시로 실행되기 때문에 프로시저의 특정 이벤트결과로 저장되는 데이터가 전역변수 또는 static를 사용하지 않으면 유실되기 때문입니다. C++로 넘어가면 이런 문제가 해결됩니다. 더불어 구조적인 프로그래밍을 하게 될것입니다.

객체 지향 언어 (Object Oriented Programming Language)

객체 지향 언어란 모든 프로그래밍 방법을 객체로 설정하여 이것을 운용하는 방식으로 설계하는 언어입니다. 본항목에서는 객체 지향 언어가 무엇인가의 전반적인 내용을 설명하겠습니다.

객체는 맴버 변수와 맴버 함수 로 구성된다!

요즘 가장 많이 사용하는 말이 객체 지향일것입니다. 객체지향 데이터베이스,객체지향 언어,객체 지향 OS등등 수많은 컴퓨터 기술들이 객체 지향쪽으로 가고 있습니다. 필자도 객체지향이란 말을 모를 때 □도대체 객체 지향이라는 것이 무엇인가?□에 대해서 매우 많은 의문을 제시했었습니다. 알것도 같고 모를것도 같은게 객체 지향이기 때문입니다. 프로그래밍 경력이 10년이 되면서 이제는 객체 지향이라는 것이 어떤것인가를 느끼게 되었고 객체 지향 방식의 언어가 아니라면 앞으로 프로그래밍 언어로 살아남기가 무척 힘들것이라는 것을 느꼈습니다.

그럼 이객체 지향언어라는 것이 무엇인가?

간단히 말해서 하나의 모듈을 객체로 설정하고 그 모듈 자체에서 발생하는 모든 문제는 그모듈에 제한하고  그모듈을 가동시키고자 할경우에는 외부에서 방법을 제시한다는 것이 객체 지향입니다. 이렇게 정의해도 말자체가 무척 어렵게 느껴지는군요. 좀더 쉽게 설명하고자 또 말안되는 황당한 예를 들어 보겠습니다. 만득이는 천순이를 보고 한눈에 반했습니다. 만득이는 천순이의 마음에 들기 위해 갖은 노력을 다했습니다. 그러나 천순이는 눈길한번 주지 않았습니다. 친구들이 여자의 마음에 들기 위해서는 꽃을 선물하는 것이 제일이라고 만득이에게 조언을 하였고 만득이는 꽃을 한다발 사서 천순이게 내밀었습니다. 그러나 천순이는 꽃알레르기 였습니다. 그래서 꽃 을보자 마자 천순이는 마구 도망갔습니다. 너무 슬픈 만득이는 산속에 들어가 엉엉울었는데 이울음소리를 들은 하나님이 불쌍하게 생각하여 천순이의 꽃알레드리기를 고쳐주었습니다. 그이후로 만득이는 다시 천순이에게 꽃을 선물했고 천순이는 만득이에게 감사의 표시로 뽀뽀를 해주었습니다.

여기에서 천순이의 마음을 움직이기 위해서 만득이는 외부에서 어떤 방법을 동원하고 있습니다. 그이유는 천순이는 천순이 그자체가 독립적인 객체이기 때문입니다. 객체 지향 프로그램이란 어떤 독립적인 객체를 설정하고 그 객체를 원하는 상태고 구동하기 위해서 외부에서 어떤 방법을 동원하는 방식입니다. 그리고 외부에 방법에 대응하여 움직이는 것은 그 객체의 내부 문제이지 외부에서는 전혀 손을쓸수가 없는것입니다. 위의 예에서 보면 만득이는 천순이의 마음을 움직이기 위해서 꽃을 선물하는 방법을 제시하였습니다. 이방법에 의한 천순이의 행동은 도망하는것이었지만 어떤 방법에의해서 천순이라는 객체가 움직이게 된것입니다. 그것이 잘못되어서 버그 형태로 움직였지만요. C언어로 프로그래밍 하는 개념이라면 천순이 마음의 핸들을 로드하여 □만득이를 좋아하게 하라!□라는 형태로 바꾸어서 다시 설정해 주면 되지만 C++에서는 천순이라는 객체 내부를 마음대로 얻을수 없다는것입니다. 그것은 캡슐화 되어 있기 때문에 외부에서 침공을 할 수가 없기 때문입니다. 객체 지향은 바로 모든 객체를 만들고 이객체를 구동하기 위해서는 외부에서 방법이라는 개념으로 접근을 해야 하며 그 객체의 내부 요소들은 접근을 할수 없게 한다는 방식입니다. 지금까지 설명을 들으면 혹자는 이런생각을 할것입니다. □접근을 못하고 캡슐화 되어있다면 프로그래밍 하는게 오히려 불편할텐데 어떻게 내부로 접근을 한단 말인가?□ 라고요. 그래서 위의 예에 하나님이이 나타나는것입니다. 만득이가 천순이에게 접근할려고 꽃이란 방법을 사용했는데 이것이 버그가 났습니다. 그렇다면 방법은 객체 안에 있는 버그를 해결해야 하기 위해서 객체를 고쳐주어야 합니다. 그것을 하기 위해서는 내부에 들어가서 내부에 문제점을 해결하는 것입니다. 천순이라는 객체는 하나님이 만들었으니 하나님이 바로 내부로 들어가 꽃알레르기를 제거하여 버그를 제거한 것입니다.

객체지향 프로그래밍의 방식은 객체를 두 개의 방법으로 나눕니다. 하나는 객체의 요소이며 (이것을 맴버 변수(member variable) 라고 합니다) 또하나는 객체를 구동시키는 방법입니다.(이것을 맴버 함수(member function) 이라고 합니다) 맴버 변수는 캡슐화 되어 있어서 접근을 할수없으며 객체를 구동하기 위해서는 맴버 함수만 사용한다는것입니다. 즉 천순이의 마음은 맴버 변수이며 꽃을준다는 것이 맴버 함수입니다. 꽃을 준다는 맴버 함수를 이용하여 맴버 변수인 천순이 마음으로 접근을한다는 개념 바로 이것인 객체지향 프로그래밍 방식입니다.

모든 프로그램을 크게 보면 사실 두가지입니다. 데이터와 데이터를 가공처리하는부분 이두가지로 볼수 있는것입니다. 그래서 이것을 하나의 객체로 묶자는 것이 바로 객체 지향언어의 가장 큰 특징인것입니다.

객체는 상속된다.

객체의 두 번째 특징은 상속이 된다는 것입니다. 이것은 일반 자연형태와 비슷합니다. 사람은 포괄적으로 포유류이며 더포괄적으로는 동물이고 더포괄적으로는 생물입니다. 즉 다음과 같은 형태입니다.

생물 -> 동물 -> 포유류 -> 사람 -> 만득이

최초의 객체를 생물이라고 할 때 생물이라는 객체의 기능을 설명하자면 살아있다! 이것이 전부일것입니다.(전 생물을 잘모르니까 그냥 그렇다고 넘어갔으면 합니다) 여기에 산소로 호흡을 하면서 움직인다는 기능이 추가되어 동물이 나옵니다. 또한 여기에 젖으로 새끼를 양육한다는 기능과 4발이 달렸다는 기능으로 포유류가 나오고 이포유류에서 생각하는 기능과 직립 보행이라는 기능이 추가되어 사람이 나오고 사람으로부터 멍청한 만득이가 나옵니다. 이런 식으로 객체 자체를 상속받아서 새로운 기능을 추가할수 있다는 것입니다. 기존의 어떤 객체가 기능이 적다면 그 객체 내부를 수정하는 것이 아니라 그객체를 상속받아서 새로운 기능을 넣는것입니다. 이런식으로 프로그래밍 하자는 것이 객체지향의 또하나의 특징입니다. C언어로 프로그래밍 할경우에는 이런 방법이 아니라 프로그램을 발전시키기 위해서 내부 함수를 고쳐썼습니다. 그러나 C++ 즉 객체지향에서는 그객체의 기능이 적다고 그 객체 내부로 들어가는 것이아니라 그객체를 상속받는 또다른 객체를 만들고 그객체에 새로운 기능을 삽입시키는 것입니다. 이부분은 소프트웨어 관리 측면에서 매우 좋은 기능입니다. 지금까지 버전업된 부분들 관리할수 있으며 만들어 놓은 객체를 그 제작자가 없다 하여도 그기능을 상속받은 새로운 클래스를 만들어서 그클래스에 새로운 기능을 추가하면 되기 때문입니다.

객체는 상속받은 객체에서 특정기능을 바꿀수 있다(Over ridding)

객체의 또하나의 특징은 상속 받은 객체에서 특정 기능을 자신의 기능으로 바꿀수 있습니다. 예를 든다면 보통 4발로 걸어다니는 동물을 상속받은 사람이란 객체가 탄생되었다고 가정을 하고 동물에서 걸어다닌다 라는 기능은 4발로움직이는 것으로 정의되어 있습니다. 상속받았기 때문에 사람또한 걸어다닌다 라는 기능을 동물의 기능을 그대로 이용해야 한다면 4발로 움직이는 것이 됩니다. 그러나 상속받은 부모 객체로부터 특정기능을 무시하고 자신만의 기능을 만들 수 있기 때문에 사람은 상속받은 기능을 무시하고 새로운 2발로 걸어 다니는 기능을 부과하게 된것입니다. 이 특징이 바로 객체는 상속받은 객체의 특정기능을 무시하고 자신의 기능으로 바꿀수 있다는 것이고 이것을 오버 라이딩(Over ridding)이라고 합니다. 위의 만득이와 천순이 예가 프로그램이라면 천순이 내부의 꽃알래르기를 고치기 위해서 하나님이 필요하지 않고 천순이를 상속받은 새로운 만순이를 만들고 천순이의 꽃알래르기 기능을 오버라이딩하여 꽃 안 알래르기(?) 로 만들 수 있는것입니다. 오버라이딩이 객체의 3번째 특징입니다.

객체는 친구의 도움을 받을수 있다(Friend)

이특징은 C++에서 자주 이용되는 특징입니다. 다른 객체지향 언어에서는 없는 특징일수도 있습니다. 친구의 도움을 받을수 있다는 것은 바로 자신의 능력이 모자르면 다른 객체로부터 도움을 받을수 있다는것입니다. 사람은 먼거리를 빠르게 달리지 못합니다. 이때 사람이라는 객체는 자동차라는 객체를 친구로 삼아서( 구입하였다는 의미인데 그냥 친구로 삼는다고 생각하시기르) 먼거리를 빠르게 달릴수 있습니다. 상속과 오버라이딩 가지고는 불가능할 경우 친구로 삼아서 이용할수 있는 것이 객체지향 언어의 4번째 특징입니다.. 자동차라 객체와 사람이라는 객체는 근원적으로 틀리기 때문에 결국 친구로 삼는 방법밖에는 없습니다. C++로 프로그래밍하다 보면 이부분만은 특정 다른 객체의 기능을 이용하고 싶을 때가 있습니다. 허나 두객체가 근원적으로 다르다면 Friend라는 기법으로 이용을 할 수가 있는것입니다.

지금까지 객체지향 언어의 특징을 설명했습니다. C++이라는 언어를 배우는데 이 4개의 특징이 매우 중요하기 때문에 꼭 상기하시기 바랍니다. 이 의미를 상기하시고 C++로 들어가면 쉽게 이해 할수 있을것입니다.

1.객체는 맴버 변수와 맴버 함수 로 구성된다!

2.객체는 상속된다.

3.객체는 상속받은 객체에서 특정기능을 바꿀수 있다(Over ridding)

4.객체는 친구의 도움을 받을수 있다(Friend)

C++ 형식

class

C++에서는 필요한 모듈들을 객체화 하고 그 객체안에 함수와 변수를 함께 설정합니다. 이렇게 객체화 할 때 선언하는형이 class 입니다.

C언어에서 구조체에 대해서 배웠을것입니다. 예를 들어서 이름과 전화번호 주소를 기록하는 구조체를 만든다면 다음과 같을것입니다.

typedef struct s_namecard{

char name[80];

char tel[20];

char address[80];

}Name;

구조체에는 구조체를 구성하고 있는 맴버들로 설정되어 있습니다. 구조체도 하나의 객체라고 말할수 있습니다. 다만 맴버만 있고 맴버에 접근하는 함수가 없는 형태입니다. C++ 에서는 객체의 표현을 위와 같은 구조체 형식과 비슷한 형태로 만듭니다. 위의 구조체를 C++로 표현한다면 다음과 같습니다.

class CNamecard{

char name[80];

char tel[20];

char address[80];

};

위의 예에서 보면 CNamecard라는 객체 (이제부터는 클래스(class)라고 합니다)는 name와 tel 그리고 address라는 맴버가 있습니다. 객체지향 언어는 맴버에 접근하지 못하도록 한다고 하였습니다. 맴버에 접근하지 목하도록 하기 위해서 맴버라는 의미의 예약어를 설정해야 합니다. 이 예약어가 protected입니다. 위의 클래스를 맴버를 보호하는 형태로 다시 설정한다면 다음과 같을 것입니다.

class CNamecard{

protected:

char name[80];

char tel[20];

char address[80];

};

지금까지의 설명의 요점은 바로 클래스라는 개념입니다. C++에서 하나의 객체를 설정하기 위해서는 class라는 형을 쓰고 구조체와 같은 형식으로 맴버를 설정합니다. 그리고 이멤버를 보호하기 위해서 맴버 앞에 preotected 라는 예약어를 설정합니다.

public 과 함수설정

맴버를 설정하고 맴버에 접근 하기 위해서는 멤버함수를 사용한다고 하였습니다. 예를 들어 name에 데이터를 넣고자 할경우에 name에 접근하는 함수가 필요합니다. 다음은 name에 접근하는 함수를 설정한 예입니다.

class CNamecard{

protected:

char name[80];

char tel[20];

char address[80];

public:

void SetName(char *data)

{

strcpy(name,data);

}

};

외부에서 이용할수 있는 맴버함수를 설정하기 위해서는 앞에 맴버 함수이기 때문에 접근이 가능하다는 public: 라는 예약어를 설정해 주어야 합니다. 이예약어를 설정하고 난후부터 기록하는 함수들은 외부에서 이용할수 있는 것입니다. 위의 예를 보면 SetName이라는 함수는 data라는 문자열 포인터를 인자로 받아서 이값을 name에 복사하는기능을 합니다. 즉 보호된 맴버 변수 name에 접근하기 위해서 SetName이하는 함수를 만든것입니다.

이제 이클래스를 이용하여 name의 맴버에 값을 넣는 예를 보겠습니다.

CNamecard cNamedata;

cNamedata.SetName("이상엽□);

class를 설정하면 이클래스가 하나의 형으로 사용할수 있습니다. 위의 예의 첫줄은 cNamedata라는 변수는 CNamecard라는 클래스의 형의 변수라는 의미입니다. 이클래스의 SetName이라는 함수를 이용하고자 할경우에는 구조체를 사용하는 것과 같은 방법으로 cNamedata.SetName("이상엽□); 해주면 됩니다. 구조체 처럼 맴버를 이요하는것과 함수를 호출하는 방법이 합친것입니다.

위의 SetName이라는 함수는 단순히 strcpy함수 하나를 이용하여 name안에 값을 저장하는 간단한 함수입니다. 만일 이함수안에 내용이 무척 길 경우 클래스가 커지기 때문에 보기에 좋지는 않을것입니다. 맴버함수는 밖으로 빼내어서 다시 정의할수 있습니다. 다음 예는 위의 클래스의 맴버 함수를 밖으로 빼낸 예입니다.

class CNamecard{

protected:

char name[80];

char tel[20];

char address[80];

public:

void SetName(char *data);

};

void CNamecard::SetName(char *data)

{

strcpy(name,data);

}

class 내부안에는 단순하게 함수의 형만 기록한다음 이함수의 내용은 밖에 설정을 한것입니다. 이때 특정 클래스의 맴버 함수라는 의미를 부과 하기 위해선 처음에는 함수의 형을 써준다음 클래스이름::함수이름 형식으로 써줍니다. 위 예의 void CNamecard::SetName(char *data) 는 의미는 CNamecard라는 클래스안에 있는 void SetName(char *data) 라는 의미와 같습니다.

클래스 형식 예제 CpExClass

CNamecard 에있는 멤버 변수 name와 tel그리고 address에 접근하기 위한 최소함수가 무엇일까요? 최소함수라면 각변수에 데이터를 넣는것과 데이터를 얻는 것 이 두가지 함수일것입니다. CNamecard클래스에서 이두개의 함수를 넣은 예가 다음과 같습니다.

class CNamecard{

protected:

char name[80];

char tel[80];

char address[80];

public:

void SetName(char* na); //name에 데이터를 넣는 함수

char *GetName();//name에서 데이터를 얻는함수

void SetTel(char* te);//tel 에 데이터를 넣는함수

char *GetTel();//tel 데이터를 얻는함수

void SetAddress(char *ad);//주소를 넣는 함수

char *GetAddress();//주소를 얻는함수

};

보통 클래스에 맴버 변수를 설정하였다면 Set계열 함수와 Get계열 함수가 기본적으로 설정되는 것이 통산 예입니다. 위의 CNamecard클래스에서 변수가 3개이므로 6개의 Get계열과 Set계열의 함수가 설정을하는것인 기본입니다. 이함수들의 안에서 실제 이루어 지는 작업은 클래스 외부에 CNamecard::Get계열 과 CNamecard::Set 계열로 설정합니다. 다음은 그예입니다.

//name에 데이터를 넣는함수

void CNamecard::SetName(char *na)

{

strcpy(name,na);

}

//tel 에 데이터를 넣는함수

void CNamecard::SetTel(char* te)

{

strcpy(tel,te);

}

//address에 데이터를 넣는함수

void CNamecard::SetAddress(char* ad)

{

strcpy(address,ad);

}

//name 데이터를 얻는함수

char *CNamecard::GetName()

{

return name;

}

//tel 데이터를 얻는함수

char *CNamecard::GetTel()

{

return tel;

}

//address에 데이터를 얻는함수

char *CNamecard::GetAddress()

{

return address;

}

예를 들어 CNamecard라는 클래스 형을 가진 변수를 하나 만들고 이 클래스의  name라는 변수에 데이터를 넣고 얻고자 한다면 다음과 같이 할수 있습니다.

CNamecard card;

card.SetName("이상엽□);

printf("name: %s",card.GetName());

printf라는 함수는 sprintf와 비슷한기능을 갖는 함수이면서 콘솔 화면에 데이터를 출력하는 함수입니다. 위의 예는 card라는 CNamecard형의 변수의 name안에 □이상엽□ 이라는데이터를 넣은후 card의 name에 설정된 값을 화면에 출력하는 예입니다. 결국 □이상엽□ 이라는 글자가 화면에 출력될것입니다.

이제 이름과 전화번호 주소를 입력하고 출력하는 CpExClass를 작성해 봅시다.

이프로그램은 DOS모드용 프로그램으로 작성을 합니다. DOS모드용 프로그램으로 작성하기 위해서는 프로젝트를 새로 만들 때 Win32 Console Application을 선택하여야 합니다. 그림 1은 CpExClass라는 예제를 DOS용 모드로 만들 때 파일메뉴에서 New항목을 선택하고 카드철 메뉴에서 Project를 선택한후에 Win32 Console Application을 선택하고 Project name을 CpExClass로 선택한 화면입니다.

(그림 1) CpExClass 프로젝트 만들기

그림 1과 같은 화면에서 프로젝트 이름을 설정한후에 OK버튼을 클릭하면 DOS모드용 프로그램을 제작할수 있는 프로젝트가 만들어 집니다. 이제 이 프로젝트에 하나의 파일을 설정합니다. 프로젝트에 새로운 파일을 삽입하는 방법은 File 메뉴에서 New항목을 선택한후 카드철 메뉴에서 File를 선택하고 C++ Source File를 선택한다음 새로 만들고자 하는 파일명을 써주면 됩니다. 그림2는 CpExClass안에 새로운 파일을 삽입하는 화면입니다.

(그림 2) CpExClass 에 CpExClass.cpp를 삽입하는 화면

새로운 파일을 프로젝트에 삽입할때는 Add to project라는 체크 버튼이 체크되어 있어야 합니다. 보통 프로젝트에 소스를 코딩하기위한 파일을 만들때는 확장자가 cpp인 형태로 합니다. C언어에서는 c로 한것과 같은 형태입니다.

그림2와 같이 설정한후에 OK버튼을 누르게 되면 문자를 에디팅할수 있는 빈파일이 만들어지며 이파일명은 CpExClass.cpp로 설정되었을것입니다. 이 파일에 소스를 코딩하면 됩니다. 다음은 소스 내용입니다.

(프로그램 소스)

#include <stdio.h>

#include <string.h>

class CNamecard{

protected:

char name[80];

char tel[80];

char address[80];

public:

void SetName(char* na);

char *GetName();

void SetTel(char* te);

char *GetTel();

void SetAddress(char *ad);

char *GetAddress();

};

//name에 데이터를 넣는함수

void CNamecard::SetName(char *na)

{

strcpy(name,na);

}

//tel 에 데이터를 넣는함수

void CNamecard::SetTel(char* te)

{

strcpy(tel,te);

}

//address에 데이터를 넣는함수

void CNamecard::SetAddress(char* ad)

{

strcpy(address,ad);

}

//name 데이터를 얻는함수

char *CNamecard::GetName()

{

return name;

}

//tel 데이터를 얻는함수

char *CNamecard::GetTel()

{

return tel;

}

//address에 데이터를 얻는함수

char *CNamecard::GetAddress()

{

return address;

}

void main()

{

char temp[80];

CNamecard m_card;

printf("이름:");//이름을 출력한다.

gets(temp);//문자열을 받는다.

m_card.SetName(temp);//문자열을 m_card의 name에 저장한다.

printf("전화번호:");//전화 번호를 출력한다.

gets(temp);//문자열을 받는다.

m_card.SetTel(temp);//문자열을 m_card의 tel에 저장한다.

printf("주소:");//주소를 출력한다.

gets(temp);//문자열을 받는다.

m_card.SetAddress(temp);//문자열을 address에 저장한다.

//이름 출력

printf("이름:%s\n",m_card.GetName());

//전화 번호 출력

printf("전화번호:%s\n",m_card.GetTel());

//주소 출력

printf("주소:%s\n",m_card.GetAddress());

gets(temp);

}

(프로그램 소스끝)

위와 같이 한후에 F7를 누르거나 Build 메뉴에서 Build CpExClass라는 항목을 클릭하여 컴파일 합니다. 컴파일 한후에 Ctrl+F5키를 누르고 실행하면 그림 3과 같은 화면이 나올것입니다.

(그림 3) CpExClass 출력 결과

CpExClass를 실행시키면 화면에 □이름:□ 이라는 문자가 출력되고 이다음에 값을 입력하도록 되어 있습니다. 이곳에 이름을 입력하고 순서적으로 전화번호와 주소를 입력하면 입력한 데이터가 화면에 출력되는 예제입니다.

DOS모드에서는 문자를 출력할때는 printf라는 함수를 사용합니다.

printf(const char* format,...);

예를 들어 □이름□ 이라는 문자를 출력하고자 한다면 다음과 같이 하면 됩니다.

printf("이름");

위와 같이 하면 □이름□ 이라는 문자가 화면에 출력됩니다. 윈도우에서는 TextOut를 이용하여 출력할 위치 좌표를 설정하였으나 도스 모드에서는 이럴 필요가 없습니다. 윈도우 상태는 그래픽 모드이며 도스는 텍스트 모드이기 때문입니다. printf를 사용하면 현재 화면에 출력한 데이터 다음에 데이터를 출력합니다. 또한 도스는 개행을하고자 한다면 문자에 "\n"을 설정하여 주면 됩니다.

printf("안녕하세요\n");

위와 같이하면 □안녕하세요□라는 데이터가 출력되며 한줄이 개행됩니다.

DOS모드에서 문자열을 입력받고자 한다면 gets라는 함수를 사용합니다.

ex)

char temp[80];

gets(temp);

위와 같이하면 DOS화면에 커서가 깜빡이면서 글자 입력을 기다립니다. gets함수는 Enter키를 누르기 전까지의 문자를 입력받습니다. 위의 main에서 보면 클래스를 생성하고 gets함수를 이용하여 문자열을 입력받고 이것을 m_card의 맴버의 name와 card와 address에 저장하는 것을 보실수가 있을겁니다. 또한 printf를 사용하여 저장된 데이터를 다시 출력을 합니다.

맴버 변수를 보호하지 않는다!

맴버변수를 protected 안에 넣지 않고 public에 넣는 경우도 있습니다. 이것은 변수를 보호하지 않는다는 의미입니다. 다음은 변수를 보호하지 않는 형태입니다.

class CNamecard{

public:

char name[80];

};

CNamecard m_card;

strcpy(m_card.name,"이상엽□);

위의 예는 name라는 변수를 public에 설정하고 외부에서 바로 이변수를 이용한 예입니다. C++에서 변수를 꼭 protected에 넣어야 되지는 않습니다. 위와 같이 public에 설정하고 이변수를 바로 얻을수도 있습니다. 다만 가능하다면 변수를 보호하는 측면으로 프로그램을 하는 것이 좋다는 의미입니다.

(잔소리)

본 C++편에서는 모든 예가 DOS모드입니다.따라서 프로젝트를 만들 때 꼭 Win32 Console Application으로 설정하여 만들어 주어야 합니다. 만일 C++를 이용한 방법으로 윈도우 프로그램에서 접근을한다면 가뜩이나 C++를 이해하는것도 힘든데 윈도우즈 프로그램까지 분석을 해야하는 두 개의 어려움이 따르기 때문입니다. 물론 지금까지 윈도우 프로그래밍을 열심히 공부해서 왠만한 것은 다 이해하시는 분들도 있겠지만..윈도우즈로 프로그래밍했을 경우 자칫 프로그램 분석 때문에 C++마저 배우지 못할 것 같은 염려입니다. 또한 본책에서 지금까지 DOS모드에서 프로그램을 하지 못했기 때문에 이편에서 DOS모드의 프로그램을 하는 방법을 알려주고자 하는취지도 있습니다. 혹자는 이렇게 반문할것입니다.□C 언어 배울때도 이렇게 편하게 DOS 모드로 하지 왜 윈도우로 했는가?□ 답은 윈도우즈 프로그래밍 개념을 이해시키기 위해서입니다. DOS모드에서 출발을 하면 윈도우즈 프로그래밍에 대한 개념을 이해할 때 어려움이 있을 것 같은 염려 때문입니다. 과거 도스모드에서 프로그래밍을 하다 윈도우로 넘어가면서 프로그래밍을 포기한 분들을 많이 보았기 때문이기도 합니다.

(잔소리 끝)