구조체(Structure)는 서로 다른 자료형의 변수들을 하나의 이름 아래 묶어 놓은 집합체입니다.
구조체의 특징
C 프로그래밍 언어에서 구조체가 가지는 주요 특징은 다음과 같습니다.
- 대입 연산자(=)를 사용하면 서로 다른 자료형을 포함한 구조체의 모든 멤버 값을 같은 타입의 다른 구조체 변수에 한 번에 복사할 수 있습니다.
- 복잡한 자료형을 처리할 때는 구조체 안에 또 다른 구조체를 정의하는 것이 유용하며, 이를 중첩 구조체(nested structure)라고 합니다.
- 구조체 전체, 구조체의 개별 멤버, 그리고 구조체의 주소를 함수에 전달할 수 있습니다.
- 구조체 포인터를 생성할 수도 있습니다.
구조체의 선언과 초기화
구조체 선언의 일반적인 형식은 다음과 같습니다.
struct tagname{
datatype member1;
datatype member2;
datatype member n;
};여기서 각 요소의 의미는 다음과 같습니다.
- struct: 구조체를 정의할 때 사용하는 키워드입니다.
- tagname: 구조체의 이름을 지정합니다.
- member1, member2: 구조체를 구성하는 데이터 항목들입니다.
예시:
struct book{
int pages;
char author[30];
float price;
};프로그램 코드
다음은 구조체를 활용하여 이름을 알파벳 순서로 정렬하는 C 프로그램입니다.
#include<stdio.h>
#include<string.h>
struct tag{
char name[10];
int rno;
};
typedef struct tag node;
node s[5];
sort(int no){
int i,j;
node temp;
for(i=0;i<no-1;i++)
for(j=i+1;j<no;j++)
if(strcmp(s[i].name,s[j].name)>0){
temp=s[i];
s[i]=s[j];
s[j]=temp;
}
}
void main(){
int no,i;
fflush(stdin);
printf("Enter The Number Of Students:");
scanf("%d",&no);
for(i=0;i<no;i++){
printf("Enter The Name:");
fflush(stdin);
gets(s[i].name);
printf("Enter the Roll:");
scanf("%d",&s[i].rno);
}
sort(no);
for(i=0;i<no;i++){
printf("%s\t",s[i].name);
printf("%d\n",s[i].rno);
}
}코드 설명
이 프로그램은 name(이름)과 rno(롤 번호) 두 개의 멤버를 가진 tag 구조체를 정의합니다. typedef를 통해 이 구조체를 node라는 새로운 이름으로 사용할 수 있게 하며, 최대 5명의 학생 정보를 저장할 배열 s를 선언합니다.
sort 함수는 선택 정렬 방식으로 동작합니다. strcmp 함수를 이용해 두 이름을 사전순으로 비교한 뒤, 앞의 이름이 뒤의 이름보다 크면(즉, 알파벳 순서상 나중에 오면) 두 구조체 변수의 내용을 서로 교환(swap)합니다. 비교 대상이 문자열이므로 반드시 string.h 헤더 파일을 포함해야 합니다.
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
Enter The Number of Students:5 Enter The Name:Priya Enter the Roll:3 Enter The Name:Hari Enter the Roll:5 Enter The Name:Pinky Enter the Roll:7 Enter The Name:Lucky Enter the Roll:1 Enter The Name:Krishna Enter the Roll:2 Hari 5 Krishna 2 Lucky 1 Pinky 7 Priya 3
정리
입력된 순서와 무관하게 학생 이름이 Hari → Krishna → Lucky → Pinky → Priya 순으로 알파벳 순서에 맞게 정렬되어 출력되는 것을 확인할 수 있습니다. 롤 번호는 각 학생과 함께 그대로 유지됩니다. 이처럼 구조체를 사용하면 이름과 번호처럼 서로 다른 자료형의 관련 데이터를 하나의 단위로 묶어 함께 정렬하고 관리할 수 있습니다.