1. 값에의한 호출  

  : 값에 의한 호출은 Call By Value라고 불리우며, 인자로 넘기는 값을 복사해서 새로운 함수에 넘겨주는 방식으로 값의 복사에 의한 함수 호출을 의미합니다. 

  1. #include <iostream>   
  2. using namespace std;   
  3.   
  4. void swap(int a, int b);   
  5.   
  6. int main()   
  7. {   
  8.     int val1 = 10;   
  9.     int val2 = 20;   
  10.     swap(val1, val2);   
  11.   
  12.     cout<<"val1 : "<<val1<<endl;   
  13.     cout<<"val2 : "<<val2<<endl;   
  14.   
  15.     return 0;   
  16. }   
  17.   
  18. void swap (int a, int b)   
  19. {   
  20.     int temp = a;   
  21.     a = b;   
  22.     b = temp;   
  23.   
  24.     cout<<"a : "<<a<<endl;   
  25.     cout<<"b : "<<b<<endl;   
  26. }  

 위의 예제는 Call by Value 예제와 결과값 입니다. Call by Value는 값을 복사해서 전달하기 때문에 원본의 값이 변경될 가능성이 없다는 특징을 가지고 있지만, 값을 넘겨 줄때마다 고비용 , 복사손실 문제가 발생하는 단점도 있습니다. 
 ※ Call by Value는 Pass by Value 라고 불리기도 합니다. 

2. 참조에 의한 호출   

  : 참조에 의한 호출은 Call by Reference라고 부르며, 주소 값을 인자로 전달하는 함수 호출을 말합니다. 아래 예제를 보시죠. (위와 거의 유사합니다.)

  1. #include <iostream>   
  2. using namespace std;   
  3.   
  4. void swap(int *a, int *b);   
  5.   
  6. int main()   
  7. {   
  8.     int val1 = 10;   
  9.     int val2 = 20;   
  10.   
  11.     cout<< "Before the swap function" <<endl;   
  12.     cout<<"val1 : "<<val1<<endl;   
  13.     cout<<"val2 : "<<val2<<endl;   
  14.   
  15.     swap(&val1, &val2);   
  16.   
  17.     cout<<endl<<"After Swap function " <<endl;   
  18.     cout<<"val1 : "<<val1<<endl;   
  19.     cout<<"val2 : "<<val2<<endl;   
  20.   
  21.     return 0;   
  22. }   
  23.   
  24. void swap (int *a, int *b)   
  25. {   
  26.     int temp = *a;   
  27.     *a = *b;   
  28.     *b = temp;   
  29. }  

  위의 예제에서 알 수 있듯이 Call by Reference는 복사손실과 고비용 문제에서는 벗어났지만, 원본의 값의 변경이 일어 날 수 있다는 중대한 문제점을 안고 있는걸 볼 수 있습니다. 

 Call by Value 나 Call by Reference 둘다 문제점을 가지고 있는데요, Effective C++에서는 이거에 대한 개선점을 언급한 바가 있습니다. 바로 항목 20 에서 인데 그에 대한 설명은 아래 포스팅을 참조 해 주십시오. 

Posted by 모과이IT
,