본문 바로가기
c++

[C++] 구조체

by goblin- 2023. 2. 6.

우리는 연관있는 데이터를 하나로 묶고 프로그램의 구현 및 관리가 용이할 때 구조체를 사용한다.

 

다음 예는 구조체를 사용하여 자동차 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 안에 함수를 선언함으로서 종속시켰다.

구조체 안에 함수의 코드를 모두 작성하면 가독성이 떨어지므로 위의 코드와 같이 구조체 밖으로 함수를 빼냈다.