Call by value, Call by reference 이라는 용어가 나오게 된 게 값을 기준으로 값을 전달하는 방법을 분류하면서 나온 개념이다.
C++를 기준으로 생각해 보자.
int add(int a, int b) { return a + b; }
ret = add(3, 5);
이건 당연히 Call by value이다.
int 타입 값의 복사가 일어나고 있다.
int swap(int *a, int *b) { int t = *a; *a = *b; *b = t; }
swap(&var1, &var2);
이건 C 스타일의 swap 함수인데 이걸 Call by reference라고 생각하는 븅신도 있을지 모르는데
이건 Call by value가 맞다. swap 함수를 호출할 때 명시적으로 &var1, &var2 이렇게 var1의 메모리 주소와 var2의 메모리 주소를 값으로써 넘기고 있거든.
그럼 이건 어떨까?
int swap(int &a, int &b) { int t = a; a = b; b = t; }
swap(var1, var2);
int 형 값의 복사가 일어나지 않았고, 내가 포인터 값을 직접 넘겨주지도 않았다. 그러므로 Call by value는 아니다.
함수를 호출하는 측에서도, 호출 당한 측에서도 인자를 주고 받을 때 메모리 주소를 직접 넘겨준다든지
참조를 위한 추가적인 장치 없이 그저 변수만 넘겼을 뿐인데 알아서 참조가 넘어가고 있다. 이런게 Call by reference이다.
자바스크립트에서도,
function add(a, b) { return a + b; }
ret = add( 3, 5 );
이런 함수는 Call by value 지만,
function func( obj ) { ... }
var = { a: 1, b: 2 };
func( var );
같은 상황에서는 객체의 메모리 주소를 의식하지도 않았는데, 알아서 객체를 복사하지 않고 그 참조를 자동으로 넘겨주기 때문에 Call by reference가 맞다고 본다.
이 논리는 C++의 reference type (&) 의 논리와도 일맥상통하고. 이걸 C++로 똑같이 짜면
void func( Object &obj ) { ... }
Object &var = *(new Object(1, 2));
func(var);
이것과 같다. & 인자는 뭐다? Call by reference다.
----
이처럼 Call by reference가 명백한데,
다만 아둔처럼 시비 걸어오는 넘들이 많아서 사람들 사이에서 Call by sharing (Call by object) 이라고 용어를 하나 만든 듯.
근데 이건 회피성 명칭일 뿐, Call by reference라는 본질은 변하지 않음.
ㅇㅇ