C 언어 개열/C++

Call by Value 와 Call by Reference

본클라쓰 2010. 8. 22. 11:31

 

 C언어와 마찬가지로 C++에서도 함수에 매개변수를 전달할 때 Call by Value 와 Call by Reference 두 가지 방법이 있는데, C++은 Call by Reference 에서 포인터를 이용한 방법과 레퍼런스를 이용한 방법 두 가지 방법으로 분류된다. C++ 의 Call by Reference 방법에 대해 알아보자.




1. Call by value


 Call by Value는 C언어와 마찬가지로 값을 전달할 때 값을 복사하여 전달하는 방식이다. 따라서 원래 변수의 있는 데이터는 변경되지 않는다. 이것을 Call By Value라고 한다.

#include <iostream>

using std::cout;
using std::endl;

void fun(int a, int b) {

    a++;
    cout << "a 값 : " << a << endl;

    b++;
    cout << "b 값 : " << b << endl;

}

int main() {

    int a = 10;
    int b = 10;

    fun(a, b);

    cout <<"a and b value = " << a << ", " << b << endl;

    return 0;

}


***** result *****

a 값 : 11
b 값 : 11
a and b value = 10, 10




2. 포인터를 이용한 Call By Reference


 C언어의 포인터를 이용한 Call By Reference 와 같다. 함수 외부에 선언된 변수의 값에 대한 접근이 가능하며, 포인터 연산에 의해서 값을 변경할 수 있다. 따라서 포인터 연산의 위험성이 존재한다.


#include <iostream>

using std::cout;
using std::endl;

void fun(int *a, int *b){
    *a += 10;
    *b += 10;
    cout << "a: " << *a << "\n" <<"b: " << *b << endl;

}

int main(){

    int a = 5;
    int b = 10;

    fun(&a, &b);

    cout << "a: " << a << "\n" <<"b: " << b << endl;
}





3. Reference 를 이용한 Call By Reference


 포인터를 이용한 Referece와 마찬가지로 함수 외부에 선언된 변수의 접근이 가능하며, 포인터 연산을 할 필요가 없으므로 보다 안정적이다. 하지만 함수의 호출 형태를 구분하기 어렵다.

#include <iostream>

using std::cout;
using std::endl;

void fun(int &a, int &b){
    a += 10;
    b += 10;
    cout << "a: " << a << "\n" <<"b: " << b << endl;

}

int main(){

    int a = 5;
    int b = 10;

    fun(a, b);

    cout << "a: " << a << "\n" <<"b: " << b << endl;
}

***** result *****

a 값 : 11
b 값 : 11
a and b value = 11, 11

 

 Call By Value 와 Call by Reference 는 구분해서 사용되어야 하는데, Call by Value는 함수 호출시 인자 전달 과정에서 값의 복사가 발생한다. 따라서 조금 부담스럽지만, 실제 변수의 데이터를 유지할 수 있는 장점이 있다. Call by Reference는 전달되는 인자를 레퍼런스로 받음으로 데이터의 복사 연산이 필요없지만 실제 변수의 데이터를 변경할 수 있기 때문에 원본 데이터가 손실될 수 있다. 따라서, 환경변수와 같은 데이터는 Call by Value가 적당하고, 데이터 처리는 Call by Reference 가 적당하다.