본문 바로가기
Develop/Cpp

[Cpp] 함수 호출 방식 (Call by value, Call by reference)

by Tarra 2022. 6. 20.

 


개인 공부 후 자료를 남겨놓기 위한 목적이므로, 
내용상의 오류가 있을 수 있음을 알립니다.

 

 

함수 호출 방식

Cpp에서는 인자를 함수에 넘겨주는 방식에는 크게 두 가지가 있다.

바로 Call by value, Call by reference 이다.

 

이중 Call by reference에 대해 더 집중하여 다루어 보도록 하겠다.

 


Call by value

 

함수에서 값을 복사해서 전달하는 방식으로 인자로 전달되는 변수를 함수의 매개변수에 복사하게 된다.

 

이러한 Call by value 방식은 인자로 전달한 변수와는 완전히 별개의 변수가 되기 때문에

 

간단히 말해, 매개 변수를 변경해도 원래의 변수에는 영향을 미치지 않는다. ( 원본 값을 바꿀 필요가 없는 경우 사용한다.)

 

 

예시 코드

 

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

 

결과

 

 

 


 

Call by reference

 

함수에서 값을 전달하는 대신 주소 값을 전달하는 방식을 의미한다.

 

다음의 예제를 봐보자

 

 

위의 코드를 실행시켜보면, 위의 abc와 main 안에 있는 a는 다른 변수이다.

 

하지만 여기서 포인터를 사용하게 된다면, 포인터는 주소 값을 의미하기 때문에 

 

다음과 같이 a가 10으로 변경되게 된다.

 

 

이러한 방법을 이용한 방식이 Call by reference이다.

 

Call by reference가 중요한 이유는 대부분의 Cpp 라이브러리들이 이러한 방식으로 만들어져 있기 때문이다.

따라서 이를 이해하는 것이 중요하다.

 

예를 들어 다음과 같은 라이브러리 함수가 있다고 하자.

 

이를 해석해보면 , getData라는 함수에 225, 160, 22라는 값을 넣으면 &a와 &b를 담아준다는 의미이다.

 

위의 함수를 보고, 3과 7을 보내면 3과 7의 합과 곱을 담아주는 함수를 만들어보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# include <iostream>
using namespace std;
 
void abc(int *p1, int *p2, int a, int b) {
 
    *p1 = a + b;
    *p2 = a * b;    
    
}
 
int main() {
    
    int p1, p2;
    abc(&p1, &p2, 37);
    cout << p1 << " " << p2;
 
    return 0;
}
cs

 

 

Call by reference를 보다 보면

그냥 전역 변수를 사용하면 되지 왜 이런 방식을 사용해야 하는지에 대해 의문을 가질 수 있다.

 

Call by reference를 사용하는 이유는 전역변수를 안쓰려는 이유도 있지만, 

리턴의 경우에는 보낼 땐 인자를 여러개를 보낼 수 있지만, 리턴 값은 하나이므로 사용에 불편할 수 있다.

 

하지만 Call by reference를 사용한다면 인자를 여러개를 보내고 여러개를 리턴받는 식의 활용이 가능해진다.

당연하게도 인자를 하나만 보내고 하나만 리턴받는 식의 사용도 가능하다. 

 

  

 

 

 

'Develop > Cpp' 카테고리의 다른 글

[Cpp] Direct 배열  (0) 2022.06.22
[Cpp] 문자열 함수 (cstring)  (0) 2022.06.22
[Cpp] STL (스택, 큐, 우선순위 큐)  (0) 2022.06.22
[Cpp] 구조체  (0) 2022.06.21
[Cpp] 포인터 기본  (0) 2022.06.20