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

C 프로그래밍으로 구조체 변수 비교하기 – 선언, 초기화부터 실전 예제까지

C 프로그래밍 언어에서 구조체(structure)는 서로 다른 자료형을 가진 변수들을 하나의 이름 아래 묶어 관리할 수 있게 해주는 사용자 정의 자료형입니다. 이 글에서는 구조체의 선언 방법, 변수 선언 및 초기화 과정을 살펴보고, 마지막으로 두 구조체 변수를 비교하는 실제 C 프로그램 예제까지 다뤄보겠습니다.

구조체의 선언과 초기화

구조체를 선언하는 일반적인 형식은 다음과 같습니다.

struct tagname{
    datatype member1;
    datatype member2;
    datatype member n;
};

각 요소의 의미는 다음과 같습니다.

  • struct: 구조체를 정의할 때 사용하는 키워드입니다.
  • tagname: 구조체의 이름을 지정합니다.
  • member1, member2, ...: 구조체를 구성하는 데이터 항목(멤버)들입니다.

예를 들어, 책 정보를 담는 구조체는 다음과 같이 정의할 수 있습니다.

struct book{
    int pages;
    char author[30];
    float price;
};

구조체 변수 선언 방법 3가지

구조체 변수를 선언하는 방법에는 크게 세 가지가 있습니다.

첫 번째 방법 – 구조체 정의와 동시에 변수 선언

struct book{
    int pages;
    char author[30];
    float price;
}b;

두 번째 방법 – 태그 이름 없이 변수 선언

struct{
    int pages;
    char author[30];
    float price;
}b;

이 방식은 태그 이름이 없으므로 같은 구조의 다른 변수를 나중에 추가로 선언할 수 없다는 점에 유의해야 합니다.

세 번째 방법 – 정의 후 별도로 변수 선언

struct book{
    int pages;
    char author[30];
    float price;
};
struct book b;

가장 일반적으로 사용되는 방식으로, 구조체를 먼저 정의한 뒤 필요할 때마다 변수를 선언할 수 있습니다.

구조체의 초기화와 멤버 접근

구조체 멤버에 접근하려면 멤버 연산자(member operator), 즉 점(.) 연산자를 사용하여 멤버와 구조체 변수를 연결합니다.

초기화 역시 여러 가지 방법으로 수행할 수 있습니다.

첫 번째 방법 – 선언과 동시에 초기화

struct book{
    int pages;
    char author[30];
    float price;
} b = {100, "balu", 325.75};

두 번째 방법 – 정의 후 초기화

struct book{
    int pages;
    char author[30];
    float price;
};
struct book b = {100, "balu", 325.75};

세 번째 방법 – 멤버 연산자로 개별 초기화

struct book{
    int pages;
    char author[30];
    float price;
};
struct book b;
b.pages = 100;
strcpy(b.author, "balu");
b.price = 325.75;

문자열 배열인 author 멤버에는 대입 연산자(=)를 직접 사용할 수 없으므로, string.h 헤더에 포함된 strcpy() 함수를 사용해야 한다는 점을 기억하세요.

예제: 구조체 변수 비교하기

다음은 두 구조체 변수를 비교하는 C 프로그램입니다. 학생 정보를 담는 구조체를 만들고, student2를 student3에 복사한 후 두 변수가 같은지 확인합니다.

#include <stdio.h>

struct class{
    int number;
    char name[20];
    float marks;
};

int main(){
    int x;
    struct class student1 = {001, "Hari", 172.50};
    struct class student2 = {002, "Bobby", 167.00};
    struct class student3;

    student3 = student2;   // 구조체 변수 전체 복사

    x = ((student3.number == student2.number) &&
         (student3.marks == student2.marks)) ? 1 : 0;

    if(x == 1){
        printf("\nstudent2 and student3 are same\n\n");
        printf("%d %s %f\n", student3.number,
               student3.name,
               student3.marks);
    }
    else
        printf("\nstudent2 and student3 are different\n\n");

    return 0;
}

여기서 주목할 점은 C 언어에서는 = 연산자 하나로 구조체 변수 전체를 다른 변수에 복사할 수 있다는 것입니다. 단, 구조체끼리 == 연산자로 직접 비교하는 것은 허용되지 않기 때문에, 위 예제처럼 각 멤버를 개별적으로 비교해야 합니다.

실행 결과

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

student2 and student3 are same
2 Bobby 167.000000

student3에 student2가 통째로 복사되었기 때문에 number와 marks 멤버 값이 일치하고, 따라서 두 구조체 변수가 동일하다고 판별된 것입니다.

마무리 정리

  • 구조체는 서로 다른 자료형의 데이터를 하나로 묶는 사용자 정의 자료형입니다.
  • 구조체 변수는 정의와 동시에 선언하거나, 태그 이름 없이 선언하거나, 정의 후 별도로 선언하는 세 가지 방법이 있습니다.
  • 멤버 접근은 점(.) 연산자를 사용하며, 문자열 멤버 초기화에는 strcpy() 함수가 필요합니다.
  • 구조체 변수 간 복사는 가능하지만 직접 비교는 불가능하므로, 멤버 단위로 비교해야 합니다.