본문 바로가기

C++ 기초 1

[C++] 1-5 함수 호출 방식 (call by value)

함수 호출 방식

   함수가 호출해서 인수를 전달하는 방식은 크게 두가지가 있다. 하나는 call by value 방식이고, 다른 하나는 실인수의 주소(address)를 가인수에 전달하는 call by reference 방식이 있다. 이번 포스팅에서 call by value 방식을 설명하고자 한다.

 

Call by value

   call by value는 가장 일반적인 함수 호출 방식이고, 실인수의 실제값이 피 호출 함수로 전달된다. 이때 함수는 실인수의 값을 가인수로 복사하여 사용하게 되는데, 실인수와 가인수는 서로 다른 메모리 영역을 차지한다. 

   가인수들은 stack이라는 임시 메모리 영역에 저장되며 함수가 종료되면 이들 가인수들은 stack에서 사라진다. 따라서 함수 실행 중에 가인수의 값이 변하더라도 실인수의 값은 변경되지 않는다. 따라서 호출 측과 피 호출 함수는 독립성을 유지할 수 있다. 

 

예제 1
#include <iostream>
using namespace std;
void swap(int x, int y);		//함수의 원형 선언

int main()
{
	int x, y;
	x = 100, y = 600;
	swap(x, y);					//함수 호출//실인수의 값을 전달
	cout << "main routine: x=" << x << ", y=" << y << endl;
	return 0;
}

void swap(int x, int y)			//사용자 정의 함수
{
	int temp;
	temp = x;
	x = y;
	y = temp;
	cout << "sub routine: x=" << x << ", y=" << y << endl;
}
결과
sub routine: x=600, y=100
main routine: x=100, y=600
※ 실인수 x와 y의 값인 100, 600을 가인수 x와 y에 전달한다. 이러한 방식을 call by value라고 한다. 이때 인수명이 동일하지만 실인수와 가인수는 서로 다른 메모리 영역을 사용하기 때문에 각각은 별개이다. 가인수 x,y 는 stack이라는 임시 메모리 영역에 저장되고, 함수가 종료되면 가인수 x, y는 stack에서 사라진다.
※ 따라서 함수의 실행 중에 가인수 x와 y 값이 600과 100으로 변하더라도 함수의 실행이 종료되면 가인수 x와 y는 stack 메모리에서 사라진다. 그래서 호출 측의 실인수 x와 y값에 영향을 줄 수 없다.  

 

예제 2
#include <iostream>
using namespace std;
int func(int x, int y);		//함수의 원형 선언

int main()
{
	int x, y, z;
	cout << "x? y? ";
	cin >> x >> y;
	z = func(x, y);					//함수 호출//실인수의 값을 전달
	cout << "z=" << z << endl;
	cout << "main routine: x=" << x << endl;
	return 0;
}

int func(int x, int y)			//사용자 정의 함수
{
	if (x > y)
		x -= y;
	else
		x += y;
	cout << "sub routine: x=" << x << endl;
	return x;
}
결과
x? y? 200 500
sub routine: x=700
z=700
main routine: x=200
※ 실인수 x와 가인수 x는 서로 다른 메모리 영역을 사용하기 때문에 별개이다. 따라서 함수의 실행 중에 가인수 x의 값이 변하더라도 실인수 x에 영향을 주지 않는다. 

 

참고

1. 장인성 외 5인, (초보자도 쉽게 따라 할 수 있는) C++프로그래밍, 광문각, 2017.02.13