피호출 함수(justFunc)에서 num을 형식 매개변수(formal parameter)라 합니다.
Call by address vs Call by reference
위에서 제가 두 번째 예시를 call by address라 했습니다. 이는 실 매개변수(&n)로 주소값을 전달하고, 이를 복사한 값이 형식 매개변수(p)에 들어가는 방식으로 작동하였고, 이는 말 그대로 '주소에 의한 호출'이기 때문입니다. 또한 값을 복사해서 전달했으므로 call by value, 값에 의한 호출이기도 하죠.
그러면 call by reference는 대체 뭐냐?
일단 결론부터 말하면 C에는 call by reference가 존재하지 않습니다. call by reference가 뭔지 제대로 알고 싶으면 c++을 입문하고 제가 올린 나무위키 링크의 예제를 보시길 바랍니다.
간단히만 말하자면 일단 call by reference는 call by address, call by value와 달리 실질 매개변수를 제외하고는 변수(메모리)를 추가로 사용하지 않습니다.
첫 번째 예시를 보면 실질 매개변수 n을 제외하고 형식 매개변수 num을 추가로 사용하면서 메모리를 사용합니다.
두 번째 예시를 보면 실질 매개변수 n을 제외하고 형식 매개변수 p를 추가로 사용하면서 메모리를 사용합니다. 혹시 헷갈리시면 p의 주소값과 n의 주소값을 비교해보시길 바랍니다. 주소값이 다르며 따라서 다른 변수라는 것을 알 수 있습니다.
그러나 call by reference는 저 둘과 다르게 변수를 추가로 사용하여 메모리를 사용하지 않고, c++의 기능 중 하나인 '참조자 &'라는 것을 이용하여 오직 실질 매개변수만으로 호출하고 합니다.
When a parameter is passed by reference, the caller and the callee use the same variable for the parameter. If the callee modifies the parameter variable, the effect is visible to the caller's variable.
When a parameter is passed by value, the caller and callee have two independent variableswith the same value. If the callee modifies the parameter variable, the effect is not visible to the caller.
Call by value vs Call by reference
call by value와 call by reference의 차이점은 다음과 같이 세 가지입니다.
1. 복사한 값을 전달한다 vs 복사가 아닌 실질 매개변수 그 자체를 전달한다.
2. 호출 함수에 영향을 미치지 못한다 vs 호출 함수에 영향을 미칠 수 있다.
3. 인자(실질 매개변수)를 다루는 메모리의 위치가 다르다(형식 매개변수의 메모리 위치) vs 인자를 다루는 메모리의 위치가 같다(실질 매개변수의 메모리 위치)
이를 바탕으로 이제 call by value와 call by reference와 call by address를 구분하면 다음과 같습니다.
Call by address는 복사한 값(주소값)을 전달한다는 점과 인자를 다루는 메모리의 위치가 다르다는 점에서 Call by value, 그래서 결론적으로 Call by value가 맞습니다.
하지만 호출 함수에 영향을 미칠 수 있다는 점에서 Call by reference의 특성을 띄고, 그래서 많이들 Call by reference로 여기고 사용하고는 합니다.
그러므로 이번 기회에 정확하게 알고 가되, 남들과 소통할 땐 이런 점을 감안해서 이해하시기를 바랍니다.