1) 구조체의 개념
- 여러 종류의 기본 자료형들을 묶어 놓은 것
- 사용자 정의 자료형
- 구조체에 묶여있는 각각의 자료형을 멤버(member) 또는 필드(field)라고 함
- 구조체를 정의한 후 고조체 변수를 선언하여 사용함
2) 구조체 정의
- struct 키워드 사용
- 구조체 이름은 대문자를 사용하여 정의 (소문자도 가능)
- 일반적으로 함수 외부에 선언
3) 구조체 변수 선언
- 구조체 정의와 동시에 변수 선언 가능
- 구조체 정의와 별도로 변수 선언 가능
4) 구조체 멤버의 사용
- 점(.)을 이용하여 멤버 사용
5) 구조체 변수의 복사
- 구조체 멤버 변수 모두 복사됨
6) 구조체 포인터
- 구조체를 가리키는 포인터 변수
1) 함수에서 구조체 사용하기
- 함수의 인수, 매개변수, 반환값으로 사용 가능
- 값에 의한 호출과 참조에 의한 호출 사용 가능
2) 중첩 구조체 사용하기
- 구조체 내부에 또 다른 구조체를 선언
- 점(.)을 연속으로 사용하여 구조체를 사용함
3) 공용체(union)
- 공용체 멤버 변수들은 동일한 메모리 공간을 공유(메모리 공간 절약)
- union 키워드를 사용하여 공용체 정의
- 공용체 변수 선언 후 사용
- 공용체 멤버 변수는 점(.)으로 참조
4) 열거형(enumeration)
- 기호 상수들을 모아놓은 자료형 : 상수값은 0부터 1씩 증가됨
- enum 키워드를 사용하여 정의
- 열거형 변수 선언 후 사용
5) typedef 문
- 복잡한 자료형의 별명을 정의하는 키워드
- 새로운 자료형의 이름 끝에는 "_t"를 붙임
- 일반 자료형, 공용체, 구조체, 열거형과 같이 사용
1) 구조체를 활용하여 가족의 신상을 입력받아 출력하시오
#include <stdio.h>
#define SIZE 4
void print_family();
char* trans_relation(int relation);
typedef enum RELATIONSHIP { FATHER, MOTHER, BROTHER, SISTER } RS_t; // 가족관계 열거형
typedef struct MEMBER {
RS_t relation; // 가족관계
char l_name[20]; // 이름
int age; // 나이
char phone[20]; // 전화번호
} MB_t;
typedef struct FAMILY {
char f_name[20]; // 아빠 성
char m_name[20]; // 엄마 성
MB_t f_member[SIZE]; // 가족 구성원 배열 4명
} FM_t;
FM_t f_value; // 전역변수 선언
int main()
{
// 입력받기
printf("가족(아빠)의 성을 입력하세요 = ");
scanf_s("%s", f_value.f_name, sizeof(f_value.f_name));
printf("가족(엄마)의 성을 입력하세요 = ");
scanf_s("%s", f_value.m_name, sizeof(f_value.m_name));
for (int i = 0; i < SIZE; i++) {
printf("%d 번째 가족 신상을 입력합니다.\n", i + 1);
printf("가족관계를 선택하세요. 부(0), 모(1), 형제(2), 자매(3) = ");
scanf_s("%d", &f_value.f_member[i].relation);
getchar();
printf("이름을 입력하세요 = ");
scanf_s("%s", f_value.f_member[i].l_name, sizeof(f_value.f_member[i].l_name));
getchar();
printf("나이를 입력하세요 = ");
scanf_s("%d", &f_value.f_member[i].age);
getchar();
printf("전화 번호를 입력하세요 = ");
scanf_s("%s", f_value.f_member[i].phone, sizeof(f_value.f_member[i].phone));
getchar();
}
print_family(); // 가족 현황을 출력
}
void print_family() {
printf("######################################\n");
printf("관계\t성명\t나이\t전화번호\n");
for (int i = 0; i < SIZE; i++) {
char* a = trans_relation(f_value.f_member[i].relation);
char* b = f_value.f_name;;
if (f_value.f_member[i].relation == MOTHER)
b = f_value.m_name;
char* c = f_value.f_member[i].l_name;
int d = f_value.f_member[i].age;
char* e = f_value.f_member[i].phone;
printf("%s\t%s %s\t%d\t%s\n", a, b, c, d, e);
}
}
char* trans_relation(int relation) {
char* result = NULL;
switch (relation) {
case FATHER:
result = "Father";
break;
case MOTHER:
result = "Mother";
break;
case BROTHER:
result = "Brother";
break;
case SISTER:
result = "Sister";
break;
default:
result = "UNKNOWN";
break;
}
return result;
}
<Result>
가족(아빠)의 성을 입력하세요 = 박
가족(엄마)의 성을 입력하세요 = 김
1 번째 가족 신상을 입력합니다.
가족관계를 선택하세요. 부(0), 모(1), 형제(2), 자매(3) = 0
이름을 입력하세요 = 장군
나이를 입력하세요 = 50
전화 번호를 입력하세요 = 010-1111-2222
2 번째 가족 신상을 입력합니다.
가족관계를 선택하세요. 부(0), 모(1), 형제(2), 자매(3) = 1
이름을 입력하세요 = 사랑
나이를 입력하세요 = 40
전화 번호를 입력하세요 = 010-2222-3333
3 번째 가족 신상을 입력합니다.
가족관계를 선택하세요. 부(0), 모(1), 형제(2), 자매(3) = 2
이름을 입력하세요 = 왕자
나이를 입력하세요 = 20
전화 번호를 입력하세요 = 010-3333-4444
4 번째 가족 신상을 입력합니다.
가족관계를 선택하세요. 부(0), 모(1), 형제(2), 자매(3) = 3
이름을 입력하세요 = 공주
나이를 입력하세요 = 15
전화 번호를 입력하세요 = 010-4444-5555
######################################
관계 성명 나이 전화번호
Father 박 장군 50 010-1111-2222
Mother 김 사랑 40 010-2222-3333
Brother 박 왕자 20 010-3333-4444
Sister 박 공주 15 010-4444-5555