본문 바로가기
c++

[C++]Call-by-value & Call-by-reference (참조자와 함수)

by goblin- 2023. 1. 26.
Call-by-value & Call-by-reference

Call-by-value : 값을 인자로 전달하는 함수의 호출방식

Call-by-reference : 주소 값을 인자로 전달하는 함수의 호출방식

#include <iostream>
using namespace std;

void SwapByValue(int num1, int num2){
    int temp=num1;
    num2=num2;
    num2=temp;
}//Call-by-value

void SwapByRef(int *ptr1, int *ptr2){
    int temp=*ptr1;
    *ptr1=*ptr2;
    *ptr2=temp;
}//Call-by-reference

int main(void){
    int val1=10;
    int val2=20;

    SwapByValue(val1,val2);
    cout<<"val1: "<<val1<<endl;
    cout<<"val2: "<<val2<<endl;

    SwapByRef(&val1,&val2);
    cout<<"val1: "<<val1<<endl;
    cout<<"val2: "<<val2<<endl;

    return 0;
}

결과

val1: 10	//call-by-value
val2: 20	//call-by-value
val1: 20	//call-by-reference
val2: 10	//call-by-reference
  • call-by-value의 형태로 정의된 함수의 내부에서는, 함수외부에 선언된 변수에 접근이 불가능하다. 따라서 함수 SwapByFef()의 경우 함수외부에 선언된 변수에 접근이 불가능하다. 출력값을 살펴보아도 val1과 val2의 값은 바뀌지 않고 원래 선언된 값 10,20이 나오는 것을 확인할 수 있다.
  • call-by-reference의 형태로 정의된 함수는 주소 값을 참조하여 함수외부에 선언된 변수에 접근이 가능하다. 따라서 함수 SwapByRef()의 경우 함수의 선언딘 변수에 접근이 가능하다. 출력값을 살펴보면 val1과 val2의 값은 서로 바뀌어 20,10이 나오는 것을 확인할 수 있다.
Call-by-reference의 2가지 접근 방법(주소값, 참조자)
  • 주소값을 이용한 Call-by-reference
  • 참조자를 이용한 Call-by-reference

 

위에서 본 Call-by-reference는 주소값을 이용한 경우이다. 

 

참조자를 이용한 Call-by-reference
void SwapByRef2(int &ref1, int &ref2){
	int temp=ref1;
 	ref1=ref2;
    	ref2=temp;
}//Call-by-reference

주소값을 사용하여 Call-by-reference를 사용할 경우 *를 이용하여 주소값 선언 매개변수를 선언하지만 참조자를 사용하면 &를 사용하여 참조자 선언을 이용한다.

(함수 안에서 값을 변경시키고 싶지 않을 경우 const를 사용한다)

ex) void HappyFunc(const int &ref){...}

 

Call-by-value는 함수외부에 선언된 변수 접근 x
Call-by-reference는 함수외부에 선언된 변수 접근 o -> 방법 2가지(주소값이용, 참조자이용)