구조체란
#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을 써도 됨.
'언어 > C' 카테고리의 다른 글
[코딩자율학습] 18일차 파일입출력 (0) | 2024.03.27 |
---|---|
[코딩자율학습] 17일차 너 내 도도독 집사가 되어라 (1) | 2024.03.26 |
[코딩자율학습] 15일차 동물카드 뒤집기 프로젝트 (0) | 2024.03.24 |
[코딩자율학습] 14일차 다차원 배열 (0) | 2024.03.21 |
[코딩자율학습] 13일차 프로젝트 어항에 물주기 (0) | 2024.03.20 |