
#include <stdio.h>
void add(int a, int b)
{
a = a + 1;
b = b - 1;
}
int main()
{
int x = 1;
int y = 2;
add(x, y);
printf("x: %i\n", x);
printf("y: %i\n", y);
return 0;
}
위 코드를 실행하면 x와 y에는 어떤 숫자가 들어있을까?
이번 포스팅은 함수의 인자에 값을 전달하는 방식인 Call by value와 Call by Reference에 대해서 다뤄보려고 한다.
함수 인자에 값을 전달하는 방식으로 함수 인자에 전달된 값은 함수가 메모리 Stack 영역에서 실행될 때 복사된 값(인자)으로 계산하게 되고 함수 실행이 끝나는 순간 stack에서 pop되므로 실제 메모리 location에 저장된 값이 바뀌지 않게 된다.
따라서 다음 코드의 출력 결과를 살펴보면
#include <stdio.h>
void add(int a, int b)
{
a = a + 1;
b = b - 1;
}
int main()
{
int x = 1;
int y = 2;
add(x, y);
printf("x: %i\n", x);
printf("y: %i\n", y);
return 0;
}
Call by value 실행 결과
x(1)와 y(2)의 값을 넘겨 +1, -1 연산 결과인 2, 0이 출력이 되는 것이 아니라 원래 값인 1, 2가 그대로 출력되는 것을 볼 수 있다.
#include <stdio.h>
void add(int *a, int *b)
{
(*a) = (*a) + 1;
(*b) = (*b) - 1;
}
int main()
{
int x = 1;
int y = 2;
add(&x, &y);
printf("x: %i\n", x);
printf("y: %i\n", y);
return 0;
}
Call by Value에서 봤던 코드에서 위처럼 변경하게 될 시 x, y를 출력해보면 어떤 값이 나올까요?
출력 결과
위와는 어떤 차이가 있길래 다른 결과가 나타난 걸까?

void add(int *a, int *b)
함수의 인자는 a, b로 포인터 변수 즉, 값이 저장된 memory location의 address를 값으로 받고 있다.
add(&x, &y);
이렇게 포인터 변수 a에는 변수 x에 저장되어 있는 1의 주소인 0x01이 전달되고 b에는 0x02가 할당된다.
(*a) = (*a) + 1;
(*b) = (*b) - 1;
따라서 해당 변수에 저장되어 있는 주소를 참조하여 물리적인 위치에 있는 값을 변경하게 되므로 메모리 Stack에서 add함수의 실행이 끝나면서 pop되도 실제 메모리 location의 값이 수정되게 되는 것이다.
각 approach마다 장단점이 있으므로 이를 염두에 두고 case별로 사용하면 된다.
덕분에 Call by value와 Call by reference 차이를 바로 이해했습니당😊 좋은 글 감사합니다 !