최상단 광고

2012년 4월 16일 월요일

[C++강좌] - 3-1. 구조체? 클래스?

C++의 첫이름이 뭔지 아시나요?

 C with Class 였습니다.
그만큼 Class의 비중은 C++ 에서 크게 차지합니다.

그 Class의 시작을 향해!!

*이 강좌는 C언어를 끝냈다는 가정하에 실시합니다.

┌───────────────┐
---앞으로의 목차---
3-1. 구조체? 클래스?
3-2. 객체에 대하여
3-3. 접근제어
└───────────────┘

<지난 강좌를 살펴보고 와주세요 !! : http://blog.naver.com/owndks98o/120156950445 >

3-1. 구조체? 클래스?
클래스에 대해 이해하려면, 클래스의 Downgrade 버젼이라고 말할수 있는 구조체와의 연관이 필요합니다.
그러니 잠시 구조체에 대한 이야기를 하고 지나가 보죠.

구조체는 그 이름 그대로 구조적인 프로그래밍을 위해 태어났습니다.
프로그램이 커지며, 변수가 많아지고 그 변수들의 관리가 힘들어지기에, 그 변수들을 몇가지 기준에 따라 분류한 것이 구조체입니다.
따라서 구조체는 관련된 데이터를 묶기에도, 그 프로그래밍에도 편리하다 는 장점이 있습니다.

C++에는 이러한 구조체의 기능에도 +를 더해줍니다.
일반적인 C언어라면 아래와 같이 구조체를 정의할 것입니다.

typedef struct _Leanix{
char name[10];
int age;
}Leanix;

Leanix nx;

하지만 C++은 사용자가 정의했든, 언어자체적으로 정의했든 동일하게 대우해주자는 철학이 있습니다. 따라서,

struct Leanix{
char name[10];
int age;
};

Leanix nx;

처럼 정의하여도 오류가 나지 않습니다.

프로그램은, 흔히들 아래와 같이 이루어져 있다고 이야기합니다.
프로그램 = 자료구조 + 알고리즘
어렵게 느껴지신다고요?

그냥 변수와 그 변수를 관리하는 연산으로 이루어져 있다는 뜻입니다.

/*
StructAndFunction.cpp
*/
#include
using namespace std;

struct Dat{
int ndat;
char cdat;
};

void Set(Dat& dat,int nDat,char cDat){
dat.ndat=nDat;
dat.cdat=cDat;
}

void Init(Dat& dat){
dat.ndat=dat.cdat=0;
}

int main(){
Dat d;
Init(d);
Set(d,10,'d');
return 0;
}

위 소스에 비유하면, 구조체는 자료구조이고 함수는 알고리즘이 되는 것이죠.
하지만 이소스를 보면 영 거슬리는 부분이 있습니다.
왜 꼭 Dat함수의 레퍼런스를 넘겨야 하는 것일까요?
분명 Set과 Init는 구조체 Dat의 함수인데 왜 밖에 따로 선언되어있는 것일까요?

그러니 그냥 묶어 버립시다.
/*
StructOnly.cpp
*/
#include
using namespace std;

struct Dat{
void Set(int nDat,char cDat){
ndat=nDat;
cdat=cDat;
}
void Init(){
ndat=cdat=0;
}
int ndat;
char cdat;
};
int main(){
Dat d;
d.Init();
d.Set(10,'d');
return 0;
}
놀라운가요? 아직은 간단하게 이해합시다. Dat이라는 구조체 안에 함수가 존재하는 것이라고.
간단하죠? 그냥 함수를 구조체 안에 넣은것에 지나지 않습니다.

더욱 놀라운 것은, 이젠 Dat이 구조체가 아닌, 클래스라는 사실입니다.

"아니, struct를 사용했는데 클래스라고?" 라고 따지는 분이 있겠지요? 그럼,
"구조체 안에 함수가 있을수 있나요?" 라고 묻겠습니다.

즉 Dat은 클래스가 되는 것이며, 위의 빨간 부분에서 말했듯이,
"Class(클래스)=Attribute(특성-변수-) + Method(방법-함수-)"
가 되는 것입니다.
보통 Attribute를 가르켜 멤버변수라고 하며, Method를 가르켜 멤버함수라고 합니다.

그럼 이제 Dat을 완벽히 클래스로 바꿔봅시다.
/*
CDat.cpp
*/
#include
using namespace std;

class Dat{
public:
int ndat;
char cdat;
void Set(int nDat,int cDat){
ndat=nDat;
cdat=cDat;
}
void Init(){
ndat=cdat=0;
}
};
int main(){
Dat d;
d.Init();
d.Set(10,'d');
cout<<"ndat : "<
return 0;
}

어엇 아직은 모르는 부분이 남아있습니다. public: 등에 관한 것이지요.
서서히 배울테니 걱정마시기 바랍니다.

그리고 이젠, 클래스를 '객체' 라고 표현합니다.
하나의 완전한 대상체라고 여기는 것이죠.

그럼 다음강의에서 뵙도록 하죠!!

댓글 없음: