C++ 구조체

ROK·2022년 11월 28일
0

열혈 C++

목록 보기
1/2

C++에서의 구조체

앞서 자료구조를 공부하면서 C에서의 구조체는 많이 사용해봐서 눈에 익은 상태이다.
C++에서도 구조체는 크게 다른 점은 없다.

앞서 C에서는 구조체 변수를 선언할 때, typedef struct 변수명과 같이 선언했었다.
하지만 C++에서는 typedef를 생략하고 struct 변수명과 같은 형식으로 선언할 수 있다.
그리고 구조체를 기반으로 정의된 자료형의 변수 선언방식도 일반 변수와 차이가 없다. 여기서도 typedef를 생략할 수 있다.

C

typedef struct Car {
	int speed;
    int fuel;
}

typedef Car basicCar;

C++

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;
}

구조체 안에 enum 상수 선언

위 예제들에는 매크로 상수들이 존재한다. 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;
}
profile
하루에 집중하자

0개의 댓글