[C] 8. struct (구조체)

Kim Dongil·2022년 10월 12일
0

C

목록 보기
9/28

구조체 (기본, 사용, 배열, 포인터, 구조체 안의 구조체, typedef)

#include <stdio.h>

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

	struct GameInfo* friendGame; // 연관 업체 게임
};

typedef struct  {
	char* name;
	int year;
	int price;
	char* company;

	struct GameInfo* friendGame; // 연관 업체 게임
} GAME_INFO;
int main(void)
{
	// [게임 출시]
	// 이름 : 나도게임
	// 발매년도 : 2017년
	// 가격 : 50원
	// 제작사 : 나도회사

	char* name = "나도게임";
	int year = 2017;
	int price = 50;
	char* company = "나도회사";

	// [또 게임 출시]
	// 이름 : 너도게임
	// 발매년도 : 2017년
	// 가격 : 100원
	// 제작사 : 너도회사

	char* name2 = "너도게임";
	int year2 = 2017;
	int price2 = 100;
	char* company2 = "너도회사";

	// 구조체 사용
	struct GameInfo gameInfo1;
	//struct GameInfo gameInfo2;
	gameInfo1.name = "나도게임";
	gameInfo1.year = 2017;
	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);

	// 구조체를 배열처럼 초기화
	struct GameInfo gameInfo2 = { "너도게임", 2017, 100, "너도회사" };
	printf("\n\n-- 또 다른 게임 출시 정보 -- \n");
	printf("  게임명  : %s\n", gameInfo2.name);
	printf("  발매년도  : %d\n", gameInfo2.year);
	printf("  가격  : %d\n", gameInfo2.price);
	printf("  제작사  : %s\n", gameInfo2.company);

	// 구조체 배열
	struct GameInfo gameArray[2] = {
	{ "나도게임", 2017, 50, "나도회사" } ,
	{ "너도게임", 2017, 100, "너도회사" } 
	};

	// 구조체 포인터 
	struct GameInfo* gamePtr; // 미션맨
	gamePtr = &gameInfo1;
	printf("\n\n-- 미션맨의 게임 출시 정보 -- \n");
	/*printf("  게임명  : %s\n", (*gamePtr).name);
	printf("  발매년도  : %d\n", (*gamePtr).year);
	printf("  가격  : %d\n", (*gamePtr).price);
	printf("  제작사  : %s\n", (*gamePtr).company);*/
	printf("  게임명  : %s\n", gamePtr->name);
	printf("  발매년도  : %d\n", gamePtr->year);
	printf("  가격  : %d\n", gamePtr->price);
	printf("  제작사  : %s\n", gamePtr->company);

	// 연관 업체 게임 소개
	gameInfo1.friendGame = &gameInfo2;
	printf("\n\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);

	// typedef
	// 자료형에 별명 지정
	int i = 1;
	typedef int 정수;
	typedef float 실수;
	정수 정수변수 = 3; // int i = 3;
	실수 실수변수 = 3.23f; // float f = 3.23f;
	printf("\n\n정수변수 : %d, 실수변수 %.2f\n\n", 정수변수, 실수변수);

	typedef struct GameInfo 게임정보;
	게임정보 game1;
	game1.name = "한글 게임";
	game1.year = 2015;

	GAME_INFO game2;
	game2.name = "한글 게임2";
	game2.year = 2014;

	/*struct GameInformation game3;
	game3.name = "한글 게임3";*/

	return 0;
}


구조체의 정의와 구조체 변수의 선언을 동시에 할 수도 있습니다.

구조체 포인터를 이용하여 구조체의 멤버에 접근하는 방법에는 다음과 같이 두 가지 방법이 있습니다

  1. 참조 연산자(*)를 이용하는 방법

    참조 연산자(*)는 멤버 연산자(.)보다 연산자 우선순위가 낮으므로 반드시 괄호(())를 사용해야 합니다.

  2. 화살표 연산자(->)를 이용하는 방법

typedef : 이미 존재하는 타입에 새로운 이름을 붙일 때 사용합니다.

구조체 변수를 선언하거나 사용할 때에는 매번 struct 키워드를 사용하여 구조체임을 명시해야 합니다.

하지만 typedef 키워드를 사용하여 구조체에 새로운 이름을 선언하면 매번 struct 키워드를 사용하지 않아도 됩니다.

