구조체를 함수로 전달하는 세 가지 방법
C언어에서 구조체의 값을 한 함수에서 다른 함수로 전달하는 방법은 크게 세 가지가 있습니다.
- 개별 멤버를 함수의 인수로 전달하는 방법
- 구조체 전체를 함수의 인수로 전달하는 방법
- 구조체의 주소를 함수의 인수로 전달하는 방법
이번 글에서는 그중 구조체 전체를 함수의 인수로 전달하는 방법을 자세히 살펴보겠습니다.
구조체 전체 전달 방식의 특징
- 함수를 호출할 때 구조체 변수의 이름을 인수로 지정합니다.
- 함수의 매개변수 부분에서 이 값을 다른 구조체 변수로 받습니다.
- 단점으로는 구조체 전체의 복사본이 새로 생성되기 때문에 메모리가 낭비될 수 있다는 점이 있습니다.
예제 1: 날짜 구조체 전달하기
다음 프로그램은 구조체 전체를 함수의 인수로 전달하는 기본적인 방법을 보여줍니다.
#include <stdio.h>
struct date {
int day;
char month[10];
int year;
};
int main() {
struct date d;
printf("enter the day, month and year:");
scanf("%d%s%d", &d.day, d.month, &d.year);
display(d); // 구조체 전체를 함수의 인수로 전달
return 0;
}
void display(struct date d) {
printf("day=%d\n", d.day);
printf("month=%s\n", d.month);
printf("year=%d\n", d.year);
}
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
enter the day, month and year:18 JAN 2021 day=18 month=JAN year=2021
예제 2: 두 변수의 합 구하기
다음 예제는 구조체 전체를 함수의 인수로 전달하여 두 변수의 합을 계산하는 C 프로그램입니다.
#include <stdio.h>
// 구조체 선언
struct add {
int var1;
int var2;
} a;
// 함수 선언 및 정의
void show(struct add a) {
// 합계 변수 선언
int sum;
// 산술 연산
sum = a.var1 + a.var2;
// 결과 출력
printf("Added value is %d", sum);
}
void main() {
// 구조체 변수 선언
struct add a;
// 사용자 입력 받기
printf("Enter variable 1 = ");
scanf("%d", &a.var1);
printf("Enter variable 2 = ");
scanf("%d", &a.var2);
// 함수 호출
show(a);
}
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
Enter variable 1 = 20 Enter variable 2 = 50 Added value is 70
예제 3: 학생 성적 구조체 배열 전달하기
마지막 예제는 구조체 배열 전체를 함수의 인수로 전달하여 학생별 과목 합계를 계산하는 C 프로그램입니다. 구조체 선언부터 함수 선언, 호출까지 전반적인 과정을 확인할 수 있습니다.
#include <stdio.h>
// 구조체 선언
struct student {
int s1, s2, s3;
} s[5];
// 함수 선언 및 정의
void addition(struct student s[]) {
// 반복문 변수와 합계 변수 선언
int i, sum;
// 산술 연산
for (i = 1; i < 4; i++) {
sum = s[i].s1 + s[i].s2 + s[i].s3;
printf("Student %d scored total of %d\n", i, sum);
}
}
void main() {
// 반복문용 변수 선언
int i;
// 반복문을 통해 사용자 입력 받기
for (i = 1; i < 4; i++) {
printf("Enter marks for student %d in subject 1 = ", i);
scanf("%d", &s[i].s1);
printf("Enter marks for student %d in subject 2 = ", i);
scanf("%d", &s[i].s2);
printf("Enter marks for student %d in subject 3 = ", i);
scanf("%d", &s[i].s3);
}
// 함수 호출
addition(s);
}
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
Enter marks for student 1 in subject 1 = 25 Enter marks for student 1 in subject 2 = 89 Enter marks for student 1 in subject 3 = 45 Enter marks for student 2 in subject 1 = 12 Enter marks for student 2 in subject 2 = 45 Enter marks for student 2 in subject 3 = 89 Enter marks for student 3 in subject 1 = 12 Enter marks for student 3 in subject 2 = 78 Enter marks for student 3 in subject 3 = 12 Student 1 scored total of 159 Student 2 scored total of 146 Student 3 scored total of 102
정리
구조체 전체를 함수로 전달하면 여러 데이터를 한 번에 넘길 수 있어 코드가 간결해지고 가독성이 좋아집니다. 다만 구조체의 크기가 클 경우 복사본 생성으로 인한 메모리 낭비와 성능 저하가 발생할 수 있습니다. 이러한 단점을 보완하려면 구조체의 주소(포인터)를 전달하는 방식을 사용하는 것이 효율적입니다.