간단하게 설명하면 call by value는 변수의 값을 부르는 것이고 call by reference는 변수의 참고(주소)를 부르는 것이다.
사실상 C언어에서는 call by reference 보다는 call by address라고 보는 게 맞다. 공식적으로 C언어에서 call by reference를 지원하지 않는다. call by address를 통해 call by reference와 같이 사용할 수 있다.
Call by value
함수의 매개변수에 인수의 실제 값을 복사한다. 이경우 함수 안에서 매개변수끼리 값이 변하기 때문에 실제 인수 값에 영향이 가지 않는다.
즉 Call by value 함수 내에서만 값이 변경되고 실제 인수 값은 변함이 없게 된다. 실제 값을 변경할 필요가 없는 경우에 사용하면 된다.
call by value를 이용한 swap코드이다. 보면서 이해하면 쉽게 이해할 것이다.
/* Call by value - function to swap */
void swap(int x, int y) {
int temp;
temp = x;
x = y;
y = temp;
return;
}
#include <stdio.h>
void swap(int x, int y);
int main () {
int a = 10;
int b = 20;
printf("swap 전 a : %d\n", a );
printf("swap 전 b : %d\n", b );
swap(a, b);
printf("swap 후 a : %d\n", a );
printf("swap 후 b : %d\n", b );
return 0;
}
결과
swap 함수를 이용해 실제 인수값을 변하지 않는 것을 알 수 있다.
Call by reference
함수에 실제 인수의 주소 값을 복사한다. 함수 내에서 주소 값을 다루기 때문에 값을 변경하면 주소 값이 변경되기 때문에 실제 인수값도 변경된다. 참고로 인수의 주소 값을 전달하기 위해선 포인터를 사용해야 한다.
call by reference를 이용한 swap코드이다. 보면서 이해하면 쉽게 이해할 것이다.
/* Call by reference - function to swap */
void swap(int *x, int *y) {
int temp;
temp = *x;
*x = *y;
*y = temp;
return;
}
#include <stdio.h>
void swap(int *x, int *y);
int main () {
int a = 10;
int b = 20;
printf("swap 전 a : %d\n", a );
printf("swap 전 b : %d\n", b );
swap(&a, &b);
printf("swap 후 a : %d\n", a );
printf("swap 후 b : %d\n", b );
return 0;
}
결과
swap 함수를 이용해 실제 인수값이 변하는 것을 알 수 있다.
정리
call by value와 call by reference의 가장 큰 차이점은 매개변수로 인수값을 복사하는 것과 인수의 주소 값을 복사하는 차이점이 있다.
실제 인수값에 영향이 있고 없고는 큰 차이다. 차이점을 잘 알고 사용한다면 좋을 것 같다.
포인터에서 흔하게 사용되는 부분이기에 자주 사용하면서 익히면 좋을 것 같다.
call by reference 를 이용한 수열과 조합 알고리즘이다. 어떻게 사용되었는지 보면 좋을 것 같다.
C언어 - 순열 알고리즘 [nPr] , C언어 - 조합 알고리즘 [nCr]
'CS > 알고리즘 및 자료구조' 카테고리의 다른 글
자료구조 (Data Structure) (0) | 2020.10.30 |
---|---|
순서도란? (0) | 2020.10.23 |
C언어 - 포인터 연산, 포인터와 배열의 관계 (0) | 2020.08.28 |
C언어 - 포인터(Pointer) (0) | 2020.08.21 |
C언어 메모리 구조 [스택(Stack), 힙(Heap), 데이터(Data)영역] (0) | 2020.08.14 |
댓글