변수들의 집합, 구조체
학생 정보를 처리한다고 가정했을 때, 이름과 학번, 나이를 저장할 변수가 필요하다.
int main(void)
{
char name[10]; // 이름
char id[20]; // 학번
int age; // 나이
}
위처럼 선언한 변수들에는 학생 1명의 정보만 저장할 수 있다.
여러 명의 정보를 저장하기 위해서는 여러 변수가 필요하게 된다.
이러한 문제를 해결하는 것이 구조체이다!
구조체란 쉽게 말해 "변수를 모아둔 상자"라고 볼 수 있다.
배열과 뭐가 다른 거지?
배열도 변수들을 모아둔 상자이다. 그렇다면 구조체는 배열과 뭐가 다른 걸까?
배열은 하나의 자료형만을 취급한다. char name[10];
은 char
형 변수만 저장할 수 있다.
하지만, 구조체는 다른 자료형을 하나로 묶어 사용할 수 있다!
위의 코드를 구조체로 다시 작성해보자.
struct Student
{
char name[10];
char id[20];
int age;
};
int main(void)
{
struct Student student[10];
return 0;
}
학생 10명을 저장한다고 했을 때 name, id, age 변수를 3개씩 사용해 총 30줄의 변수 정의 코드를 10명의 학생 구조체 배열로 선언할 수 있다.
구조체 사용하기
1. struct
struct 키워드를 사용하여 정의할 수 있다.
struct 구조체_이름
{
datatype 멤버변수이름1;
datatype 멤버변수이름2;
...
};
닫는 중괄호 뒤, 세미콜론; 필수!
// 선언 시 초기화
struct 구조체_이름 변수_이름 = {변수값1, 변수값2, ...};
// 선언 후 값 할당
struct 구조체_이름 변수_이름;
변수_이름.멤버변수이름1 = 변수값1;
변수_이름.멤버변수이름2 = 변수값2;
선언과 동시에 값을 초기화하거나 먼저 변수를 선언한 후 점(.)을 이용해 멤버 변수에 접근하여 값을 할당하는 방식으로 사용할 수 있다.
struct Student
{
char name[10];
char id[20];
int age;
};
int main(void)
{
struct Student student;
scanf("%s", student.name); // soyang
scanf("%s", student.id); // 20220000
scanf("%d", &student.age); // 23
printf("%s 학생은 %d세이며, 학번은 %s입니다.", student.name, student.age, student.id);
return 0;
}
👉 output
soyang
20220000
23
soyang 학생은 23세이며, 학번은 20220000입니다.
2. typedef
매번 struct를 붙이는 게 귀찮네...
typedef struct를 사용해서도 구조체를 정의할 수 있다.
typedef struct 구조체이름 {
자료형 멤버변수이름1;
자료형 멤버변수이름2;
} 구조체별칭;
구조체로 변수를 선언할 때 일일이 struct 키워드를 붙이지 않기 위해서는 typedef로 구조체를 정의하고 별칭을 지정해줘야 한다.
구조체 이름은 보통 "_구조체별칭"으로 사용한다.
// 구조체 변수 선언
구조체_별칭 변수이름 = {변수값1, 변수값2, ...};
struct만으로 구조체를 정의했을 때와 같은 예시를 작성해보자.
typedef struct _Student
{
char name[10];
char id[20];
int age;
} Student;
int main(void)
{
Student student;
scanf("%s", student.name); // soyang
scanf("%s", student.id); // 20220000
scanf("%d", &student.age); // 23
printf("%s 학생은 %d세이며, 학번은 %s입니다.", student.name, student.age, student.id);
return 0;
}
👉 output
soyang
20220000
23
soyang 학생은 23세이며, 학번은 20220000입니다.
⭐ 정리
✔ 서로 다른 type의 변수들을 모아둘 때 구조체를 사용할 수 있다.
✔ struct 키워드로 선언
✔ typedef 키워드로 선언