C++에서의 구조체


구조체는 연관있는 데이터를 묶을수 있는 문법장치인데, 이때 구조체에 종속적인함수들 ( 구조체에 의존하는함수 )를 전역함수로 선언하면 , 엉뚱한 영역에서 이 함수를 호출하는 일이 생길수도있다 . C++은 구조체안에 함수를 선언하는것이 가능하기때문에 , 구조체안에 함수를 선언하여 이러한 오류를 해소할 수 있다. 이렇게하면 구조체 내에 선언된 변수에 직접 접근이 가능하기때문에 , 연산에대한 대상의정보 ( 매개변수 ) 가 필요없어서 편리하다.


구조체 안에 enum상수 선언


#define ID_LEN 20 와같은 매크로상수들을 구조체내에 종속시키고싶을땐 열거형 enum 을 이용해서 구조체 내애서만 유효한 상수를 정의하면 된다.


struct Car

{

enum

{   

ID_LEN = 20 ,

MAX_SPD = 200,

FUEL_STEP = 2

}

}


함수는 외부로 뺄수있다


구조체 내에 함수의 수가 많거나 그 길이가 길다면 , 함수의 원형선언을 구조체 안에두고, 함수의 정의를 구조체 밖으로 빼내는것이 좋다.


struct Car

{

void ShowCarState();

....

}


inline void Car::ShowCarState()

{

..

구조체 내부에 함수가 선언될때는 함수가 inline 으로 처리하라는 의미가 내포되는데 , 함수를 외부로뺄때는 이 의미가 사라진다. 따라서 inline의 의미를 그대로 유지하려면 inline 키워드를 따로 지시해야한다.


클래스와 구조체의 유일한 차이점


클래스를 선언할때는 struct가아닌 class 키워드를 사용한다는것이 차이점이다. 이때 , 클래스는 구조체처럼 변수를 초기화할수 없다

ex)

class Car { ... } 

Car run99={"run99",100,0}; ( X )

Car run99; ( O )

클래스는 기본적으론 클래스 내에 선언된 함수로만 클래스 내부의 변수에 접근가능하기 때문이다. ( 클래스는 별도의 선언을하지않으면 private 접근제어지시자로 선언됨 ) 따라서 클래스를 선언할때는 멤버에 접근과 관련된 지시를 별도로 내려줘야한다.


접근제어 지시자


public  어디서든 접근허용

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

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


Class Car

{

enum

{

ID_LEN =20, FUEL_STEP=20

}

private : // 클래스 내에 선언된 함수로만 접근가능한 멤버

char GameID[ID_LEN];

int fuelGauge;

int curSpeed;

public : // 클래스 외부에서도 접근가능한 멤버

void InitMembers ( char * ID , int fuel ); 

void ShowCarState();

};


키워드 struct를 이용해서 정의한 구조체에 선언된 변수와 함수에 별도의 접근제어 지시자를 선언하지 않으면 모든 변수와 함수는 public으로 선언된다.

키워드 class 를 이용해서 정의한 클래스에 선언된 변수와  함수에 별도의 접근제어 지시자를 선언하지 않으면 모든 변수와 함수는 private로 선언된다.

클래스 내부에 존재하는 변수들을 private 로 선언해서 접근에 불편함을 주는 이유는 정보은닉에 관련있다.


C++에서의 파일분할


C++에서는 클래스별로 헤더파일과 소스파일을 생성해서 클래스의 선언과 정의를 분리하는 경우가 많다.


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

Car.cpp 클래스의 정의를 담는다


클래스의 선언은 밑과같다. 이 정보는 클래스 Car와 관련된 문장의 옳고 그름을 판단하는데 사용된다.

class Car

{

private :

int fuelGauge;

int curSpeed;

public :

void ShowCarState();

void Accel();

void Break();

}; 

inline Car ::Break() {......}


이때, inline함수는 컴파일과정에서 함수의 호출문이 있는곳에 함수의 몸체부분이 삽입되어야하기때문에, 클래스의 선언과 동일한파일 ( Car.h ) 에 저장되어서 컴파일러가 동시에 참조할수있게해야한다.


int main (void)

{

Car run;

run.fuelGauge = 20; // fuelGauge가 private로 선언되었으므로 에러발생

}


클래스의 정의는 밑과같다, 


void Car :: ShowCarState() { ... }

void Car :: Accel(){ ... }


객체지향 프로그래밍의 이해


객체지향 프로그래밍은 현실에 존재하는 사물과 대상 , 그리고 그에 따른 행동을 있는 그대로 실체화 시키는 형태의 프로그래밍이다. 객체는 하나 이상의 상태정보 ( 데이터 ) 와 하나 이상의 행동 ( 기능 ) 으로 구성된다. 


클래스 기반의 객체생성방법


ClassName objName; // 일반적인 변수의 선언방식

ClassName * objName = new Classname; // 동적할당방식 ( 힙 할당방식 )


객체간의 대화방법 ( Message Passing )


void BuyApples( FruitSeller &seller, int money )

{

numOfApples += seller.SaleApples(money);

myMoney -= money;

}


와 같이 , 하나의 객체가 다른 하나의 객체에게 메세지를 전달하는 방법 ( 어떠한 행위의요구를 위한 메시지 전달 ) 은 함수호출을 기반으로한다 . 이러한 함수호출을 가리켜 메시지전달 ( Message Passing ) 이라고 한다.


+ Recent posts