call by value, call by reference

kodaaa·2022년 12월 1일
0

코딩테스트

목록 보기
15/17
post-thumbnail

🚀 call by value

  • 값을 인자로 전달하는 함수의 호출 방식

    • 함수의 인자로 넘기는 값을 복사해서 넘겨줌
  • 호출된 함수 내에서 인자로 전달받은 변수의 값을 바꿔도, 함수 외부에 선언된 변수에는 영향이 가지 않음

  int main() {
  	int num1 = 1;
    int num2 = 2;
    swap(&num1, &num2); //num1, num2에 영향x
  }
  
  void swap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
  }

🚀 call by reference

  • 주소값을 인자로 전달하는 함수의 호출 방식

  • 호출된 함수 내에서 인자로 전달받은 변수의 값을 바꾸면, 함수 외부에 선언된 변수에 영향이 감

  • C++에는 함수 외부에 선언된 변수에 접근하는 방식이 2가지 존재

    1. 주소값을 이용한 call by reference
    int main() {
      int num1 = 1;
      int num2 = 2;
      swap(&num1, &num2); //num1, num2에 영향o
    }
    
    void swap(int *a, int *b) {
      int temp = *a;
      *a = *b;
      *b = temp;
    }
    1. 참조자를 이용한 call by reference
    int main() {
      int num1 = 1;
      int num2 = 2;
      swap(num1, num2); //num1, num2에 영향o
    }
    
    void swap(int &a, int &b) {
      int temp = a;
      a = b;
      b = temp;
    }
    • swap의 a는 num1을 가리키는 참조자
    • 참조자는 같은 데이터 공간을 가리키는 변수지만, 이름만 다를 뿐 : 변수에게 붙여주는 별명

함수에 vector 전달하기

🚀 call by value

아래와 같이 vector 매개변수로 두어 함수를 호출한 경우 함수 안에서 값을 바꾸더라도 해당 함수가 반환된 이후인 main 함수에서는 영향이 없음.

#include<bits/stdc++.h> 
using namespace std; 
   
void func(vector<int> vect) 
{ 
   vect.push_back(30); 
} 
   
int main() 
{ 
    vector<int> vect; 
    vect.push_back(10); 
    vect.push_back(20); 
   
    func(vect); 
   
    for (int i=0; i<vect.size(); i++) 
       cout << vect[i] << " "; 
   
    return 0; 
}

출력: 10 20

🚀 call by reference(참조자를 이용)

호출한 함수안에서 vector 값을 변경하고 싶은 경우에는 vector를 값에 의한 호출(call by value)이 아닌, 아래와 같이 참조에 의한 호출(call by reference)을 이용해야 함.

#include<bits/stdc++.h> 
using namespace std; 

void func(vector<int> &vect) 
{ 
   vect.push_back(30); 
} 
   
int main() 
{ 
    vector<int> vect; 
    vect.push_back(10); 
    vect.push_back(20); 
   
    func(vect); 
  
    for (int i=0; i<vect.size(); i++) 
       cout << vect[i] << " "; 
   
    return 0; 
} 

출력 : 10 20 30


참고
https://soyoonique.tistory.com/32
https://musket-ade.tistory.com/entry/C-Call-by-Value-Call-by-reference
https://kangworld.tistory.com/64 스택 내용 포함한 원리 설명

profile
취뽀하자(●'◡'●)💕

0개의 댓글