언어/C

[코딩자율학습] 16일차 구조체

홍시_코딩기록 2024. 3. 25. 23:03

구조체란

#include <stdio.h>

int main(void) {
	char* name = "나도게임";
	int year = 2022;
	int price = 50;
	char* company = "나도회사";
	
	char* name2 = "너도게임";
	int year2 = 2022;
	int price2 = 100;
	char* company2 = "너도회사";
	return 0;
}
  • 정보를 하나로 관리하면 좋을 때 구조체 를 사용.

 

//형식
struct 구초제명 {
	자료형1 변수명1;
	자료형2 변수명2;
	자료형3 변수명3;
	...
};

struct GameInfo {
	char* name;
	int year;
	int price;
	char* company;
};
  • GameInfo 의 변수들은 각각 GameInfo 구조체를 구성하는 멤버가 됨.
  • main 함수 위 전역 위치에 정의
  • 여러 자료형으로 된 변수들을 묶어 하나의 새로운 자료형으로 정의하는 것
  • 구조체의 이름과 멤버를 사용자가 직접 정의할 수 있어서 사용자 정의 자료형 이라고 함.

 

 

구조체 변수 선언하기

  • 구조체를 사용하려면 먼저 구조체를 변수로 선언해야함.
struct 구조체명 변수명;

struct GameInfo gameInfo1;
  • 구조체 변수에 값을 젖아할 때는 마침표(.)로 변수명과 멤버명을 연결해 구조체의 멤버를 지정한 후 값을 저장.

 

 

(구조체 변수 코드)

#include <stdio.h>

struct GameInfo {
	char* name;
	int year;
	int price;
	char* company;
};

int main(void) {
	struct GameInfo gameInfo1;

	//구조체 멤버 저장
	gameInfo1.name = "나도게임";
	gameInfo1.year = 2022;
	gameInfo1.price = 50;
	gameInfo1.company = "나도회사";

	//구조체 멤버 출력
	printf("== 게임 출시 정보 = \\n");
	printf("게임 이름: %s\\n", gameInfo1.name);
	printf("게임 연도: %d\\n", gameInfo1.year);
	printf("게임 가격: %d\\n", gameInfo1.price);
	printf("게임 회사: %s\\n", gameInfo1.company);
}

////출력////
== 게임 출시 정보 =
게임 이름: 나도게임
게임 연도: 2022
게임 가격: 50
게임 회사: 나도회사
  • 타입스크립트 타입 선언과 자바스크립트 객체 배열 쓰는 너낌으로 이해함

 

	//구조체 멤버 저장2
	struct GameInfo gameinfo2 = { "너도게임", 2022, 100, "너도회사" };
	//구조체 멤버 출력
	printf("\\n== 게임 출시 정보 = \\n");
	printf("게임 이름: %s\\n", gameinfo2.name);
	printf("게임 연도: %d\\n", gameinfo2.year);
	printf("게임 가격: %d\\n", gameinfo2.price);
	printf("게임 회사: %s\\n", gameinfo2.company);
  • 더 간단하게 중괄호를 사용해 값을 한꺼번에 초기화하는 방식

 

구조체 배열 만들기

struct 구조체명 배열명[배열크기];

struct GameInfo gameArray[2] = {
	{" 나도게임", 2022, 50, "나도회사" },
	{"너도게임", 2022, 100, "너도회사" }
}

구조체 변수 2개를 연속해서 저장할 수 있음.

배열 크기가 2일 떄는 2차원 배열 때처럼 중괄호 2개를 넣고 쉼표로 구분한 후 다시 중괄호

 

 

구조체 사용하기

구조체 포인터 사용하기

//형식
struct 구조체명 * 변수명;

struct GameInfo * gamePtr;
gamePtr = &gameInfo1;
  • gamePtr은 구조체 변수 gameInfo1의 주소를 담고 있는 구조체 포인터.

 

	struct GameInfo* gamePtr;
	gamePtr = &gameInfo1;
	printf("== 미션맨의 게임 출시 정보 = \\n");
	printf("게임 이름: %s\\n", (*gamePtr).name);
	printf("게임 연도: %d\\n", (*gamePtr).year);
	printf("게임 가격: %d\\n", (*gamePtr).price);
	printf("게임 회사: %s\\n", (*gamePtr).company);
	
	
	//출력
	== 미션맨의 게임 출시 정보 =
	게임 이름: 나도게임
	게임 연도: 2022
	게임 가격: 50
	게임 회사: 나도회사
  • (*)안에 넣어야 오류가 안남.

 

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

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

int main(void) {
	struct GameInfo gameInfo1;

	//구조체 멤버 저장
	gameInfo1.name = "나도게임";
	gameInfo1.year = 2022;
	gameInfo1.price = 50;
	gameInfo1.company = "나도회사";
	struct GameInfo gameinfo2 = { "너도게임", 2022, 100, "너도회사" };
	gameInfo1.friendGame = &gameinfo2;
	printf("\\n== 다른 회사의 게임 출시 정보 = \\n");
	printf("게임 이름: %s\\n", gameInfo1.friendGame->name);
	printf("게임 연도: %d\\n", gameInfo1.friendGame->year);
	printf("게임 가격: %d\\n", gameInfo1.friendGame->price);
	printf("게임 회사: %s\\n", gameInfo1.friendGame->company);
	
	//출력
	== 다른 회사의 게임 출시 정보 =
	게임 이름: 너도게임
	게임 연도: 2022
	게임 가격: 100
	게임 회사: 너도회사
  • 구조체 안에 똑같이 생긴 구조체를 다시 한 번 정의할 수 있음.
  • friendGame은 구조체 GameInfo의 구조체 변수를 가리키는 구조체 포인터, 구조체 안에 있는 또 다른 구조체를 가리키는 역할을 함.
  • ‘너도회사’정보를 가진 gameInfo2변수의 주소를 저장하면 gameInfo1.frendGame이 gameInfo2를 가리켜서 다른 회사의 게임 정보도 접근 가능.
  • gameInfo1.friendGame이 가리키는 곳인 gameInfo2의 정보에 접근해 출력

 

typedef로 구조체 선언하기

  • 구조체를 선언할 때 typedef 키워드로 자료형을 간단하게 줄이는 방법이 있음.
  • 자료형에 별명을 붙인다고 생각!
int i = 1;
typedef int 정수;
//이제 int 대신 '정수'를 자료형으로 사용할 수 있음. / 실수도 됨.

정수 정수변수 = 3; // int i = 3;

GameInfo 구조체에 ‘게임정보’ 별명 붙여보기

 

 

#include <stdio.h>

struct GameInfo {
	char* name;
	int year;
	int price;
	char* company;
	struct GameInfo* friendGame; //구조체 포인터
};
typedef struct GameInformation { // 다른 방법
	char* name;
	int year;
	int price;
	char* company;
	struct GameInfo* friendGame;
} GAME_INFO;

int main(void) {
	typedef struct GameInfo 게임정보; //typedef 사용 방법
	게임정보 game1;
	game1.name = "한글 게임";
	game1.year = 2022;
	GAME_INFO game2;
	game2.name = "한글 게임2";
	game2.year = 2023;
	//구조체 멤버 출력
	printf("\\n== 게임 출시 정보 = \\n");
	printf("게임 이름: %s\\n", game1.name);
	printf("게임 연도: %d\\n", game1.year);
	printf("게임 이름: %s\\n", game2.name);
	printf("게임 연도: %d\\n", game2.year);
	return 0;
	}

 

  • GameInformation을 GAME_INFO로 치환
  • 별명으로 붙인 GAME_INFO 대신 원래대로 struct GameInfomation을 써도 됨.