티스토리 뷰
반응형
C언어 기초 Chapter 22~23: 구조체와 사용자 정의 자료형
Chapter 22. 구조체와 사용자 정의 자료형 1
22-1. 구조체란 무엇인가?
- 여러 자료형을 하나로 묶어 새로운 자료형을 정의하는 것
- 하나의 논리적 단위로 표현 가능
#include <stdio.h>
struct Student {
char name[20];
int age;
double grade;
};
int main(void) {
struct Student s1 = {"Kim", 20, 3.8};
printf("이름: %s\n", s1.name);
printf("나이: %d\n", s1.age);
printf("학점: %.1f\n", s1.grade);
return 0;
}
22-2. 구조체 배열 그리고 포인터
구조체 배열
struct Student students[3] = {
{"Kim", 20, 3.8},
{"Lee", 22, 4.1},
{"Park", 21, 3.5}
};
구조체 포인터
struct Student *p = &students[0];
printf("첫 번째 학생 이름: %s\n", p->name); // -> 연산자 사용
Chapter 23. 구조체와 사용자 정의 자료형 2
23-1. typedef 선언
- 구조체 이름을 간단하게 만들 수 있음
typedef struct {
char title[50];
int price;
} Book;
Book b1 = {"C Programming", 25000};
23-2. 구조체 안의 구조체 (중첩 구조체)
typedef struct {
int day, month, year;
} Date;
typedef struct {
char name[20];
Date birth;
} Person;
int main(void) {
Person p = {"Kim", {5, 5, 1995}};
printf("%s의 생일: %d/%d/%d\n", p.name, p.birth.year, p.birth.month, p.birth.day);
return 0;
}
23-3. 공용체(Union Type)
- 하나의 메모리 공간을 여러 멤버가 공유
- 동시에 하나의 멤버만 사용 가능
#include <stdio.h>
union Data {
int i;
float f;
char str[20];
};
int main(void) {
union Data data;
data.i = 10;
printf("정수: %d\n", data.i);
data.f = 3.14;
printf("실수: %.2f\n", data.f);
return 0;
}
👉 주의: 마지막에 대입한 값만 유효
23-4. 열거형(Enumerated Type)
- 상수들을 이름으로 표현
- 가독성과 유지보수성 향상
enum Weekday { MON, TUE, WED, THU, FRI, SAT, SUN };
int main(void) {
enum Weekday today = WED;
if (today == WED) printf("오늘은 수요일!\n");
return 0;
}
핵심 정리 ✅
- 구조체(struct): 다양한 자료형을 묶어 새로운 자료형 정의
- typedef: 구조체 이름을 간단하게 만들기
- 중첩 구조체: 구조체 안에 다른 구조체 포함
- 공용체(union): 하나의 메모리 공간을 공유, 마지막 값만 유효
- 열거형(enum): 상수에 이름을 붙여 코드 가독성 향상
연습 문제 ✍️
- 학생(Student)의 이름, 나이, 점수를 저장하는 구조체 배열을 만들어 3명의 데이터를 입력 후 출력하세요.
- 구조체 안에 날짜(Date)를 포함하는 구조체 Person을 작성하고, 특정 인물의 생년월일을 출력하세요.
- 공용체를 이용해 같은 공간에 정수와 실수를 저장해보고, 값이 어떻게 덮어써지는지 확인하세요.
- 열거형으로 요일을 정의하고, today 변수를 이용해 오늘이 주말인지 평일인지 출력하세요.
👉 연습문제 정답▼
Chapter 22~23 연습문제 풀이
1) 학생(Student)의 이름, 나이, 점수를 저장하는 구조체 배열을 만들어 3명의 데이터를 입력 후 출력
#include <stdio.h>
struct Student {
char name[20];
int age;
double score;
};
int main(void) {
struct Student students[3];
for (int i = 0; i < 3; i++) {
printf("%d번째 학생 이름, 나이, 점수 입력: ", i+1);
scanf("%s %d %lf", students[i].name, &students[i].age, &students[i].score);
}
printf("\n입력된 학생 정보:\n");
for (int i = 0; i < 3; i++) {
printf("이름: %s, 나이: %d, 점수: %.1f\n",
students[i].name, students[i].age, students[i].score);
}
return 0;
}
2) 구조체 안에 날짜(Date)를 포함하는 구조체 Person을 작성하고, 특정 인물의 생년월일 출력
#include <stdio.h>
typedef struct {
int year, month, day;
} Date;
typedef struct {
char name[20];
Date birth;
} Person;
int main(void) {
Person p = {"Kim", {1995, 5, 5}};
printf("이름: %s\n", p.name);
printf("생일: %d년 %d월 %d일\n",
p.birth.year, p.birth.month, p.birth.day);
return 0;
}
3) 공용체를 이용해 같은 공간에 정수와 실수를 저장하고 값이 덮어써지는지 확인
#include <stdio.h>
union Data {
int i;
float f;
};
int main(void) {
union Data d;
d.i = 100;
printf("정수 저장 후: d.i = %d\n", d.i);
d.f = 3.14;
printf("실수 저장 후: d.f = %.2f\n", d.f);
printf("실수 저장 후 정수값 읽기: d.i = %d (의미 없는 값)\n", d.i);
return 0;
}
👉 마지막에 저장한 d.f 값이 덮어써져서 d.i는 더 이상 의미가 없음.
4) 열거형으로 요일 정의 후 오늘이 주말인지 평일인지 출력
#include <stdio.h>
enum Weekday { MON, TUE, WED, THU, FRI, SAT, SUN };
int main(void) {
enum Weekday today = SAT;
if (today == SAT || today == SUN)
printf("오늘은 주말입니다!\n");
else
printf("오늘은 평일입니다.\n");
return 0;
}
핵심 정리 ✅
- 구조체 배열 → 여러 명의 데이터 관리
- 중첩 구조체 → 구조적 데이터 표현
- 공용체 → 하나의 메모리를 공유, 마지막 값만 유효
- 열거형 → 상수를 이름으로 표현해 가독성 ↑
반응형
'[문법] C언어' 카테고리의 다른 글
13) C언어 문자열과 문자열 함수 완전정리 (0) | 2025.09.07 |
---|---|
12) C언어 함수 포인터와 void 포인터 완전정리 (2) | 2025.09.02 |
11) C언어 다차원 배열과 포인터 완전정리: 2차원 배열부터 포인터까지 (2) | 2025.09.02 |
10) C언어 포인터의 포인터: 이중 포인터 개념, 함수 활용, 동적 메모리 할당 (0) | 2025.09.02 |
9) C언어 포인터와 함수: 배열 전달, Call by Value vs Reference, const 정리 (2) | 2025.09.01 |