[C++]Chapter03 클래스의 기본
C++에서의 구조체
구조체의 등장 배경
- 연관 있는 데이터를 하나로 묶으면 프로그램의 구현 및 관리가 용이하다.
- 구조체는 연관 있는 데이터를 하나로 묶는 문법적 장치다.
#include <iostream>
using namespace std;
#define ID_LEN 20;
struct Car
{
char gameID[ID_LEN]; // 소유자 ID, ID_LEN은 매크로 상수!
int fuelGauge; //
int curSpeed;
}
연관 있는 데이터들은 생성 및 소멸의 시점이 일치하고, 이동 및 전달의 시점 및 방법이 일치하기 때문에 하나의 자료형으로 묶어서 관리하는 것이 유용하다.
C++에서의 구조체 변수 선언
Car basicCar; // C++에서는 구조체 변수 선언시 struct 키워드의 생략 가능
Car simpleCar;
// Car 과 관련된 데이터들의 모임
struct Car
{
char gameID[ID_LEN]; // 소유자 ID, ID_LEN은 매크로 상수!
int fuelGauge; //
int curSpeed;
};
// Car과 연관된 함수들의 모임
void ShowCarState(const Car &car)
{
}
void Accel(Car &car)
{
}
void Break(Car &car)
{
}
구조체 안에 함수 삽입하기
-
C++ 에서는 구조체 안에 함수를 삽입하는 것이 가능하다. 따라서 C++에서는 구조체가 아닌, 클래스라고 한다. ```cpp // Car 과 관련된 데이터들의 모임 struct Car { char gameID[ID_LEN]; // 소유자 ID, ID_LEN은 매크로 상수! int fuelGauge; // int curSpeed; // Car과 연관된 함수들의 모임 void ShowCarState(const Car &car) { cout«“소유자ID: “«gamerID«endl; cout«“연료량: “«fuelGauge«”%”«endl; cout«“현재속도: “«curSpeed«“km/s”«endl«endl; }
void Accel(Car &car) {
}
void Break(Car &car) { if(curSpeed < BRK_STEP) { curSpeed = 0; return; } curSpeed -= BRK_STEP; }
};
### 구조체 안에 enum 상수 선언
**방법1**
```cpp
struct Car
{
enum
{
ID_LEN = 20;
MAX_SPD = 200;
FUEL_STEP = 2;
ACC_STEP = 10;
BRK_STEP = 10;
};
char gamerID[ID_LEN];
...
};
방법2
namespace CAR_CONST
{
enum
{
ID_LEN = 20,
MAX_SPD = 200,
FUEL_STEP = 2,
ACC_STEP =10,
BRK_STEP = 10
};
}
// 이렇게 연관있는 상수들을 하나의 이름공간에 묶기도 한다.
클래스와 구조체의 유일한 차이점
class Car
{
char gamerID[CAR_CONST::ID_LEN];
int fuelGauge;
int curSpeed;
void ShowCarState() {...}
void Accel() {...}
void Break() {...}
};
// 단순한 키워드만 class로 바꾸면 선언된 멤버의 접근 불가
// 따라서 별도의 접근제어 필요
접근제어 지시자
- public : 어디서든 접근 허용
- protected : 상속관계에 놓여 있을 때, 유도 클래스에서의 접근 허용
- private : 클래스 내(클래스 내에 정의된 함수)에서만 접근 허용
class Car
{
private :
char gamerID[CAR_CONST::ID_LEN];
int fuelGauge;
int curSpeed;
public :
void InitMembers(char * ID, int fuel);
void ShowCarState();
void Accel();
void Break();
}
int main(void)
{
Car run99;
run99.InitMembers("run99",100);
run99.Accel();
}
- 객체 : 클래스를 대상으로 생성된 변수
- 멤버변수 : 클래스 내에 선언된 변수
- 멤버함수 : 클래스 내에 선언된 함수
C++ 에서의 파일 분할
-
클래스의 선언은 일반적으로 헤더파일에 삽입한다. 객체생성문 및 멤버의 접근 문장을 컴파일 하기 위해서 필요하다. 클래스의 이름을 떼서 Car.h로 헤더파일을 이름정의하기도한다.
-
단! 인라인 함수는 컴파일 과정에서 함수의 호출문을 대체해야 하기 때문에 헤더파일에 함께 정의되어야한다.
class Car
{
private:
char gameID[CAR_CONST::ID_LEN];
int fuelGauge;
int curSpeed;
public:
void InitMembers(char * ID, int fuel);
void ShowCasState();
void Accel();
void Break();
};
// 클래스의 멤버함수의 몸체는 다른 코드의 컴파일 과정에서 필요한게 아니다. 링크의 과정을 통해서 하나의 바이너리로 구성만 되면 된다. 따라서 cpp 파일에 정의하는 것이 일반적이다. 클래스의 이름을 따서 Car.cpp로 소스파일의 이름을 정의하기도 한다.
void Car::InitMembers(char * ID, int fuel) {...}
void Car::ShowCarState() {...}
void Car::Accel() {...}
void Car::Break() {...}
객체지향 프로그래밍의 이해
객체에 대한 간단한 정의
- 사전적 의미 : 물건 또는 대상
- 객체지향 프로그래밍 객체 중심의 프로그래밍
- 객체지향 프로그래밍은 현실에 존재하는 사물과 대상, 그리고 그에 따른 행동을 있는그대로 실체화 시키는 형태의 프로그래밍이다.
class FruitSeller { private: int APPLE_PRICE; int numOfApples; int myMoney; public: int SaleApple(int money) { int num = money/APPLE_PRICE; numOfApples -= num; myMoney += money; return num; } void ShowSaleResult() { cout<<"remained Apples : "<<numOfApples<<endl; cout<<"판배 수익 : "<<myMoney<<endl; } };
나를 표현하는 클랫의 정의와 객체 생성
class FruitBuyer
{
int myMoney;
int numOfApples;
public:
void InitMembers(int money)
{
myMoney -= money;
numOfApples= 0;
}
void BuyApples(FruitSeller &seller, int money)
...
}