값에 의한 구조체 전달
Coddy C 여정의 Logic & Flow 섹션에 포함된 레슨 — 63개 중 46번째.
이제 구조체와 구조체 포인터를 다루는 방법을 알게 되었으므로, 전체 구조체를 함수에 전달하는 방법을 배울 차례입니다. 구조체를 함수의 매개변수로 전달할 때, C는 값에 의한 전달(pass-by-value) 방식을 사용하며, 이는 함수가 구조체의 전체 복사본을 받는다는 것을 의미합니다.
구조체 매개변수를 받는 함수의 구문은 다음과 같습니다:
void functionName(struct StructureName parameterName) {
// 함수 본문
}익숙한 Point 구조체를 예로 들어보겠습니다:
void printPoint(struct Point p) {
printf("Point coordinates: (%d, %d)\n", p.x, p.y);
}이해해야 할 핵심 개념은 함수 내부에서 구조체(struct)에 가하는 어떠한 변경 사항도 호출한 함수의 원래 구조체에 영향을 주지 않는다는 점입니다. 이는 함수가 데이터의 자체 복사본을 가지고 작업하기 때문입니다.
이 접근 방식은 원본에 대한 예기치 않은 수정의 위험 없이 구조체(struct) 데이터를 읽거나 표시하고 싶을 때 유용합니다. 하지만 대규모 구조체를 복사하는 것은 메모리와 성능 측면에서 비효율적일 수 있다는 점을 유념하세요.
챌린지
쉬움구조체를 값에 의한 전달(pass-by-value) 방식으로 함수에 전달하는 것을 보여주는 C 프로그램을 작성하세요. 프로그램의 요구 사항은 다음과 같습니다:
- 다음 멤버를 포함하는
Rectangle이라는 이름의struct를 정의합니다:- 사각형의 너비를 저장할 정수형
width - 사각형의 높이를 저장할 정수형
height - 사각형의 색상을 저장할 크기 15의 문자 배열
color
- 사각형의 너비를 저장할 정수형
- 다음 기능을 수행하는
displayRectangle함수를 작성합니다:Rectangle구조체를 매개변수로 받습니다 (값에 의한 전달)- 사각형 정보를 다음 형식으로 정확히 출력합니다:
Rectangle Details:Width: [width]Height: [height]Color: [color]Area: [area]
- 면적(너비 × 높이)을 계산하고 출력합니다
- 다음 기능을 수행하는
modifyRectangle함수를 작성합니다:Rectangle구조체를 매개변수로 받습니다 (값에 의한 전달)- 사각형의 너비와 높이를 모두 두 배로 늘립니다
- 색상을 "Modified"로 변경합니다
Inside modifyRectangle function:를 출력합니다displayRectangle을 호출하여 수정된 사각형을 보여줍니다
- 메인 함수(main function)에서:
rect라는 이름의Rectangle변수를 생성합니다- 입력으로부터 너비, 높이, 색상을 읽어 구조체 멤버에 할당합니다
Original rectangle:를 출력합니다displayRectangle을 호출하여 원래의 사각형을 보여줍니다- 사각형을 인자로 하여
modifyRectangle을 호출합니다 After modifyRectangle call:를 출력합니다displayRectangle을 다시 호출하여 원래의 사각형이 변경되지 않았음을 보여줍니다
이 챌린지는 구조체를 사용한 값에 의한 전달의 핵심 개념을 보여줍니다. 구조체를 함수에 전달할 때, 함수는 구조체의 전체 복사본을 받습니다. 함수 내부에서 이루어진 모든 수정 사항은 복사본에만 영향을 미치며, 호출한 함수의 원래 구조체에는 영향을 주지 않습니다.
치트 시트
구조체를 함수에 전달할 때, C는 값에 의한 전달(pass-by-value) 방식을 사용합니다. 이는 함수가 구조체의 전체 복사본을 받는다는 것을 의미합니다.
구조체 매개변수를 받는 함수 구문:
void functionName(struct StructureName parameterName) {
// 함수 본문
}Point 구조체를 사용한 예시:
void printPoint(struct Point p) {
printf("Point coordinates: (%d, %d)\n", p.x, p.y);
}핵심 개념: 함수 내부에서 구조체에 가해진 변경 사항은 호출한 함수의 원본 구조체에 영향을 미치지 않습니다. 함수는 데이터의 자체 복사본을 가지고 작업하기 때문입니다.
이 방식은 원본이 수정될 위험 없이 구조체 데이터를 읽거나 표시하는 데 유용하지만, 큰 구조체를 복사하는 것은 비효율적일 수 있습니다.
직접 해보기
#include <stdio.h>
#include <string.h>
// TODO: 여기에 Rectangle 구조체를 정의하세요
// TODO: 여기에 displayRectangle 함수를 작성하세요
// TODO: 여기에 modifyRectangle 함수를 작성하세요
int main() {
// 입력 읽기
int width, height;
char color[15];
scanf("%d", &width);
scanf("%d", &height);
scanf("%s", color);
// TODO: Rectangle 변수를 생성하고 입력 값을 할당하세요
// TODO: "Original rectangle:"를 출력하고 displayRectangle을 호출하세요
// TODO: modifyRectangle 호출
// TODO: "After modifyRectangle call:"를 출력하고 displayRectangle을 다시 호출하세요
return 0;
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.