call-by-value와 call-by-reference를 먼저 간략히 설명하자면,
만약 main함수 외에 추가적인 함수를 만들었을 때,
그 함수에서 main함수에서 전달된 변수에 값에 변화를 줬을 때,
main함수에서는 똑같은 그 변수가 변화되지 않고, 추가적인 함수에서만 변화된다면 call-by-value
main함수와 추가적인 함수 모두 그 변수가 변화된다면 call-by-reference
몇몇의 코드를 통해서 call-by-value와 call-by-reference의 개념을 더 이해해보도록 하겠다.
먼저, 두 변수의 값을 바꾸는 코드를 이용해 call-by-value와 call-by-reference의 개념을 이해할 것이기에, 두 변수의 값을 바꾸는 간단한 코드를 먼저 살펴보도록 하겠다.
- 두 변수의 값을 바꾸는 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <iostream>
//call-by-value
//call-by-reference
// 두 변수의 값 서로 바꾸기
int main(){
using namespace std;
int a,b;
int tmp; //일시적으로 값 저장할 변수
cin >> a >> b;
tmp = b;
b = a;
a = tmp;
}
|
cs |
이 코드에서 보이는 것처럼, tmp라는 추가적인 변수를 추가하면 a,b 두 변수의 값을 바꿀 수 있다.
- call-by-value
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include <iostream>
//call-by-value
// 두 변수의 값 서로 바꾸기
void swap(int x, int y){
int tmp = x;
x = y;
y = tmp;
}
int main(){
using namespace std;
int a,b;
cin >> a >> b;
swap(a,b);
cout << a << " " << b << endl;
}
|
cs |
이처럼 이 코드에는 main함수이외의 추가적인 함수 swap이 있다.
이때, swap함수에 위에서 본 코드인 두 변수를 바꾸는 코드를 작성한 후 실행시켜 보았지만,
main함수에서의 두 변수 a, b의 값은 바뀌지 않았다.
그 이유는, 두 변수의 값만 swap함수에 전달하였기 때문에, swap함수의 두 변수의 값만 바뀌고,
main함수의 변수는 바뀌지 않은 것이다.
이것이 바로 call-by-value 이다.
-call-by-reference
#1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include <iostream>
//call-by-reference
// 두 변수의 값 서로 바꾸기
void swap(int *x, int *y){
int tmp = *x;
*x = *y;
*y = tmp;
}
int main(){
using namespace std;
int a,b;
cin >> a >> b;
swap(&a,&b);
cout << a << " " << b << endl;
}
|
cs |
이 코드도 추가적인 함수인 swap에 두 변수를 바꾸는 코드가 있지만,
출력 결과 main함수의 두 변수인 a, b의 값이 서로 바뀐 것을 확인할 수 있다.
그 이유는, swap함수에 a, b의 주소값을 전달하였기 때문에 가능한 것이다.
이것이 call-by-reference 이다.
#2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <iostream>
//call-by-reference
// 두 변수의 값 서로 바꾸기
void swap(int &x, int &y){
int tmp = x;
x = y;
y = tmp;
}
int main(){
using namespace std;
int a,b;
cin >> a >> b;
swap(a,b);
cout << a << " " << b << endl;
}
|
cs |
c언어에서는 가능하지 않고, c++에서는 가능한 또 다른 call-by-reference 방법이 있다.
main 함수에서 전달할 때는 변수의 값을 저장하지만, swap함수에서 받을 때 주소값으로 받는 방법이다.
이것 또한 call-by-reference이다.
출처(source) - 유튜브 두들낙서님
https://www.youtube.com/c/%EB%91%90%EB%93%A4%EB%82%99%EC%84%9C
c++ 최고의 강좌,,
'공부 > c++' 카테고리의 다른 글
#8 재귀함수 | recursion | 팩토리얼 | c++ (0) | 2021.08.26 |
---|---|
#7 prototype | 프로토타입 (0) | 2021.08.26 |
#5 void함수에서 return을 사용하는 방법 (0) | 2021.08.26 |
#4 배열 총 문제 (0) | 2021.08.26 |
#3 포인터 배열 | 포인터 배열과 배열 포인터의 차이 | 문자열과 포인터 배열 | c++ (0) | 2021.08.11 |