3. 복합 데이터형(4) - 구조체

WanJu Kim·2022년 10월 17일
0

C++

목록 보기
10/81

다음으로 알아볼 것은 구조체이다. 게임에서 하나의 유닛에 대한 정보를 입력한다고 생각해보자. 예를 들어 스타크래프트의 유닛들은 각각 공격력, 방어력, 이동 속도, 등등이 다르다. 이 정보들을 묶을 수 있는 데이터 형식이 있으면 좋을 것이다. 배열은 이로 적합하지 않다. 왜냐하면 데이터형이 모두 같아야 하기 때문이다. 이때 사용하기 적합한 것이 바로 구조체이다. 구조체를 선언해보겠다.

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바이트.
profile
Question, Think, Select

0개의 댓글