fullstack

[C] call by value & call by reference

Language/C

함수를 호출할때 매개변수의 형태에 따라 call by value(값에 의한 호출)와 call by reference(참조에 의한 호출) 두가지의 방식이 있다.

두방식의 차이에 대해 알아보자.




- call by value


call by value는 값에 의한 호출로 매개변수에 값을 복사해 넘겨주는 방식이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int square(int num)
{
    return num*num;
}
 
int main()
{
    int n = 10;
    printf("%d\n", n);

    n = square(n);
    printf("%d\n", n);

    return 0;
}



위의 예제에서처럼 call by value는 매개변수에 값을 복사해서 전달해야되기 때문에 인자를 넘겨줄 때 마다 메모리 공간을 할당해 비용이 발생한다는 단점이 있다.

단, 원본의 값이 변경될 가능성이 없다는 장점을 가지고 있다.



- call by reference


call by reference는 참조에 의한 호출로 값을 복사하지 않고, 주소값을 인자로 전달하는 방식이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
void square(int *num)
{
    *num = (*num)*(*num);
}
 
int main()
{
    int n = 10;
    printf("%d\n", n);

    square(&n);
    printf("%d\n", n);

    return 0;
}



위의 예제에서 처럼 call by reference는 매개변수에 값을 복사하지 않고, 주소값을 인자로 전달해 call by value의 고비용 문제를 해결하였다.

단, call by value와 반대로 원본의 값이 변경될 가능성이 있다는 단점을 가지고 있다.