본문 바로가기
스터디/C++

[ C++ ] Call-by-value , Call-by-reference

by 알 수 없는 사용자 2019. 9. 5.

함수의 호출 형태는 크게 Call-by-value와 Call-by-reference로 나뉜다.

 

Call-by-value

* Pass-by-value 라고 불리기도 함.

 

Call-by-value는 값에 의한 호출로, 함수의 인자로 넘기는 값을 복사해서 새로운 함수에 넘겨주는 방식이다.

즉, 값을 인자로 전달하는 함수의 호출 방식이다.

 

예로 들어 두 변수의 값을 바꿔주는 함수가 있다고 가정하자.

void swap(int a, int b)
{
	int temp = a;
	a = b;
	b = temp;
}

 

겉으로 봤을 때는 a와 b 값을 바꾸는건 성공이다. 하지만 함수 외부에 선언된 변수 또한, 바뀌었을까?

 

 

num1의 값은 a에 복사되고 num2의 값은 b에 복사되어 전달하기 때문에, num1과 num2의 값이 바뀐 것이 아니라

a와 b의 값만 바뀌었다.

 

그래서 Call-by-values는 값을 복사해서 전달되기 때문에 함수 외부에 선언된 변수가 변경될 가능성이 없다는 특징이 있지만, 값을 넘겨줄 때마다 데이터 복사에 의한 비용 손실 문제가 발생하는 단점도 있습니다.

 

Call-by-reference

Call-by-reference는 참조에 의한 호출로, 주소 값을 인자로 전달하는 함수 호출을 말합니다.

즉, 주소 값을 인자로 전달하는 함수의 호출방식입니다.

 

그럼 swap 함수를 조금 더 수정해보자.

void swap(int *a, int *b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

 

그러면 메모리 주소 값을 저장하는 포인터 변수 a와 b를 인자로 받아와서

a가 가리키고 있는 값과 b가 가리키고 있는 값을 바꾸는 함수가 된다.

 

그럼 이번에는 값이 바뀌었는지 살펴보자.

 

위에서 볼 수 있듯이, 값이 변경된 것을 확인할 수 있다.

Call-by-reference는 비용 손실 문제는 해결했지만 외부 변수의 값 변경이 발생할 수 있다는 문제점이 있다.

외부 변수의 값 변경이 필요할 때가 있지만, 불 필요할 경우에는 언제 에러가 발생할지도 모르고, 어디서 일어났는지 모르는 불확실성을 가져올 수도 있다.

 

 

 

 

*******************************************************

 

참조자를 이용한 Call-by-reference

 

C++에서는 함수 외부에 선언된 변수에 접근하는 방식은 두 가지가 있다.

 

- 주소 값을 이용한 Call-by-reference ( Call-by-address라고 불리기도 함. 밑에있는 방식과 구분하기 위해서 )

- 참조자를 이용한 Call-by-reference

 

swap의 a는 num1을 가리키는 참조자이고 b는 num2를 가리키는 참조자이다.

즉, 참조자는 같은 데이터 공간을 가리키는 변수지만, 이름만 다를뿐이다.

 

새로 선언되는 변수 앞에 &가 붙으면 참조자이다.

* 하지만 원래 있던 변수 앞에 &이면 변수의 주소 값을 반환하는 연산자 역할을 하므로 주의하자.