포인터 vs 값
Coddy C 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 9번째.
struct를 function에 전달할 때 C는 두 가지 옵션을 제공합니다. 값으로 전달하기(전체 struct를 copy) 또는 pointer로 전달하기(주소만 copy)입니다. 이 선택은 성능에 큰 영향을 줍니다.
값으로 전달하면 스택에 구조체의 완전한 copy가 생성됩니다. 정수가 몇 개 있는 작은 구조체라면 이는 괜찮습니다. 하지만 수백 bytes인 구조체를 생각해 보세요. 모든 function 호출은 해당 데이터를 전부 copies합니다:
typedef struct {
char name[100];
int scores[50];
double average;
} Student;
// 값에 의한 전달: 호출할 때마다 ~308바이트를 복사
void print_by_value(Student s) {
printf("%s: %.2f\n", s.name, s.average);
}
// 포인터에 의한 전달: 주소인 8바이트만 복사
void print_by_pointer(const Student *s) {
printf("%s: %.2f\n", s->name, s->average);
}
구문도 다릅니다. 값 매개변수를 사용하면 점 연산자(s.name)를 사용합니다. 포인터를 사용하면 화살표 연산자(s->name)를 사용합니다.
포인터 버전이 더 효율적인 이유는 일반적으로 구조체의 크기와 관계없이 메모리 address만 전달하며, 그 크기가 보통 8 bytes이기 때문입니다.
이것이 C 프로그래머들이 거의 항상 구조체를 pointer로 전달하는 이유입니다. function이 데이터를 수정해서는 안 될 때는 const를 사용하고, 수정해야 할 때는 일반 pointer를 사용하세요. 이렇게 하면 효율성과 명확한 의도를 모두 얻을 수 있습니다.
챌린지
쉬움값으로 구조체를 전달하는 것과 포인터로 전달하는 것의 차이를 보여 주는 Product 모듈을 만들어 보겠습니다. 두 개의 display 함수를 만들 것입니다. 하나는 전체 구조체를 복사본으로 receives하고, 다른 하나는 구조체를 가리키는 포인터만 receives합니다.
세 개의 파일을 만들 것입니다:
product.h: 세 개의 members인char name[50],double price,int quantity를 포함하는Product구조체를 Declare합니다. 또한 두 함수를 Declare합니다:display_by_value:Product를 값으로 받아 해당 정보를 Print합니다.display_by_pointer:const Product *를 받아 동일한 정보를 Print합니다.
PRODUCT_H기호를 사용하여 include guards를 사용합니다.product.c: 두 함수를 Implement합니다. 구문 차이에 주의하세요. 값으로 받는 버전은 dot operator(p.name)를 사용하는 반면, 포인터 버전은 arrow operator(p->name)를 사용합니다. 두 함수는 동일한 format으로 Print해야 합니다.main.c: Product를 Create한 다음 두 display 함수를 Call하여 서로 다른 parameter styles를 사용하더라도 동일한 output을 생성한다는 것을 보여 줍니다.
세 가지 inputs를 받습니다: product name(문자열), price(double), quantity(정수)입니다.
main 파일에서 이러한 값으로 Product를 initialize한 다음 display_by_value를 Call하고 이어서 display_by_pointer를 Call합니다.
두 함수는 다음 format으로 Print해야 합니다:
Product: {name}, Price: {price}, Qty: {quantity}price에 %.2f를 사용하여 소수점 이하 두 자리까지 표시합니다.
예를 들어 inputs가 Laptop, 999.99, 5인 경우 output은 다음과 같습니다:
Product: Laptop, Price: 999.99, Qty: 5
Product: Laptop, Price: 999.99, Qty: 5직접 해보기
#include <stdio.h>
#include <string.h>
#include "product.h"
int main() {
char name[50];
double price;
int quantity;
// 입력 읽기
scanf("%s", name);
scanf("%lf", &price);
scanf("%d", &quantity);
// TODO: Product 변수를 생성하고 입력 값으로 초기화하세요
// Hint: strcpy를 사용하여 name을 구조체의 name 필드에 복사하세요
// TODO: Product로 display_by_value를 호출하세요
// TODO: Product에 대한 포인터로 display_by_pointer를 호출하세요
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C 컴파일러