[[프로그래밍_NOTE]]/C , C++

C++의 Call by reference

갑빠돌격기 2009. 3. 21. 22:30

//1....////////////////////////////////////////
// 매개변수와 지역변수의 범위 개념을 이해하지 못해
// 저지르기 쉬운 실수 (Call by value)
//////////////////////////////////////////////

void swap(int x , int y)
{
    int temp = x;
    x = y;
    y = temp;
}
void main()
{
    int x , y;
    x = 10;
    y = 20;

    cout<<"x="<<x<<"   y="<<y<<endl;
    swap(x,y);
    cout<<"x="<<x<<"   y="<<y<<endl;
}

//결과는 10,20 으로 의도되로 수행되지 않는다.
///////////////////////////////////////////////

//2....////////////////////////////////////////
// C에서 자주 쓰이는
// 포인터를 이용하여 Call by referference 를 연출하는 방식
//////////////////////////////////////////////

void swap(int *x , int *y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}
void main()
{
    int x , y;
    x = 10;
    y = 20;

    cout<<"x="<<x<<"   y="<<y<<endl;
    swap(&x,&y);
    cout<<"x="<<x<<"   y="<<y<<endl;
}

//의도한대로 잘 수행된다
///////////////////////////////////////////////

//3....////////////////////////////////////////
// C++ 에서 사용하는 Call by reference 방식
매게 변수의 복사본을 사용하는 것이 아니라
그 변수 자체를 가져다 쓰는 방식이다.
//////////////////////////////////////////////

void swap(int &x , int &y)
{
    int temp = x;
    x = y;
    y = temp;
}
void main()
{
    int x , y;
    x = 10;
    y = 20;

    cout<<"x="<<x<<"   y="<<y<<endl;
    swap(x,y);
    cout<<"x="<<x<<"   y="<<y<<endl;
}

//의도한대로 잘 수행된다
///////////////////////////////////////////////

ps : 변수의 값이 변경되어야 하는 경우가 아니라도, 념겨주는 매개 변수의 크기가 클 때는 Call by Value방식보다 Call by Reference 방식을 사용하는 것이 효율적이다.
Call by Value 방식은 넘겨진 변수의 복사본을 만들기 때문에 매개변수로 넘어가는 변수의 크기가 크면, 메모리 복사에 시간이 걸릴 수 있습니다. Call by Reference 방식은 복사본을 만들지 않기 때문에 변수를 복사하는데 걸리는 시간을 절약할 수 있다.