본문 바로가기
IT/C Language

함수에 자료 전달 방법

by Jang HyunWoong 2014. 12. 19.

1. 값에 의한 전달 (call by value)

 

먼저 예를 보고 설명을 하겠다. 

 

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void Swap(int a, int b);
  5.  
  6. int main() {
  7. // your code goes here
  8. int firstNum = 5, secondNum = 8;
  9. Swap(firstNum, secondNum);
  10.  
  11. cout << "firstNum is " << firstNum << endl;
  12. cout << "secondNum is " << secondNum << endl;
  13. return 0;
  14. }
  15.  
  16. void Swap(int a, int b){
  17. int temp = a;
  18. a = b;
  19. b = temp;
  20. }

result:

firstNum is 5
secondNum is 8

 

보통 두 자료값을 ㄱ환할 때 자주 사용하는 것으로 Swap()이 있다. 

Swap은 보통 16~20번 줄과 같은 형식을 가지고 있다. 

 

결과 값으로 firstNum = 8, secondNum = 5를 예상했지만 바꾸기 전 그대로 5와 8이 나왔다. 

그 이유는 함수를 호출할 때 변수 자체가 전달되는 것이 아니라 그 변수에 담긴 값이 전달되는 방식이기 때문이다. 이것을 call by value 라고 한다. 

 

Swap()내에 5와 8 값을 각각 저장한다. 그리고 함수의 본체에 의해 a와 b의 값이 서로 바뀌어서 8, 5가 된다. 하지만 이것은 함수 내에서만 있는 일이다. 

 

2. 주소에 의한 전달 (call by address)

- 변수의 주소 자체를 전달하는 주소에 의한 전달 방식

 

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void Swap(int *a, int *b);
  5.  
  6. int main() {
  7. // your code goes here
  8. int firstNum = 5, secondNum = 8;
  9. Swap(&firstNum, &secondNum);
  10.  
  11. cout << "firstNum is " << firstNum << endl;
  12. cout << "secondNum is " << secondNum << endl;
  13. return 0;
  14. }
  15.  
  16. void Swap(int *a, int *b){
  17. int temp = *a;
  18. *a = *b;
  19. *b = temp;
  20. }

result:

firstNum is 8

secondNum is 5

 

결과 firstNum와 secondNum의 값이 바뀐것을 볼 수 있다. 

 

3. 참조에 의한 전달 (call by reference)

참조는 변수의 또 다른 이름이라고 할 수 있다. 즉 별명(alias)를 선언한다.

그러므로 참조를 만들려면 먼저 변수를 선언해야 한다. 그리고 참조의이름 앞에 &를 붙이면 참조를 만들 수 있다. 

ex)

int firstNum;

int &numOne = firstNum;

 

이렇게 하면 변수 firstNum의 별명, 즉 참조가 numOne이 되는 것이다. 변수 firstNum와 참조 numOne은 같은 기억공간을 가리킨다. 

 

참고로 참조를 선언할 때는 선언의 대상이 되는 변수로 초기화하면서 선언해야 한다. 

int &numOne = firstNum; (O)

-------------------------------

int &numOne;

numOne = firstNum (X)

 

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5. // your code goes here
  6. int firstNum = 10;
  7. int &numOne = firstNum;
  8.  
  9. cout << "firstNum is " << firstNum << endl;
  10. cout << "numOne is " << numOne << endl;
  11.  
  12. numOne = 20;
  13.  
  14. cout << "firstNum is " << firstNum << endl;
  15. cout << "numOne is " << numOne << endl;
  16.  
  17. return 0;
  18. }

firstNum is 10
numOne is 10
firstNum is 20
numOne is 20

 

반응형

'IT > C Language' 카테고리의 다른 글

다차원 배열 초기화 / 배열의 이름  (0) 2014.12.19
참조의 의한 전달2 (call by reference)  (0) 2014.12.19
template 함수  (0) 2014.12.19
함수의 다형성(polymorphism) 1  (0) 2014.12.19
C언어에서 알아야 할 것들  (0) 2014.12.19