C++기초
220323(2) - 구조체(Structure)
hyrule
2022. 3. 25. 16:50
#include <iostream>
//구조체도 우리만의 변수 타입을 만들어내는 문법 중 하나이다.
//enum과 비슷함.
/*
구조체 : 서로 다른 타입의 변수 여러개를 한번에 묶어서 하나의 사용자정의 변수 타입으로 만들어줄 수 있는 기능이다.
서로 다른 변수 여러개를 여러개 모아서 사용할 수가 있기 때문에 엄청 많이 쓰임
struct라는 키워드를 이용해 만들 수 있다.
struct 구조체이름
{
원하는 변수 선언
};
*/
struct MonsterInfo
{
char Name[32];
int Attack;
int Armor;
int HP;
int MP;
};
struct Test
{
char A;
int Number;
};
struct Test2
{
char A;
char B;
int Number;
};
struct Test3
{
char A;
char B;
int Number;
char C;
};
struct Test4
{
char A;
char B;
char c;
double Number1;
int Number;
};
struct Test5
{
};
struct Test6
{
char A;
};
int main()
{
//구조체 선언 뒤에 = {}을 해주면 구조체의 모든 멤버를 0으로 깔끔하게 초기화할 수 있다.
//배열처럼 연속된 공간에 변수들이 생성된다.
MonsterInfo Monster1 = {};
MonsterInfo Monster2 = { "오크", 10, 5, 50, 10 };
//선언된 구조체변수.~을 해서 안의 멤버에 접근할 수 있다,
std::cout << "이름 : " << Monster2.Name << std::endl;
std::cout << "공격력 : " << Monster2.Attack<< std::endl;
std::cout << "Sizeof Monster : " << sizeof(MonsterInfo) << std::endl;
//48바이트임을 알 수 있다.
//이름 1바이트 x32 + 공격력 4 아머 4 HP 4 MP 4 = 48
std::cout << "Sizeof Test : " << sizeof(Test) << std::endl;
//char(1) + int(4)이므로 5바이트가 나와야 하는데 8바이트가 나왔음.
//--> char(1) + 빈 3byte + int(4) 해서 8바이트가 나오는 것임.
std::cout << "Sizeof Test2 : " << sizeof(Test2) << std::endl;
//A(1) + B(1) + int(4) = 6이지만 패딩 byte 때문에 8byte
std::cout << "Sizeof Test3 : " << sizeof(Test3) << std::endl;
//계산대로라면 패딩 바이트가 1byte이고 8byte여야 하는데 새로운 패딩 바이트가 생성되어 12byte가 되었음
//순서에 따라서 달라짐
std::cout << "Sizeof Test4 : " << sizeof(Test4) << std::endl;
//24byte
std::cout << "Sizeof Empty Structure : " << sizeof(Test5) << std::endl;
/*
면접 문제에서 많이 나오는 문제
구조체에 아무것도 안넣으면 0byte가 나올 것이라 생각하지만 실제로는 1byte가 나옴.
멤버가 없더라도 최소바이트인 1바이트가 할당된다.
변수를 선언하게 되면 메모리에 공간이 잡혀야 하므로 최소 바이트 수인 1바이트 공간을 차지하게 하여 변수를 잡아주는 것이다.
프로그래밍 하면서 쓸 일은 없음.
*/
std::cout << "Sizeof Test6 : " << sizeof(Test6) << std::endl;
//size = 1
//가장 사이즈가 큰 변수가 1바이트이기 때문
//이 패딩 바이트의 크기는
//프로젝트 -> 속성 -> C/C++ -> 코드 생성 -> 구조체 멤버 맞춤에서 변경할 수 있음.
//기본값은 구조체 멤버 중 가장 공간을 크게 차지하는 값을 기준으로 메모리를 할당한다.
//
//그렇다면 왜 1byte로 안 하는가?
//--> 컴퓨터 입장에서는 메모리를 4byte단위로 잡는 것이 훨씬 이득이기 때문
//컴퓨터는 2의 n승 단위를 처리할 떄 연산 속도가 제일 빠르다.
//구조체를 이용하여 편하게 몬스터 정보를 생성할수 있다.
MonsterInfo MonsterArray[10] = {};
MonsterArray[0].Attack = 100;
MonsterInfo* pMonsterArray = MonsterArray;
pMonsterArray[0].Attack = 300;
std::cout << MonsterArray[0].Attack << std::endl;
pMonsterArray = &Monster1;
//역참조와 .둘중 .이 먼저 연산이 된다.
//그러므로 역참조가 먼저 연산이 되게 해야 하기 때문에 괄호로 묶어줘야 한다.
//연산자 우선순위 문제
(*pMonsterArray).Attack = 400;
//그런데 (*pMonsterArray). 이 내용을 줄여서
// pMonsterArray-> 로 사용할 수 있다.
pMonsterArray->Attack = 999;
//둘다 같은 문장임
std::cout << "Monster1 Attack : " << Monster1.Attack <<std::endl;
return 0;
}