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 ) 이라고 한다.
'C++언어 > 열혈C++' 카테고리의 다른 글
C++ : Chpater -6 friend , static 그리고 const (1) | 2018.05.16 |
---|---|
C++ : Chapter -5 복사생성자 (0) | 2018.05.10 |
C++ : Chapter -4 클래스 PART2 (0) | 2018.05.02 |
C++ : Chapter -2 참조자와 new&delete (0) | 2018.04.20 |
C++ : Chapter -1 오버로딩과 디폴트값 , namespace (0) | 2018.04.16 |