ISSAC.Min

[C++ Basic] Pass by Value(값에 의한 전달) / Pass by Reference(참조에 의한 전달) 본문

Programming Language/C++ Basic

[C++ Basic] Pass by Value(값에 의한 전달) / Pass by Reference(참조에 의한 전달)

ISSAC.M 2019. 4. 16. 13:11
반응형

 1. Pass by Value(값에 의한 전달)


값에 의한 전달(Pass by Value)앞에서 사용한 함수에 의한 값 전달이다. 지역변수(Local Variable)에서 값을 복사하여 복사본을 함수에 넣어준다고 이야기한것을 의미한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
using namespace std;
 
int pass_by_value_func(int x);
 
int main(){
    int num = 10;
    cout << pass_by_value_func(num) << endl;
    return 0;
}
 
int pass_by_value_func(int x){
    return x;
}
cs


위의 예시를 보면 main 함수에서 정수형 num를 선언하고 10으로 초기화하였다. 그리고 함수 pass_by_value_func함수를 불러오는데 이때 num의 값을 복사하여 넘겨주게 되고 이 값은 복사본 num으로 함수에서 사용된다. 이게 값에 의한 전달(pass by value)이다. 


간단히 말하면 어떠한 변수를 복사하여 함수에 넘겨준다는 방식이다.


그렇기 때문에 main 함수에서의 num의 복사본을 넘겨주는 것이므로 다른 함수에서 값을 변경한다고 해도 num의 값은 변하지 않는다.


또한 pass by value는 인수의 입장에서의 단어이고 call by value는 함수의 입장에서의 단어이다. 둘의 기능은 동일하다. 


 2. Pass by Reference(참조에 의한 전달)


참조에 의한 전달(Pass by Reference)는 값이 저장된 주소를 보내준다. 즉 앞에서 보았던 pass by value는 변수의 값을 복사하여 보내 주었지만 pass by reference는 변수가 저장된 주소값을 보내주기 때문에 직접적인 변수에 접근이 가능하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
using namespace std;
 
void swap_func(int& x, int& y){
  int temp_num = x;
  x = y;
  y = temp_num;
}
 
int main(){
  int num1 = 10;
  int num2 = 20;
  cout << "num1 = " << num1 << ", num2 = " << num2 << endl;
  swap_func(num1, num2);
  cout << "num1 = " << num1 << ", num2 = " << num2 << endl;
  return 0;
}
cs


위의 예시는 num1과 num2를 바꿔주는 함수 swap_func를 나타낸 것이다. 라인 14에서는 일반적으로 num1과 num2의 값을 넘겨주지만 라인 16을 보면 num1과 num2가 서로 바뀐 것을 알 수 있다.


이때 사용된게 pass by reference인데 함수 swap_func를 보면 파라미터를 보면 일반적인 int x, int y가 아닌 int& x, int& y가 파라미터로 사용된다. 


간단하게 pass by reference를 말하자면 주소 값을 인자로하여 전달하는 방법이다. 또한 직접적인 변수에 대한 접근이라고도 말할 수 있다.


또한 pass by reference는 인수의 입장에서의 단어이고 call by reference는 함수의 입장에서의 단어이다. 둘의 기능은 동일하다. 


 3. pass by value vs pass by reference


사실 pass by value와 pass by reference를 비교하는 것 자체가 큰의미가 있지는 않다. 이유는 둘의 사용 용도가 다른 것 때문이다. 애초에 둘은 각 기능에 따른 용도가 다르다. 


pass by value와 call by value는 원본 값에 대한 접근이 불가능 하기 때문에 원본이 보존될 수 있다는 장점을 가지고 있지만 값을 넘겨줄 때 마다 복사비용 들기 때문에 시간적인 문제가 발생한다.


pass by reference와 call by reference는 원본 값에 대한 직접적인 접근이 가능하므로 원본의 값이 변경될 가능성이 있다는 단점이 있으나 pass by value에 대한 단점이 보완 할 수 있다는 장점이 있다.


 4. 실습



반응형