call by value, call by reference

geonmyung·2020년 7월 21일
0
post-thumbnail

call by value

  • arguments로 값이 넘어온다.
  • 값이 넘어올 때 복사된 값이 전달
  • caller가 복사해서 전달 했으므로 calle에서 받은 인자의 값을 변경하더라도 caller는 영향을 받지 않는다.

※ 원본의 값이 변경되지 않지만 값을 전달할 때마다 복사손실의 문제(메모리 사용량이 증가)가 발생

#include <iostream>
using namespace std;

void swap(int num1, int num2){
    int temp = num1;
    num1 = num2;
    num2 = temp;
}

int main(){
    int a = 30, b = 50;
    swap(a,b);
    cout << "a : " << a << " b : " << b << endl;
    return 0;
}
// a : 30 b : 50

변수를 주소나 포인터를 통해 받은 것이 아니므로 swap함수 내에서 num1, num2의 값만 서로 변경

call by reference

  • arguments로 reference(값에 대한 참조 주소, 메모리 주소를 가지고 있는 인자)를 넘겨준다.
    => 주소 값을 인자로 전달하는 함수 호출
  • 전달 받은 인자의 값을 callee에서 변경하면 caller가 영향을 받는다.

※ 직접 참조를 하기 때문에 빠르고 복사손실의 문제가 없지만 원본 값이 변경될 수 있다.

#include <iostream>
using namespace std;

void swap(int &num1, int &num2){
    int temp = num1;
    num1 = num2;
    num2 = temp;
}

int main(){
    int a = 30, b = 50;
    swap(a,b);
    cout << "a : " << a << " b : " << b << endl;
    return 0;
}
// a : 50 b : 30

num1 = a의 주소, num2 = b의 주소를 각각 참조
직접 주소를 가져와서 swap을 했으므로 a,b의 값도 변경
아래의 코드도 call by reference의 예시!

void swap (int *num1, int *num2){  
    int temp = *num1;  
    *num1 = *num2;  
    *num2 = temp;  
}  

참고 자료

아래 사이트에서 공부했습니다!
https://perfectacle.github.io/2017/10/30/js-014-call-by-value-vs-call-by-reference/
http://algamza.blogspot.com/2016/03/c-call-by-value-call-by-reference.html
https://codingplus.tistory.com/29
https://gma-log.tistory.com/106

profile
옹골찬 개발자가 되기 위한 험난한 일대기

0개의 댓글