Software Development/C, C++

[C++] C++에서의 구조체

huiyu 2018. 12. 15. 13:31

- 구조체란?
 : 구조체는 연관 있는 데이터를 묶을 수 있는 문법적 장치


C언어에서의 구조체 변수 선언

  struct Car basicCar;
  struct Car simpleCar;

 -> 키워드 struct는 이어서 선언되는 자료형이 구조체를 기반으로 정의된 자료형임을 나타낸다.

그러나 c++에서는 일반 변수와 같이 선언한다.

 Car basicCar;
 Car simpleCar;


- 구조체 안에 함수 삽입

 : C++에서는 구조체 안에 종속적인 함수들을 삽입하는 것이 허용된다.

 * 구조체에 종속적인 함수들은 구조체에 넣을 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct Car
{
  char gamerID[ID_LEN];
  int fuelGaunge;
  int curSpeed;
  void SHowCartState()
  {
    ...
  }
  void Accel()
  {
    ...
  }
  void Break()
  {
    ...
  }
}
cs

* 구조체 안에 함수가 정의되어 있으면, 함수를 인라인으로 처리하라는 의미를 내포한다.


- 구조체 안에 enum 상수 선언

 구조체에게만 의미있는 eunm 상수 역시 구조체에 포함시킬 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
struct Car
{
  enum
  {
    ID_LEN    = 20,
    MAX_SPD   = 200,
    FUEL_STEP = 2,
    ACC_STEP  = 20,
    BRK_STEP  = 20
  };
 
  char gamerID[ID_LEN];
  int fuelGaunge;
  int curSpeed;
  void SHowCartState()
  {
    ...
  }
  void Accel()
  {
    ...
  }
  void Break()
  {
    ...
  }
}
cs

 * enum 선언을 구조체 내부에 삽입하는 것이 부담스럽다면,
namespace를 이용해서 상수가 사용되는 여역을 명시하는 것도 또다른 방법이 될 수 있다.

 이렇게 namepace를 이용하면, 몇몇 구조체들 사이에서만 사용하는 상수들을 선언할 때 특히 도움이 되며,
 위의 방법보다 가독성이 좋아지는 경향이 있다.

1
2
3
4
5
6
7
8
9
10
11
namespace CAR_CONST
{
  enum
  {
    ID_LEN    = 20,
    MAX_SPD   = 200,
    FUEL_STEP = 2,
    ACC_STEP  = 20,
    BRK_STEP  = 20
  };
}
cs

- 구조체 함수는 외부로 뺄 수 있다.

  : 함수가 포함되어 있는 C++의 구조체를 보는 순간, 다음의 정보가 눈에 들어와야 코드 분석이 용이하다.

   1) 선언되어 있는 변수정보
   2) 선언되어 있는 함수정보

 -> 프로그램을 분석할 때, 흐름 및 골격 위주로 분석하는 경우가 많다.
  그리고 이러한 겨우엔 함수의 기능만 파악을 하지, 함수의 세부구현까지 신경을 쓰지 않는다.
  따라서 구조체를 보는 순간, 정의되어 있는 함수의 종류와 기능이 한눈에 들어오게끔 코드를 작성하는 것이 좋다.
  구조체 내에 정의한 함수의 수가 많거나 그 길이가 길다면, 다음과 같이 구조체 밖으로 함수를 빼낼 필요가 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
struct Car
{
 
  char gamerID[ID_LEN];
  int fuelGaunge;
  int curSpeed;
  void ShowCartState();
  void Accel();
  void Break();
}
 
 
void Car::ShowCartState()
{
  ...
}
void Car::Accel()
{
  ...
}
void Car::Break()
{
  ...
}
cs

* 구조체 안에 함수를 선언하면, 인라인으로 처리하라는 의미를 내포한다.
 그러나 위와같이 구조체 밖으로 빼내면, 이러한 의미가 사라진다.
 따라서 인라인의 의미를 유지하려면 직접 inline 키워드를 이용해서 명시해야 된다.

1
2
3
4
5
6
7
8
9
10
11
12
inline void Car::ShowCartState()
{
  ...
}
inline void Car::Accel()
{
  ...
}
inline void Car::Break()
{
  ...
}
cs


참고자료 : 윤성우의 열혈 C++ 프로그래밍 03-1 C++에서의 구조체

728x90