구조체는 연관있는 데이터를 하나의 그룹으로 믂기위해서 등장하였다.


C++에서도 구조체를 선언할수있다.


struct Smartphone Samsung;

struct Smartphone Apple;


이와 같이 선언이 가능하다. struct 키워드는 typefed를 통해서 축약이 가능하다.

예를들자면,


#include <iostream>


#define  LEN  30


using namespace std;



struct Smartphone 

{

char phonename[LEN]; //핸드폰 이름

int version;

int price; 

}


void showphone(const Smartphone  &phone)

{

cout<<"핸드폰명:"<<phone.phonename<<endl;

cout<<"버전명:"<<phone.version<<endl;

cout<<"현재가격:"<<phone.price<<"dollar"<<endl<<endl<<;


}


int main(void)

{

Smartphone apple={"apple, 2, 800}

showphone(apple);


}


매우 간략한 예제이지만, 구조체의 사용법과 간단히 함수의 동작에 대해서 이해가 가능할것으로 보인다.

여기서 하나의 의문을 가질수가 있다.

만약 구조체안에다가 함수를 삽입하면 어떻게 될까??





#include <iostream>


#define  LEN  30


using namespace std;



struct Smartphone 

{

char phonename[LEN]; //핸드폰 이름

int version;

int price; 


void showphone() //매개변수는 불필요 해졌다.

{

cout<<"핸드폰명:"<<phonename<<endl; //연산의 대상에 대해서 정보가 불필요해졌다.

cout<<"버전명:"<<version<<endl;      //변수에 대한 직접접근이 가능하기 떄문이다.

cout<<"현재가격:"<<price<<"dollar"<<endl<<endl<<;


}


}


int main(void)

{

Smartphone apple={"apple", 2, 800}

apple.showphone(apple);

return 0;

}



이로써 구조체는 대충 이해가 되었다. 그렇다면, 클래스와 구조체의 차이점은 무엇일까??


> 선언법과 초기화법이 다르다.

> 클래스의 변수와 함수에 대한 접근법이 다르다.  (접근제어 지시자의 사용)





* 접근제어 지시자


C++에서 접근제어 지시자는 아래와같이 3가지의 형태가 존재한다.


1) public : 어디서든 접근허용

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

3) private : 클래스 내 (클래스 내에 정의된 함수)에서만 접근허용


먼저 1)과 3)번에 관해서 아래의 예를 통하여 이해해 보자.


#include <iostream>



#define  LEN  30


using namespace std;



class Smartphone 

{


private:

char phonename[LEN]; //핸드폰 이름

int version;

int price; 

public:

void initphone(char *ID, int v, int p);

void showphone();

}


void Smartphone::initphone(char *NAME, int v, int p)

{

strcpy(phonename, NAME);  //phonename공간에 NAME의 내용을 복사한다.

version = v;

price = p;

}


void Smartphone::showphone() //매개변수는 불필요 해졌다.

{

cout<<"핸드폰명:"<<phonename<<endl; //연산의 대상에 대해서 정보가 불필요해졌다.

cout<<"버전명:"<<version<<endl;      //변수에 대한 직접접근이 가능하기 떄문이다.

cout<<"현재가격:"<<price<<"dollar"<<endl<<endl<<;


}



int main(void)

{

Smartphone apple;

apple.initphone("apple", 2, 800);

apple.showphone(apple);

return 0;

}


private 과 public의 쓰임을 이해하기 위해서 위의 예제를 먼저 따라가보자.

Smartphone 이라는 클래스가 선언되었고, 클래스는 private 과 public으로 구분된다.

public은 어디서든 접근이 가능하며, private 는 해당하는 범위 내에서만 접근이 가능하다.


따라서 위의 예제에서는 private 으로 접근을 하기 위해서 같은 클래스내에 public으로 선언된 initphone 함수를 통해서

초기화를 수행한다. 왜냐하면 private으로 변수나 함수가 선언되면 main함수에서 직접적으로 접근이 불가능하기 떄문이다. 

따라서 public으로 선언된 함수를 통하여 같은 클래스내의 private으로 접근하여 초기화를 수행한다. 


구조체의 경우는 Private이 없다. 기본적으로 구조체는 모든 변수와 함수는 public으로 선언되었다고 생각하면 된다.

만약 클래스에서 접근제어 지시자를 쓰지 않으면 구조체와는 반대로 모두 private으로 선언되었다고 봐야한다.


[용어의 정리]


위에서 말한 변수는 "객체"라고 표현된다.

클래스를 구성하는 변수는 "멤버변수"라고 부르며,

클래스를 구성하는 함수는 "멤버함수"라고 부란다.


그리고 C++에서는 H(헤더파일), CPP(정의파일) 로 코드들이 구분되어 다루어진다.


예를들어, 

Smartphone.h    : 클래스의 선언을 담는다

Smartphone.cpp : 클래스의 정의(멤버함수의 정의)를 담든다.


따라서, 위의 예제를 파일로 나눠본다면 아래와 같이 된다.


[Smartphone.h]


#ifndef __SMARTPHONE.H__

#define __SMARTPHONE.H__


#define  LEN  30


class Smartphone 

{


private:

char phonename[LEN]; //핸드폰 이름

int version;

int price; 

public:

void initphone(char *ID, int v, int p);

void showphone();

}



[Smartphone.cpp]


#include <iostream>

#include "Smartphone.h"


using namespace std;

void Smartphone::initphone(char *NAME, int v, int p)

{

strcpy(phonename, NAME);  //phonename공간에 NAME의 내용을 복사한다.

version = v;

price = p;

}


void Smartphone::showphone() //매개변수는 불필요 해졌다.

{

cout<<"핸드폰명:"<<phonename<<endl; //연산의 대상에 대해서 정보가 불필요해졌다.

cout<<"버전명:"<<version<<endl;      //변수에 대한 직접접근이 가능하기 떄문이다.

cout<<"현재가격:"<<price<<"dollar"<<endl<<endl<<;


}



[applephoneMain.cpp]


#include "Smartphone.h"


int main(void)

{

Smartphone apple;

apple.initphone("apple", 2, 800);

apple.showphone(apple);

return 0;

}














+ Recent posts