Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C언어로 이해하는 구조체 배열과 구조체 내부 배열의 차이

개요

C 프로그래밍 언어에서 구조체(structure)의 가장 대표적인 활용 방식은 바로 구조체 배열(array of structures)입니다. 구조체 배열을 선언하려면 먼저 구조체 자료형을 정의한 후, 해당 타입으로 배열 변수를 선언해야 합니다.

struct book b[10]; // 'book' 타입 구조체 배열의 요소 10개 선언

이번 글에서는 구조체 배열구조체 내부에 포함된 배열의 차이를 두 가지 예제를 통해 살펴보겠습니다.

예제 1: 구조체 배열

다음은 구조체 배열을 활용하여 학생별 과목 점수 합계를 계산하는 C 프로그램입니다.

struct marks{
    int sub1;
    int sub2;
    int sub3;
    int total;
};
main(){
    int i;
    struct marks student[3] = {{20,17,11,10},
        {175,23,169,10},
        {27,56,27,01}};
    struct marks total;
    for(i = 0; i <= 2; i++){
        student[i].total = student[i].sub1 +
        student[i].sub2 +
        student[i].sub3;
        total.sub1 = total.sub1 + student[i].sub1;
        total.sub2 = total.sub2 + student[i].sub2;
        total.sub3 = total.sub3 + student[i].sub3;
        total.total = total.total + student[i].total;
    }
    printf(" STUDENT TOTAL\n\n");
    for(i = 0; i <= 2; i++)
    printf("Student[%d] %d\n", i+1,student[i].total);
    printf("\n SUBJECT TOTAL\n\n");
    printf("%s %d\n%s %d\n%s %d\n",
        "Subject 1 ", total.sub1,
        "Subject 2 ", total.sub2,
        "Subject 3 ", total.sub3);
    printf("\nGrand Total = %d\n", total.total);
}

실행 결과

위 프로그램을 실행하면 다음과 같은 출력 결과를 얻습니다.

STUDENT TOTAL
Student[1] 48
Student[2] 367
Student[3] 110
SUBJECT TOTAL
Subject 1 4200462
Subject 2 96
Subject 3 223
Grand Total = 525

참고: 위 실행 결과에서 Subject 1의 값(4200462)이 비정상적으로 큰 것은 total 변수가 초기화되지 않은 상태에서 누적 연산이 수행되었기 때문입니다. 쓰레기 값(garbage value)이 더해진 것으로, 실제 개발 시에는 반드시 변수를 0으로 초기화한 후 사용해야 합니다.

예제 2: 구조체 내부의 배열

이번에는 구조체 멤버 자체를 배열로 선언하는 방식입니다. 과목별 점수를 개별 멤버(sub1, sub2, sub3)로 두지 않고, 하나의 배열 멤버(sub[3])로 처리함으로써 반복문을 활용한 간결한 코드 작성이 가능합니다.

main(){
    struct marks{
        int sub[3];
        int total;
    };
    struct marks student[3] =
        {145,50,11,10,175,50,19,10,20,30,25,10};
    struct marks total;
    int i,j;
    for(i = 0; i <= 2; i++){
        for(j = 0; j <= 2; j++){
            student[i].total += student[i].sub[j];
            total.sub[j] += student[i].sub[j];
        }
        total.total += student[i].total;
    }
    printf("STUDENT TOTAL\n\n");
    for(i = 0; i <= 2; i++)
    printf("Student[%d] %d\n", i+1, student[i].total);
    printf("\nSUBJECT TOTAL\n\n");
    for(j = 0; j <= 2; j++)
    printf("Subject-%d %d\n", j+1, total.sub[j]);
    printf("\nGrand Total = %d\n", total.total);
}

실행 결과

위 프로그램을 실행하면 다음과 같은 출력 결과를 얻습니다.

STUDENT TOTAL
Student[1] 216
Student[2] 254
Student[3] 85
SUBJECT TOTAL
Subject-1 4200548
Subject-2 130
Subject-3 71
Grand Total = 555

두 방식의 차이점 정리

두 예제를 비교하면 다음과 같은 차이를 확인할 수 있습니다.

  • 구조체 배열: 동일한 구조체 타입의 객체 여러 개를 배열 형태로 관리합니다. 학생마다 하나의 구조체가 할당되며, 각 구조체는 독립적인 멤버 변수를 가집니다.
  • 구조체 내부의 배열: 하나의 구조체 안에서 특정 멤버가 배열 형태로 여러 값을 저장합니다. 과목 수가 늘어나더라도 배열 크기만 조정하면 되므로 확장성과 코드 가독성 면에서 유리합니다.

특히 구조체 내부에 배열을 사용하면 중첩 반복문만으로 모든 데이터를 처리할 수 있어, 예제 2처럼 코드가 훨씬 간결해지는 장점이 있습니다. 실무에서는 데이터의 성격에 따라 두 방식을 적절히 조합하여 사용하는 것이 좋습니다.