구조체(structure)는 서로 다른 데이터 타입을 가진 여러 변수들을 하나의 이름 아래 묶어 놓은 집합입니다. 관련된 데이터를 하나의 단위로 관리할 수 있어 프로그램의 가독성과 유지보수성을 크게 높여 줍니다.
구조체의 주요 특징
- 대입 연산자(=)를 사용하면 서로 다른 데이터 타입으로 이루어진 구조체의 모든 멤버 값을 같은 타입의 다른 구조체 변수에 한 번에 복사할 수 있습니다.
- 복잡한 데이터를 다룰 때는 구조체 안에 또 다른 구조체를 정의하는 중첩 구조체(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>
struct {
char name[20];
int age;
int salary;
char add[30];
} emp1, emp2;
int manager() {
struct {
char name[20];
int age;
int salary;
char add[50];
} manager;
manager.age = 27;
if (manager.age > 30)
manager.salary = 65000;
else
manager.salary = 55000;
return manager.salary;
}
int main() {
printf("enter the name of emp1:");
scanf("%s", emp1.name);
printf("\nenter the add of emp1:");
scanf("%s", emp1.add);
printf("\nenter the salary of emp1:");
scanf("%d", &emp1.salary);
printf("\nenter the name of emp2:");
scanf("%s", emp2.name);
printf("\nenter the add of emp2:");
scanf("%s", emp2.add);
printf("\nenter the salary of emp2:");
scanf("%d", &emp2.salary);
printf("\nemp1 salary is %d", emp1.salary);
printf("\nemp2 salary is %d", emp2.salary);
printf("\nmanager salary is %d", manager());
return 0;
}이 예제에서 emp1과 emp2는 전역 범위에서 선언된 구조체 변수이고, manager() 함수 내부에는 별도의 지역 구조체가 선언되어 있습니다. 이처럼 구조체는 함수 안에서 독립적으로 정의하여 사용할 수 있으며, 해당 함수 내에서만 유효한 지역 범위를 가집니다.
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
enter the name of emp1:hari enter the add of emp1:hyderabad enter the salary of emp1:4000 enter the name of emp2:lucky enter the add of emp2:chennai enter the salary of emp2:5000 emp1 salary is 4000 emp2 salary is 5000 manager salary is 55000
실행 결과를 보면 직원 두 명의 급여는 사용자 입력값 그대로 출력되고, 매니저의 나이가 30세 이하이므로 조건문에 따라 55,000이 출력되는 것을 확인할 수 있습니다.