[C] 구조체

Soyeong Kim·2022년 1월 11일
0

c

목록 보기
1/3
post-thumbnail

변수들의 집합, 구조체

학생 정보를 처리한다고 가정했을 때, 이름과 학번, 나이를 저장할 변수가 필요하다.

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 키워드로 선언

profile
예비 대학원 쭈구리 🍀

0개의 댓글