본문 바로가기
C++

[C++] call by value/ call by pointer/ call by reference

by 유노brain 2023. 10. 28.
반응형

함수 인자를 전달하는 방법

함수 인자를 전달하는 방법은 3가지가 존재합니다.

- call by value (인수값을 복사하고 복사본을 전달합니다.)

- call by pointer (인자의 주소를 전달합니다.)

- call by reference ( 인자의 참조를 전달합니다.)

 

 

Call by value

기본적으로 call by value는 인수값을 복사하고 복사본을 전달합니다.

호출자의 값은 호출 수신자의 변경사항에 반영되지 않습니다.

암시적(implicitly)으로 인수의 복사 생성자를 호출합니다.

 

다음 아래의 예시코드를 보겠습니다.

#include <iostream>

void Add3(int y){
    y +=3;
}

int main(){
    int x = 1;
    std::cout<<x<<std::endl; // 1
    Add3(x);
    std::cout<<x<<std::endl; // 1
    return 1;
}

call by value로 불러오면 함수 내에서 값이 증가하지만 

함수를 통과한 후에는 다시 x의 값이 그대로인것을 확인할 수 있습니다.

 

 

Call by pointer

call by pointer의 경우 인자의 주소를 전달합니다.

호출자의 값은 호출 수신자의 변경 사항에 반영됩니다.

NULL 포인터를 인수로 전달할 수 있습니다.

call by value 보다 간단하고 속도도 빠릅니다.

 

다음의 예시코드를 보겠습니다.

#include <iostream>

void Add3(int* y){
    if (y != NULL){
        *y+=3;
    }
   
}

int main(){
    int x = 1;
    std::cout<<x<<std::endl; // 1
    Add3(&x);
    std::cout<<x<<std::endl; // 4
    return 1;
}

위의 코드를 보면 x의 결과값이 변한 것을 알 수 있습니다.

이 개념을 이해하려면 포인터를 이해하는 것이 굉장히 중요합니다.

Add3(&x)를 통해 x의 주소에 들어값니다. 

그다음 함수를 통해 x의 주소안 값을 3 증가시키게 되는데요.

그러면 이제 x에는 4가 저장되게 됩니다.

 

 

Call by reference

call by reference의 경우 인자의 참조를 전달합니다.

호출자의 값은 호출 수신자의 변경 사항에 전달됩니다.

NULL 전달은 허용하지 않습니다.

call by value보다 빠르고 간단합니다.

 

다음은 예시코드입니다.

#include <iostream>

void Add3(int& y){
    y += 3 ;
}

int main(){
    int x = 1;
    std::cout<<x<<std::endl; // 1
    Add3(x);
    std::cout<<x<<std::endl; // 4
    return 1;
}

call by reference의 경우 직접 주소에 들어가서 값을 변환시킨다고 이해하면 편할 것 같습니다.

함수를 보면 직접 주소에 들어가서 주소 안의 값을 변형시키는 것을 확인할 수 있습니다.

그렇기 때문에 출력이 4가 나오는것을 확인할 수 있습니다.

반응형

댓글