Programming/TIL

[TIL] C언어 입문 14일차 (구조체)

catPaw 2025. 3. 9. 22:14

 

길벗 코딩 자율학습단 13기

https://cafe.naver.com/gilbutitbook/12930
C언어 입문 p.321 ~ 339


구조체 정의, 선언하기

구조체는 같은 형태의 정보들을 관리할 때 사용한다. 구조체는 여러 자료형으로 된 변수들을 묶어 하나의 새로운 자료형으로 정의하는 것이며, 이름과 멤버를 사용자가 직접 정의할 수 있기 때문에 사용자 정의 자료형(UDT, User-defined Data Type)이라고 한다.

#include <stdio.h>

int main(void) {
	char* name = "나도게임";
	int year = 2025;
	int price = 50;
	char* campany = "나도회사";

	char* name2 = "너도게임";
	int year2 = 2025;
	int price2 = 100;
	char* campany2 = "너도회사";
	return 0;
}

 

이런 중복되는 형태의 변수들을 하나로 묶어 아래처럼 관리한다. 구조체를 선언할 때는 struct 키워드와 구조체명까지 그대로 가져와 자료형에 넣고 뒤에 변수명을 적는다. 그리고 선언한 구조체 변수에 값을 저장할 때는 마침표(.)로 변수명과 멤버명을 연결해 구조체의 멤버를 지정한 후 값을 저장한다. 이 구조체에 사용한 마침표를 멤버 참조 연산자라고도 한다. 

#include <stdio.h>

//구조체 정의
struct GameInfo {
	char* name;
	int year;
	int price;
	char* campany;
};

int main(void) {
	//구조체 변수 선언
	struct GameInfo gameInfo1;
	//구조체 멤버 저장
	gameInfo1.name = "나도게임";
	gameInfo1.year = 2025;
	gameInfo1.price = 50;
	gameInfo1.campany = "나도회사";

	//구조체 선언과 동시에 초기화
	struct GameInfo gameInfo2 = { "너도게임" ,2025 ,100 ,"너도회사" };
	return 0;
}

구조체 배열 만들기

구조체를 선언할 때 아래와 같이 선언하면 구조체 변수 여러개를 연속해서 저장할 수 있다. 배열 크기에 따라서 중괄호를 넣고 쉼표로 구분한 후 다시 중괄호로 감싼다.

#include <stdio.h>

//구조체 정의
struct GameInfo {
	char* name;
	int year;
	int price;
	char* campany;
};

int main(void) {
	struct GameInfo gameArray[2] = {
		{ "나도게임" ,2025 ,50 ,"나도회사" },
		{ "너도게임" ,2025 ,100 ,"너도회사" }
	};
	return 0;
}

구조체 포인터 사용하기

#include <stdio.h>

//구조체 정의
struct GameInfo {
	char* name;
	int year;
	int price;
	char* campany;
};

int main(void) {
	struct GameInfo gameInfo1;
	gameInfo1.name = "나도게임";
	gameInfo1.year = 2025;
	gameInfo1.price = 50;
	gameInfo1.campany = "나도회사";

	struct GameInfo* gamePtr;
	gamePtr = &gameInfo1;
	printf("게임 이름 : %s\n", (*gamePtr).name);
	printf("발매 연도 : %d\n", (*gamePtr).year);
	printf("게임 가격 : %d\n", (*gamePtr).price);
	printf("제작 회사 : %s\n", (*gamePtr).campany);
	//printf("게임 이름 : %s\n", gamePtr->name);
	//printf("발매 연도 : %d\n", gamePtr->year);
	//printf("게임 가격 : %d\n", gamePtr->price);
	//printf("제작 회사 : %s\n", gamePtr->campany);
	return 0;
}

구조체 포인터는 구조체 변수의 주소를 가리키는 변수를 의미한다. 구조체 포인터로 변수에 접근해 멤버들을 가져올 때는 (*gamePtr).campany)와 같이 표현한다. 포인터는 주소를 담고 있기 때문에 *를 붙여 주소에 담긴 값을 가져와야 한다. 이때 소괄호를 쓰지 않으면 *(gamePtr.campany)로 인식하여 값을 제대로 가져올 수 없기 때문에 꼭 붙여줘야한다. 연산자 여러개를 작성하는 것이 귀찮다면 화살표 (->, 간접멤버 참조 연산자) 하나만 사용해도 된다.


구조체 안에 구조체 사용하기

#include <stdio.h>

//구조체 정의
struct GameInfo {
	char* name;
	int year;
	int price;
	char* campany;
	struct GameInfo* friendGame; //구조체 포인터
};

int main(void) {
	struct GameInfo gameInfo1;
	gameInfo1.name = "나도게임";
	gameInfo1.year = 2025;
	gameInfo1.price = 50;
	gameInfo1.campany = "나도회사";
	struct GameInfo gameInfo2 = { "너도게임" ,2025 ,100 ,"너도회사" };
	gameInfo1.friendGame = &gameInfo2;
	printf("게임 이름 : %s\n", gameInfo1.friendGame->name);
	printf("발매 연도 : %d\n", gameInfo1.friendGame->year);
	printf("게임 가격 : %d\n", gameInfo1.friendGame->price);
	printf("제작 회사 : %s\n", gameInfo1.friendGame->campany);
	return 0;
}

구조체를 정의할 때 구조체의 멤버로 구조체 포인터를 선언할 수 있다. 구조체 포인터는 구조체 안에 있는 또 다른 구조체를 가리키는 역할로, 다른 구조체 변수의 주소를 가져서 그 멤버에 접근할 수 있다.


궁금한 것 / 알게된 것

1) 구조체

2) 구조체 포인터 사용하기


후기 (。˃ ᵕ ˂ )b

구조체는 객체와 비슷한 것 같다. 근데 포인터가 진짜 헷갈린다.