우리는 연관있는 데이터를 하나로 묶고 프로그램의 구현 및 관리가 용이할 때 구조체를 사용한다.
다음 예는 구조체를 사용하여 자동차 Car의 작동을 구현하였다.
#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{
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"<<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(void){
Car run99={"run99",100,0}; //구조체 변수 선언
Accel(run99);
Accel(run99);
ShowCarState(run99);
Break(run99);
ShowCarState(run99);
Car sped77={"sped77",100,0}; //구조체 변수 선언
Accel(sped77);
Accel(sped77);
Break(sped77);
ShowCarState(sped77);
return 0;
}
결과
소유자ID: run99
연료량: 96%
현재속도: 20km/s
소유자ID: run99
연료량: 96%
현재속도: 10km/s
소유자ID: sped77
연료량: 96%
현재속도: 10km/s
위의 코드에서 함수들은 구조체 Car에 종속적인 함수들이라고 말할 수 있다. 그럼에도 불구하고 전역함수의 형태를 띠기 때문에, 이 함수들이 구조체 Car에 종속적임을 나타내지 못하고 있는 상황이다. 따라서 다른 영역에서 이 함수를 호출하는 실수를 범할 수 있기 때문에 구조체 안에 함수를 삽입해야 한다.
#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"<<endl<<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(void){
Car run99={"run99",100,0};
run99.Accel();
run99.ShowCarState();
run99.Break();
run99.ShowCarState();
return 0;
}
결과
소유자ID: run99
연료량: 98%
현재속도: 10km/s
소유자ID: run99
연료량: 98%
현재속도: 0km/s
이름공간과 enum 열거형을 통하여 고정되는 값들을 지정하여 넣어주었다. 또한 구조체 Car 안에 함수를 선언함으로서 종속시켰다.
구조체 안에 함수의 코드를 모두 작성하면 가독성이 떨어지므로 위의 코드와 같이 구조체 밖으로 함수를 빼냈다.
'c++' 카테고리의 다른 글
[C++]파일분할 (0) | 2023.02.10 |
---|---|
[C++]클래스와 객체 (0) | 2023.02.09 |
[C++]동적 메모리 할당 및 반환(new, delete ) (0) | 2023.01.30 |
[C++]반환형이 참조형(Reference Type)인 경우 (0) | 2023.01.29 |
[C++]Call-by-value & Call-by-reference (참조자와 함수) (0) | 2023.01.26 |