C - 구조체 배열

안녕하세요, 야심찬 프로그래머 여러분! 오늘 우리는 C 프로그래밍의 세계로 흥미로운 여정을 떠납니다. 특히 구조체 배열에 대해 탐구해보겠습니다. 프로그래밍에 처음이라고 걱정하지 마세요; 여러분을 단계별로 안내해드릴 것입니다. 오랜 세월 동안 제 수업에서 사용한 같은 인내와 열정을 가지고 안내해드리겠습니다. 시작해보겠습니다!

C - Arrays of Structures

구조체와 배열은 무엇인가요?

구조체 배열로 뛰어들기 전에, 구조체와 배열이 각각 무엇인지 빠르게 개괄해보겠습니다.

구조체

C에서 구조체는 다양한 유형의 데이터를 담을 수 있는 컨테이너입니다. 여러 가지 아이템을 담을 수 있는 배낭을 상상해보세요 - 그게 바로 구조체입니다! 예를 들어:

struct Student {
char name[50];
int age;
float gpa;
};

여기서 Student 구조체는 이름, 나이, GPA를 담을 수 있습니다. 정말 멋지죠?

배열

반면에 배열은 같은 유형의 아이템들의 모음입니다. 동일한 종류의 아이템을 담은 일련의 자물쇠 상자를 상상해보세요. 예를 들어:

int numbers[5] = {1, 2, 3, 4, 5};

numbers 배열은 5개의 정수를 담을 수 있습니다.

이 두 개념을 결합하면 어떤 일이 일어날까요? 그게 바로 마법이 일어나는 순간입니다!

구조체 배열

구조체 배열은 그 이름 그대로 - 각 요소가 구조체인 배열입니다. 교실에 있는 학생들처럼, 각각의 학생이 자신의 특징을 가지고 있습니다.

이 강력한 생성물을 어떻게 다루는지 탐구해보겠습니다!

구조체 배열 선언

구조체 배열을 선언하려면 먼저 구조체를 정의한 후, 그 구조체 유형의 배열을 만듭니다. 다음과 같이 보입니다:

struct Student {
char name[50];
int age;
float gpa;
};

struct Student class[30];

이 예제에서 우리는 30명의 학생 정보를 담을 수 있는 class 배열을 만들었습니다. 30장의 학생 카드처럼, 각각의 카드에 이름, 나이, GPA가 들어 있습니다.

구조체 배열 초기화

이제 우리는 배열을 선언했으니, 데이터로 채우겠습니다. 두 가지 방법으로 이를 할 수 있습니다:

  1. 선언 시 초기화:
struct Student class[3] = {
{"Alice", 20, 3.8},
{"Bob", 22, 3.5},
{"Charlie", 21, 3.9}
};
  1. 선언 후 초기화:
strcpy(class[0].name, "Alice");
class[0].age = 20;
class[0].gpa = 3.8;

strcpy(class[1].name, "Bob");
class[1].age = 22;
class[1].gpa = 3.5;

// ... 그리고 이어서

C에서 문자열을 처리할 때는 strcpy를 사용하여 char 배열에 값을 할당합니다.

구조체 배열 읽기

구조체 배열에서 읽기는 매우 간단합니다. 배열 인덱싱과 구조체 멤버 접근을 사용하여 각 요소에 접근할 수 있습니다:

printf("Student Name: %s\n", class[0].name);
printf("Student Age: %d\n", class[0].age);
printf("Student GPA: %.2f\n", class[0].gpa);

또한 전체 배열을 순회하려면 루프를 사용할 수 있습니다:

for (int i = 0; i < 3; i++) {
printf("Student %d:\n", i+1);
printf("Name: %s\n", class[i].name);
printf("Age: %d\n", class[i].age);
printf("GPA: %.2f\n\n", class[i].gpa);
}

이 코드는 class 배열에 있는 모든 3명의 학생에 대한 정보를 출력합니다.

구조체 배열 정렬

구조체 배열을 정렬하는 것은 약간 복잡하지만, 단계별로 설명하면 쉬워집니다. GPA를 기준으로 내림차순으로 정렬하려면 다음과 같이 합니다:

#include <string.h>

void swap(struct Student *a, struct Student *b) {
struct Student temp = *a;
*a = *b;
*b = temp;
}

void sortByGPA(struct Student arr[], int n) {
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (arr[j].gpa < arr[j+1].gpa) {
swap(&arr[j], &arr[j+1]);
}
}
}
}

// 사용법:
sortByGPA(class, 3);

이 코드는 버블 정렬 알고리즘을 사용하여 학생들을 GPA로 정렬합니다. sortByGPA를 호출한 후, class 배열은 GPA가 가장 높은 학생부터 정렬됩니다.

구조체 배열 포인터 선언

포인터는 C에서 강력한 도구이며, 구조체 배열과도 함께 사용할 수 있습니다. 구조체 배열에 대한 포인터를 선언하는 방법은 다음과 같습니다:

struct Student *classPtr = class;

이제 classPtrclass 배열의 첫 번째 요소를 가리킵니다. 이 포인터를 사용하여 요소에 접근할 수 있습니다:

printf("First student's name: %s\n", classPtr->name);
printf("Second student's age: %d\n", (classPtr+1)->age);

구조체 포인터를 사용할 때는 화살표 연산자(->)를 사용합니다.

결론

축하합니다! C 프로그래밍의 여정에서 큰 걸음을 뗐습니다. 구조체 배열은 현실 세계의 프로그래밍 상황에서 매우 유용합니다. 학교 데이터베이스 관리, 도서관 카달로그 조직, 상점의 재고 추적 등 다양한 작업이 구조체 배열을 사용하면 훨씬 간편해집니다.

실습이 완벽함을 만드는 것입니다. 자신의 구조체 배열을 만들어 데이터를 채우고, 정렬하고, 다양한 방법으로 데이터를 조작해보세요. 얼마 지나지 않아 프로처럼 코드를 짤 수 있을 것입니다!

행복하게 코딩하세요, 그리고 여러분의 배열이 항상 올바르게 색인되기를 바랍니다!

Credits: Image by storyset