오늘은 프로그래밍을 배우는 분들이라면 꼭 알아두어야 할 중요한 개념인
"Call by Value(값에 의한 호출)"와 "Call by Reference(참조에 의한 호출)"에 대해 설명해 보고자 한다.
이 두 개념은 함수나 메서드 호출 시 인수(argument)가 어떻게 전달되는지를 이해하는 데 매우 중요한 역할을 하기에, 꼭 짚고 넘어가보자.
이전에 C언어 공부를 했던 사람이라면 들어봤을법한 내용이다.
혹시 두 함수의 호출방식에 대해서 기억하고 있는가?
Call by Value(값에 의한 호출)은 값을 인자로 전달하는 함수 호출방식이며,
Call by Reference(주소에 의한 호출)은 주소를 인자로 전달하는 함수 호출방식이다.
이 차이를 알기 위해, 단순히 Swap하는 예제를 통해 알아보도록 하자.
사용언어: C++
// 값에 의한 참조 ( Call by Value )
int main(void) {
int num1 = 10;
int num2 = 20;
cout << " 변경 전 결과: " << num1 << ' ' << num2 << endl;
Swap(num1, num2);
cout << " 변경 후 결과: " << num1 << ' ' << num2 << endl;
return 0;
}
void Swap(int Val1, int Val2) {
int Temp;
Temp = Val1;
Val1 = Temp;
Temp = Val2;
return;
}
num1에 10을, num2에 20을 넣고 Swap함수를 통해 인자 두개를 전달한 다음, Print했을 때,
결과가 어떻게 나올까?

값이 바뀌지 않았다.
왜 그럴까?

이는 Swap함수에서 매개변수들이 num1과 num2의 인자값들만 받았기 때문이다.
따라서 매개변수 Val1과 Val2는 함수외부에 선언된 변수의 접근이 불가능하다.
결국, 다음과 같이 함수를 정의하면 Swap을 할 수 없게된다.
그러면 어떻게 하면 함수외부에 있는 값들에 대해 접근할 수 있을까?
바로 주소를 전달해서 바꾸는 방법이다.
그것이 곧 Call by Reference(주소에 의한 참조)이다.
※ 이 내용은 포인터(Pointer)에 대한 선행을 필요로 합니다.
// 주소에 의한 참조 ( Call by Reference )
int main(void) {
int num1 = 10;
int num2 = 20;
cout << " 변경 전 결과: " << num1 << ' ' << num2 << endl;
Swap(&num1, &num2);
cout << " 변경 후 결과: " << num1 << ' ' << num2 << endl;
return 0;
}
void Swap(int* Val1, int* Val2) {
int temp;
temp = *Val1;
*Val1 = *Val2;
*Val2 = temp;
return;
}
실행결과는 다음과 같다.

방금 전 예제와 달리, 값이 바뀌었다는 것을 우리눈으로 확인할 수가 있다.
이는,

포인터 변수 Val1과 Val2에 num1과 num2의 주소값을 받았기 때문이다.
그리고, 임시변수 temp를 활용해 주소에 "참조된 값만 바꾸는 형태"로 Swap이 진행되었다.

※ 값만 바뀌었을 뿐, 둘의 주소는 바뀌지 않았다! ( 매우 중요! )
정리하자면 다음과 같다.
값에 의한 호출 (Call-by-value)
참조에 의한 호출 (Call-by-reference)