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() 함수가 필요합니다.
- 구조체 변수 간 복사는 가능하지만 직접 비교는 불가능하므로, 멤버 단위로 비교해야 합니다.