구조체는 클래스의 일종이라고 할 수 있다.
클래스와 구조체 선언에 있어 유일한 차이점은 struct
가 아니라 class
로 선언하면 구조체가 아닌 클래스가 된다.
클래스를 정의한 이후 변수를 선언할 때 차이가 있다.
앞서 구조체는 Car run99 = {"run99", 100, 0}
과 같이 선언했지만, 클래스는 이 방식을 통해서 변수를 선언하지 못한다.
그 이유는 클래스 내에서 선언된 함수가 아닌, 다른 영역에서 변수를 초기화하려고 했기 때문이다.
클래스는 기본적으로 클래스 내에 선언된 변수는 클래스 내에 선언된 함수에서만 접근이 가능하다.
위 클래스의 정의에 따라서 Car run99;
와 같이 클래스 변수를 선언한다.
클래스는 정의를 하는 과정에서 각 변수 및 함수의 접근 허용범위를 별도로 선언해야 한다.
접근제어 지시자는 총 세가지가 존재한다.
protected는 상속과 관련이 있기 때문에 상속에서 제대로 배운다
public과 private가 가장 많이 쓰인다
#include <iostream>
#include <cstring>
using namespace std;
namespace CAR_CONST
{
enum
{
ID_LEN = 20,
MAX_SPD = 200,
FUEL_STEP = 2,
ACC_STEP = 10,
BRK_STEP = 10
};
}
class Car
{
private:
char gamerID[CAR_CONST::ID_LEN];
int fuelGauge;
int curSpeed;
public:
void InitMembers(const char *ID, int fuel);
void ShowCarState();
void Accel();
void Break();
};
void Car::InitMembers(const char *ID, int fuel)
{
strcpy(gamerID, ID);
fuelGauge = fuel;
curSpeed = 0;
}
void Car::ShowCarState()
{
cout << "소유자 ID: " << gamerID << endl;
cout << "연료량: " << fuelGauge << '%' << endl;
cout << "현재속도: " << curSpeed << "km/s" << '\n'
<< endl;
}
void Car::Accel()
{
if (fuelGauge <= 0)
{
return;
}
else
{
fuelGauge -= CAR_CONST::FUEL_STEP;
}
if ((curSpeed + CAR_CONST::ACC_STEP) >= CAR_CONST::MAX_SPD)
{
curSpeed = CAR_CONST::MAX_SPD;
return;
}
curSpeed += CAR_CONST::ACC_STEP;
}
void Car::Break()
{
if (curSpeed < CAR_CONST::BRK_STEP)
{
curSpeed = 0;
return;
}
curSpeed -= CAR_CONST::BRK_STEP;
}
int main()
{
Car run99;
run99.InitMembers("run99", 100);
run99.Accel();
run99.Accel();
run99.Accel();
run99.ShowCarState();
run99.Break();
run99.ShowCarState();
return 0;
}
처음에 클래스를 선언할 때, private를 선언하고, public을 선언했다.