Project 너, 내 집사가 되어라 (본격 고양이 수집 게임)

#include <stdio.h>
#include <time.h>

// 5마리의 고양이가 있다
// 아무 키나 눌러서 랜덤으로 고양이를 뽑되,
// 5마리 모두 다 수집을해서 열심히 키우면 되는 게임 ! 
// 중 복 발 생 가 능 ! 

// 고양이 
// 이름, 나이, 성격, 키우기 난이도 (레벨)

typedef struct {
	char* name; // 이름
	int age; // 나이
	char* character; // 성격
	int level; // 키우기 난이도 (1~5, 5가 어려움)
} CAT;

int collection[5] = { 0, 0, 0, 0, 0 }; // 현재까지 보유한 고양이

CAT cats[5]; // 전체 고양이 리스트 

void initCats(); // 고양이 정보 초기화
void printCat(int selected); // 뽑은 고양이 정보

int main(void)
{
	srand(time(NULL));

	initCats();
	while (1)
	{
		printf("두근두근~! 어느 고양이의 집사가 될까요? \n 아무 키나 눌러서 확인하세요! \n");
		getchar();

		int selected = rand() % 5; // 0~4 사이의 숫자 반환
		printCat(selected); // 뽑은 고양이 정보 출력
		collection[selected] = 1; // 고양이 뽑기 처리

		int collectAll = checkCollection();
		if (collectAll == 1)
		{
			break;
		}
	}


	return 0;
}

void initCats()
{
	cats[0].name = "깜냥이";
	cats[0].age = 5;
	cats[0].character = "온순";
	cats[0].level = 1;

	cats[1].name = "귀요미";
	cats[1].age = 3;
	cats[1].character = "날카롭";
	cats[1].level = 2;

	cats[2].name = "수줍이";
	cats[2].age = 7;
	cats[2].character = "늘 잠만 잠";
	cats[2].level = 3;

	cats[3].name = "까꿍이";
	cats[3].age = 2;
	cats[3].character = "시끄러움";
	cats[3].level = 4;

	cats[4].name = "돼냥이";
	cats[4].age = 1;
	cats[4].character = "배고픔";
	cats[4].level = 5;
}

void printCat(int selected)
{
	printf("\n\n === 당신은 이고양이의 집사가 되었어요! === \n\n");
	printf(" 이름       : %s\n", cats[selected].name);
	printf(" 나이       : %d\n", cats[selected].age);
	printf(" 특징(성격) : %s\n", cats[selected].character);
	printf(" 레벨       : ");

	for (int i = 0; i < cats[selected].level; i++)
	{
		printf("%s", "*");
	}
	printf("\n\n");
}

int checkCollection()
{
	// 1. 현재 보유한 고양이 목록도 출력
	// 2. 다 모았는지 여부를 반환
	int collectAll = 1;

	printf("\n\n === 보유한 고양이 목록이에요 === \n\n");
	for (int i = 0; i < 5; i++)
	{
		if (collection[i] == 0) // 고양이 수집 X
		{
			printf("%10s", "(빈 박스)");
			collectAll = 0; // 다 모으지 못한 상태 
		}
		else // 고양이 수집 0
		{
			printf("%10s", cats[i].name);
		}
	}
	printf("\n================================\n\n");

	if (collectAll) // 모든 고양이를 다 모은 경우
	{
		printf("\n\n 축하합니다 ! 모든 고양이를 다 모았어요. 열심히 키워주세요\n\n");
	}

	return collectAll;
}

getchar(); :

(1) getchar() 가 실행되면 문자열 or 문자를 입력 받는다.

(2) 문자열 or 문자을 바로 char ch; 에 저장되는 것이 아니라 입력버퍼에 저장된다.

(3) getchar()의 반환값으로 입력버퍼에서 문자 한 개를 꺼내서 ch에 저장한다.

예제 :

(1) getchar()를 실행했을 때 문자열 "abc"를 입력한다. //7행

(2) 첫번째 getchar()의 반환 값으로 a가 반환된 다음 ch에 저장된다. //7행

(3) 두번째 getchar()의 반환 값으로 b가 반환된 다음 ch에 저장된다. //8행

(4) printf()를 이용하여 ch를 출력하면 두번째 반환 값이 b가 출력된다. //9행

C 언어 무료 강의 (입문부터 게임 개발까지)
포인터와 구조체
[C언어] getchar() 함수

0개의 댓글