함수의 호출 방법이다. 하지만 값에 의해 호출되느냐, 참조에 의해 호출되느냐에 따른 차이가 존재한다.
Call by value
함수를 호출할 때 넘겨주는 인자의 값이 매개변수에 복사되는 것이다.
함수내에서 직접적으로 데이터의 값들을 바꿔주어도 해당 인자에는 아무런 영향이 미치지 못한다.
가장 유명한 예시인 swap함수를 통해 설명 할 수 있다.
#include <stdio.h>
void swap(int a, int b){
int tmp = a;
a = b;
b = tmp;
}
int main(){
int a = 10;
int b = 20;
swap(a,b);
printf("%d %d", a, b);
}
10 20
swap함수에서 a와 b의 값을 바꿔주었지만 이는 그저 swap함수 내의 a에 main함수에서의 a에 들어있는 값인 10을 복사하여 들어가고, b또한 마찬가지로 main함수 b의 값인 20이 복사되어 들어간 상태로 둘의 값이 바뀌어 swap 내에서 a, b가 20, 10이 된 후 함수가 종료되며 해당 변수들도 사라진다. 이 과정에서 main함수의 a, b는 아무런 영향도 받지 않았기 때문에 변함없이 a는 10, b는 20으로 남아있게 된다.
값을 복사하여 사용하기 때문에 원래의 값이 바뀔 위험은 없으나 사용하는 메모리가 늘어나 효율이 떨어질 수 있다.
Call by reference(pointer)
값을 복사하는 것이 아닌 주소값을 받아 직접 참조하여 처리하는 방식이다. 직접적인 참조이므로 원래 해당 주소의 값들이 영향을 받는다.
#include <stdio.h>
void swap(int &a, int &b){
int tmp = a;
a = b;
b = tmp;
}
int main(){
int a = 10;
int b = 20;
swap(a, b);
printf("%d %d", a, b);
}
또는 포인터를 이용할 수도 있다.(call by pointer)
#include <stdio.h>
void swap(int *a, int *b){
int tmp = *a;
*a = *b;
*b = tmp;
}
int main(){
int a = 10;
int b = 20;
swap(&a, &b);
printf("%d %d", a, b);
}
20 10
이렇게 주소를 받아와서 직접 참조를 하여 원래의 값을 바꿔주었기 때문에 a, b가 서로 바뀌어서 출력된다.
복사를 하지 않고 직접 참조하는 방식이므로 빠르지만 원래의 값에 직접 접근한다는 점에서 리스크가 생길 수 있기 때문에 주의해서 사용하여야 한다.
상황에 따라 call by value가 필요할 수도 있고, cally by reference가 필요할 수도 있으므로 상황에 따라 적절하게 판단하여 사용해주어야 한다.
댓글