본문 바로가기

C++

C++ 구조체(struct)

구조체란 연관있는 데이터를 하나로 묶을 수 있는 문법적 장치이다.

 

플레이어를 만들게되면

체력,마나,이동속도,공격력등등이 존재할것이다.

이것들을 관리하기 위해서 변수 4개를 만드는건 너무 불편하다고 느낄것이다.

이런 문제를 해결해주는게 구조체이다

struct Player
{
    int HP;
    int MP;
    float Speed;
    int Damage;
};

int main()
{
    Player player_0;
    player_0.HP = 100;
    player_0.MP = 10;
    player_0.Speed = 0.7f;
    player_0.Damage = 7;
    
    player ={100,10,0.7f,7};시
}

이런식으로 하나의 변수를 만들어서 편하게 관리할수있다.

구조체는 하나하나 넣어서 초기화할수있지만 마지막 문구처럼 배열처럼 초기화할수있다.

다만 이때 주의할점이 double을 int에 대입하게되면 원래는 컴파일러가 묵시적 형변환을 해주는데 해당 상황에서는

묵시적 형변환이 수행되지않고 Error를 호출하게된다.

 

구조체 에서 맴버에 접근 할때에는 .을 이용한느데 .은 Dot으로 읽는다.

 

구조체 안에는 저런 변수뿐만아이라 함수도 만들수있다.

struct Player
{
    int HP;
    int MP;
    float Speed;
    int Damage;

    void InValue(int HP, int MP, float Speed, int Damage)
    {
        this->HP = HP;
        this->MP = MP;
        this->Speed = Speed;
        this->Damage = Damage;
    }
};

int main()
{
    Player player_0;
    player_0.InValue(100, 10, 0.7f, 7);
    cout << player_0.HP << endl;
}

초기화를 해주는 함수를 만들어서 main부분에서 편하게 초기화를 할수있도록 하였다.

또한 구조체안의 함수를 너무 많이 만들게되어 해당 구조체의 흐름 및 골격을 분석하기 힘들경우에는

아래와 같은방법으로 함수의 선언만 구조체 안에서 구현내용은 밖으로 빼서 작성할수있다.

struct Player
{
    int HP;
    int MP;
    float Speed;
    int Damage;

    void InValue(int HP, int MP, float Speed, int Damage);
};

void Player::InValue(int HP, int MP, float Speed, int Damage)
{
    this->HP = HP;
    this->MP = MP;
    this->Speed = Speed;
    this->Damage = Damage;
}

이런식으로 하게되면 해당 구조체가 무슨 기능을 하는지만 빠르게 파악할수있다.

그리고  구조체 안에 함수가 정의되어 있으면, 함수를 인라인으로 처리하게된다.

반면 위의 예제처럼 함수를 구조체 밖으로 빼내면, 이러한 의미가 사라진다. 따라서 인라인의 의미를

그대로 유지할려면 inline을 이용해서 인라인 처리를 명시적으로 지시하여야한다.

inline void Player::InValue(int HP, int MP, float Speed, int Damage)
{
    this->HP = HP;
    this->MP = MP;
    this->Speed = Speed;
    this->Damage = Damage;
}

 

struct 별명 만들기
typedef은 자료형의 별명을 붙이는 기능을 한다.
typedef int a;라고 명시해 준다면
a iA = 10;이라고 하면 정수형 메모리를 만든다 이유는 내가 int를 a로 부르겠다고 명시했기 때문이다.
이 기능을 이용하면 struct의 긴 이름을 짧게 부를 수 있는데

typedef struct Player
{
    int HP;
    int MP;
    float Speed;
    int Damage;

} P;

int main()
{
    P player_0;
    player_0 = { 100,100,0.7f, 10 };
}

struct에서는 struct의 끝에다가 별명을 붙여주면된다.

Player라는 이름을 P로 부르겠다고 선언하였고 main함수에서 P라는 변수를 만들어 사용하였다.

 

strcut의 사이즈 구하기

struct Player
{
    int HP; // 4
    int MP; // 4
    float Speed; // 4
    double Damage; // 8
};

int main()
{
    Player player_0;
    cout << sizeof(Player) << endl; 
 }

해당 struct의 사이즈를 출력해보면 24가 출력이 된다. 모든 자료형을 합치면 20인데 이상하다.
구조체의 크기는 구조체의 멤버 변수들의 크기를 전부다 합한 것이 아니다.
구조체의 크기는 일단 구조체에서 제일 사이즈가 큰 자료형을 찾고 해당 자료형을 만든 다음
처음부터 넣기 시작한다. 그러다가 사이즈가 꽉 차면 가장 큰 자료형만큼 사이즈를 늘리는 식으로 만드는데
위에 예제에서는 일단 8btye가 제일 크다 그러면 8의 크기를 만든 후 HP, MP를 담을 int형을 넣는다
그러면 8byte가 전부다 차고 Speed를 넣어야 하니 8btye를 추가하여 16byte가 된다 그러고 Speed를
넣으면 12byte가 차고 여기서 또 8btye를 넣어야 하니 사이즈를 추가해 총 24byte가 된 것이다.
이렇게 하면 4byte가 남게 되는데 이때 생긴 빈 공간을 padding byte라고 한다.

'C++' 카테고리의 다른 글

C++ explicit  (0) 2020.07.30
C++ Friend  (0) 2020.07.30
Inline함수  (0) 2020.01.19
C++의 Casting,형변환  (0) 2020.01.19
STL vector에서 push_back과 emplace_back의 차이점  (0) 2019.12.04