앞에서, 우리는 함수의 동작 원리에 대해 배워보았다. 이번에는 swap함수를 사용하여 call by value, call by address, 그리고 call by reference를 통해 매개변수가 어떻게 전달되는지 알아보자.
call by value(또는 pass by value)
#include <iostream>
using namespace std;
void swap(int x, int y)
{
int tmp;
tmp = x;
x = y;
y = tmp;
}
int main()
{
int a = 10, b = 20;
swap(a, b);
cout << "a= " << a << ",b= " << b << endl;
return 0;
}
- 그림을 통한 call by value의 이해

- swap을 호출하면 argument가 parameter로 복사되는데, swap함수 내에서 복사본이 스와핑을 한것이지, argument에는 아무 영향이 없기 때문에 출력하면 값이 그대로 나온다.
- call by value는 사칙연산을 통해 값을 반환할 때 유용하다. 이는 main해서 해도되는데, 지역변수에서 함수를 수행함으로써 메인 메모리의 사용을 줄일 수 있다.
call by address
#include <iostream>
using namespace std;
void swap(int *x, int *y)
{
int tmp;
tmp = *x;
*x = *y;
*y = tmp;
}
int main()
{
int a = 10, b = 20;
swap(&a, &b);
cout << "a= " << a << ",b= " << b << endl;
return 0;
}
- 그림을 통한 call by address의 이해

- 앞에서 본 call by value는 복사본만 스와핑을 하기 때문에 문제가 되었다.
->이를 해결하기 위해, argument의 주소를 전달하는 방법이 바로 call by address이다.
- parameter에는 변수의 주소를 저장하기 위한 int형 포인터를 사용한다.
- swap함수 내에서 x,y는 주소를 바꾸기 때문에 역참조'*'를 사용해서 값을 바꾸자.
call by reference
#include <iostream>
using namespace std;
void swap(int &x, int &y)
{
int tmp;
tmp = x;
x = y;
y = tmp;
}
int main()
{
int a = 10, b = 20;
swap(a, b);
cout << "a= " << a << ",b= " << b << endl;
return 0;
}
- 그림을 통한 call by reference의 이해

- call by reference는 call by address의 진화버전이다. 즉, 포인터를 사용하지 않고, 참조자를 매개변수로 사용함으로써 동일 스택 프레임 내에서 스와핑을 할 수 있다.
참조자는 a와 b의 별명이라, 메모리를 사용하지 않는다.(단,for loop문에서는 사용하면 안되는 제약조건이 있는데 추가공부가 필요할 것 같다)
- 소스코드 상에서는 모듈화된 프로그래밍인데, 기계어 입장에서는 동일 스택 프레임 상에서 함수가 호출된 것이기 때문에 monolithic programming이라 할 수 있다.