다음으로 알아볼 것은 구조체이다. 게임에서 하나의 유닛에 대한 정보를 입력한다고 생각해보자. 예를 들어 스타크래프트의 유닛들은 각각 공격력, 방어력, 이동 속도, 등등이 다르다. 이 정보들을 묶을 수 있는 데이터 형식이 있으면 좋을 것이다. 배열은 이로 적합하지 않다. 왜냐하면 데이터형이 모두 같아야 하기 때문이다. 이때 사용하기 적합한 것이 바로 구조체이다. 구조체를 선언해보겠다.
struct unit // 구조체 선언.
{
char name[20];
int attack;
int defense;
float speed;
};
단순 데이터형에서 int나 char을 썼듯이, struct을 쓰면 구조체라는 것을 알려준다. unit은 구조체 이름이고, 중괄호 안에는 구조체를 구성하는 데이터형들의 리스트들을 넣으면 된다. 이 리스트에는 배열이나 또 다른 구조체를 포함해 c++가 제공하는 모든 데이터형을 넣을 수 있다. 이 리스트의 각 항목을 '멤버'라고 부른다. 따라서 unit 구조체는 4개의 멤버를 가지고 있다고 할 수 있다. 이렇게 구조체를 선언 후, 구조체를 데이터형으로 한 변수를 생성할 수 있다.
unit probe;
unit scv;
unit drone;
각각의 구조체 변수의 멤버에 접근하기 위해서는 .를 쓰면 된다.
probe.speed;
scv.attack;
처음에 이해하기 어려웠는데 병원의 진단표를 생각해보면 쉽다. 진단표의 형식은 정해져있다. 예를 들어 우리는 진단표에 이름, 주민번호, 사는 곳, 등등을 쓴다. 형식은 바뀌지 않지만 각각의 진단표마다 사람마다 모두 다른 내용을 작성할 수 있다.
사진 출처
구조체의 초기화 방법 및 특징들을 보자.
struct unit // 구조체 선언. unit은 '태그'라고도 부르고 새로운 데이터형의 이름으로 쓰임
{
char name[20];
int attack;
int defense;
float speed;
}; // ;주의.
unit marine = // 변수 생성.
{
"marine", // 순서대로 입력. 콤마로 구분. name에 해당.
6, // attack에 해당.
0, // defense에 해당.
1.875f // speed에 해당.
};
unit zealot =
{
"zealot",
16,
1,
1.875f
};
cout << "질럿을 영어로 표기하면 " << zealot.name << "이다." << endl;
cout << "마린이 질럿을 공격하면 질럿의 체력이 " << marine.attack - zealot.defense
<< "만큼 줄어든다." << endl;
가독성을 높이기 위해 멤버를 각각 한 줄에 썼다. 한 줄에 여러 멤버를 써도 괜찮지만, 반드시 콤마로 구분을 해주어야 한다.
unit zealot = {"zealot", 16, 1, 1.875f};
unit zealot {"zealot", 16, 1, 1.875f} // 이렇게도 가능하다.
구조체끼리 대입도 가능하다.
struct unit
{
char name[20];
int attack;
int defense;
float speed;
};
unit marine =
{
"marine",
6,
0,
1.875f
};
unit zealot =
{
"zealot",
16,
1,
1.875f
};
cout << "질럿의 공격력 = " << zealot.attack << endl;
zealot = marine;
cout << "질럿의 공격력 = " << zealot.attack << endl;
실행 결과.
이것은 물론 같은 구조체형 변수일 때만 가능하다.
구조체 변수를 하나만 만드는 초기화 방식도 있다.
struct
{
int x;
int y;
} onlyone;
onlyone.x; //접근은 가능.
이런식으로 만들면 접근은 가능하다, 다른 구조체 변수를 만들 수는 없다. (잘 쓰지는 않는듯...)
구조체도 배열로 만들 수 있다.
struct unit
{
char name[20];
int attack;
int defense;
float speed;
};
unit units[2] =
{
{"marine", 6, 0, 1.875f},
{"zealot", 16, 1, 1.875f}
};
구조체의 크기는 그 구조체 안에 멤버가 얼마나 있느냐에 따라 달라진다.
struct unit
{
char name[20]; // 20바이트.
int attack; // 4바이트.
int defense; // 4바이트.
float speed; // 4바이트.
};
unit units[3] =
{
{"marine", 6, 0, 1.875f},
{"zealot", 16, 1, 1.875f},
{"drone", 5, 0, 1.875f}
};
cout << sizeof(unit) << endl; // 합해서 32바이트.
cout << sizeof(units) << endl; // 32 * 3 3바이트.