본문 바로가기
공부/c++

#6 call-by-value | call-by-reference

by 심심한 뾰 2021. 8. 26.
반응형

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;
  *= *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++ 강좌를 올리고 있고 다른 컨텐츠는 할 수도 있고 안 할 수도 있는 채널. ▶ 두들낙서 지식공유 서버 참가하기: https://discord.gg/y4SXcjU

www.youtube.com

c++ 최고의 강좌,,

반응형