C 언어에서는 구조체 전체가 아니라 필요한 개별 멤버만 골라 함수의 인수로 전달할 수 있습니다. 이 방식은 함수가 특정 데이터만 필요로 할 때 유용하며, 코드의 의도도 더 명확하게 드러납니다.
개별 멤버 전달 방식의 특징
- 함수 호출 시 각 멤버가 하나의 인수로 개별적으로 전달됩니다.
- 함수 헤더(매개변수 목록)에서는 이 값들이 일반 변수에 독립적으로 수신됩니다.
예제 코드
다음 예제는 학생 3명의 세 과목 점수를 입력받고, 구조체의 개별 멤버를 함수에 전달하여 총점을 계산해 출력합니다.
#include <stdio.h>
// 구조체 선언 //
struct student {
int s1, s2, s3; // 과목별 점수
} s[5];
// 개별 멤버를 인수로 받아 총점을 출력하는 함수 //
void addition(int a, int b, int c) {
int sum;
sum = a + b + c; // 산술 연산
printf("총점 = %d\n", sum);
}
int main(void) {
int i;
// 반복문으로 사용자 입력 받기 //
for (i = 1; i < 4; i++) {
printf("학생 %d의 과목 1 점수 입력 = ", i);
scanf("%d", &s[i].s1);
printf("학생 %d의 과목 2 점수 입력 = ", i);
scanf("%d", &s[i].s2);
printf("학생 %d의 과목 3 점수 입력 = ", i);
scanf("%d", &s[i].s3);
// 구조체의 개별 멤버를 인수로 전달하며 함수 호출 //
addition(s[i].s1, s[i].s2, s[i].s3);
}
return 0;
}
실행 결과
학생 1의 과목 1 점수 입력 = 40
학생 1의 과목 2 점수 입력 = 50
학생 1의 과목 3 점수 입력 = 60
총점 = 150
학생 2의 과목 1 점수 입력 = 70
학생 2의 과목 2 점수 입력 = 80
학생 2의 과목 3 점수 입력 = 90
총점 = 240
학생 3의 과목 1 점수 입력 = 30
학생 3의 과목 2 점수 입력 = 45
학생 3의 과목 3 점수 입력 = 55
총점 = 130
코드 설명
addition(s[i].s1, s[i].s2, s[i].s3)처럼 호출하면 구조체 배열 s의 i번째 요소가 가진 세 개의 정수 멤버 값이 각각 함수의 매개변수 a, b, c에 복사됩니다. 즉, 함수 내부에서는 구조체 자체가 아니라 단순한 int 값 세 개만 다루게 됩니다.
정리
- 개별 멤버 전달은 값 복사(call by value) 방식으로 동작하므로, 함수 안에서 값을 바꿔도 원본 구조체에는 영향이 없습니다.
- 반면 멤버 수가 많거나 구조체 전체가 필요한 경우에는 구조체 포인터 또는 구조체 자체를 전달하는 편이 더 효율적입니다.