앞서 자료구조를 공부하면서 C에서의 구조체는 많이 사용해봐서 눈에 익은 상태이다.
C++에서도 구조체는 크게 다른 점은 없다.
앞서 C에서는 구조체 변수를 선언할 때, typedef struct 변수명
과 같이 선언했었다.
하지만 C++에서는 typedef
를 생략하고 struct 변수명
과 같은 형식으로 선언할 수 있다.
그리고 구조체를 기반으로 정의된 자료형의 변수 선언방식도 일반 변수와 차이가 없다. 여기서도 typedef
를 생략할 수 있다.
typedef struct Car {
int speed;
int fuel;
}
typedef Car basicCar;
struct Car {
int speed;
int fuel;
}
Car basicCar;
#include <iostream>
using namespace std;
#define ID_LEN 20
#define MAX_SPD 200
#define FUEL_STEP 2
#define ACC_STEP 10
#define BRK_STEP 10
struct Car
{
const char gamerID[ID_LEN];
int fuelGauge;
int curSpeed;
};
void ShowCarState(const Car &car)
{
cout << "소유자ID: " << car.gamerID << endl;
cout << "연료량: " << car.fuelGauge << "%" << endl;
cout << "현재속도: " << car.curSpeed << "km/s" << '\n'
<< endl;
}
void Accel(Car &car)
{
if (car.fuelGauge <= 0)
{
return;
}
else
{
car.fuelGauge -= FUEL_STEP;
}
if (car.curSpeed + ACC_STEP >= MAX_SPD)
{
car.curSpeed = MAX_SPD;
return;
}
car.curSpeed += ACC_STEP;
}
void Break(Car &car)
{
if (car.curSpeed < BRK_STEP)
{
car.curSpeed = 0;
return;
}
car.curSpeed -= BRK_STEP;
}
int main()
{
Car run99 = {"run99", 100, 0};
Accel(run99);
Accel(run99);
ShowCarState(run99);
Break(run99);
ShowCarState(run99);
Car sped77 = {"sped77", 100, 0};
Accel(sped77);
Break(sped77);
ShowCarState(sped77);
return 0;
}
#include <iostream>
using namespace std;
#define ID_LEN 20
#define MAX_SPD 200
#define FUEL_STEP 2
#define ACC_STEP 10
#define BRK_STEP 10
struct Car
{
const char gamerID[ID_LEN];
int fuelGauge;
int curSpeed;
void ShowCarState()
{
cout << "소유자: " << gamerID << endl;
cout << "연료량: " << fuelGauge << '%' << endl;
cout << "현재속도: " << curSpeed << "km/s" << '\n'
<< endl;
}
void Accel()
{
if (fuelGauge <= 0)
return;
else
fuelGauge -= FUEL_STEP;
if (curSpeed + ACC_STEP >= MAX_SPD)
{
curSpeed = MAX_SPD;
return;
}
curSpeed += ACC_STEP;
}
void Break()
{
if (curSpeed < BRK_STEP)
{
curSpeed = 0;
return;
}
curSpeed -= BRK_STEP;
}
};
int main()
{
Car run99 = {"run99", 100, 0};
run99.Accel();
run99.Accel();
run99.ShowCarState();
run99.Break();
run99.ShowCarState();
Car sped77 = {"sped77", 100, 0};
sped77.Accel();
sped77.Break();
sped77.ShowCarState();
return 0;
}
위 예제들에는 매크로 상수들이 존재한다. ex) #define ID_LEN
이 상수들 또한 선언한 구조체에만 의미가 있는 상수들이므로 구조체 내에 포함시키는 것이 더 깔끔하게 표현할 수 있다.
열거형 enum을 이용해 구조체 내에서만 유요한 상수를 정의한다.
#include <iostream>
using namespace std;
namespace CAR_CONST
{
enum
{
ID_LEN = 20,
MAX_SPD = 200,
FUEL_STEP = 2,
ACC_STEP = 10,
BRK_STEP = 10
};
}
struct Car
{
... 생략
}
구조체를 볼때 정보들이 한눈에 들어와야 좋은 코드라고 할 수 있다.
보기 좋게 정리하기 위해서 구조체 내부에서는 함수의 선언만 한 이후, 구조체 외부에서 함수를 정의할 수 있다.
함수를 외부로 뺏을때는 함수가 어디에 정의되어 있는지 정보를 추가해주어야 한다.
std::cout, std::cin과 같은 방식으로 Car::ShowCarState()와 같이 정의한다.
#include <iostream>
using namespace std;
namespace CAR_CONST
{
enum
{
ID_LEN = 20,
MAX_SPD = 200,
FUEL_STEP = 2,
ACC_STEP = 10,
BRK_STEP = 10
};
}
struct Car
{
char gamerID[CAR_CONST::ID_LEN];
int fuelGauge;
int curSpeed;
void ShowCarState();
void Accel();
void Break();
};
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", 100, 0};
run99.Accel();
run99.ShowCarState();
run99.Break();
run99.ShowCarState();
return 0;
}