CS/ETC

Call by Value Vs Call by Reference

혀니리리 2023. 10. 1. 17:48
728x90

[C, C++] Call by value, Call by reference 쉽게 이해하기 (tistory.com)

 

[C, C++] Call by value, Call by reference 쉽게 이해하기

인트로 (본 포스팅은 포인터와 관련이 깊습니다.) 함수의 호출 방법은 대표적으로 Call by value(값에 의한 호출)와 Call by reference(참조에 의한 호출)가 있다. 함수 호출이란 말 그대로 정의된 함수를

kangworld.tistory.com

함수의 호출 방법은 대표적으로 Call by value(값에 의한 호출), Call by reference(참조에 의한 호출)이 있음.

 

함수 호출: 정의된 함수를 호출하는 것으로, 함수에 정의한 매개변수의 형태에 따라 Call by value, Call by reference가 결정이 됨

(이 둘의 차이를 쉽게 이해하려면 포인터와 stack을 어느 정도 알고 있어야 함)

 

* Call by value :함수 호출 시 넘기는 인자의 이 매개변수에 복사되어 함수 내에서 매개변수에 직접적인 데이터 조작을 가해도 인자에 전혀 영향을 주지 않는 것.

(값: 주소 값이 아닌 그 자체로 유의미한 데이터)

#include <iostream>
 
using namespace std;
 
void Swap(int x, int y)
{
	int tmp = x;
	x = y;
	y = tmp;
}
 
int main()
{
	int a = 10;
	int b = 20;
 
	Swap(a, b);
 
	cout << "a : " << a << endl;
	cout << "b : " << b << endl;
}

결과 : swap 되지 않음

이유: 지역변수, 매개변수의 값이 stack에 할당되기 때문

 

* Call by reference : 인자의 값이 매개변수에 복사되는 점은 동일하나, 복사되는 값이 데이터의 주소 값이라는 차이점이 존재함.

(참조값으로 함수를 호출함.

여기서 참조란? 우리가 잘 알고있는 포인터)

#include <iostream>
 
using namespace std;
 
void Swap(int *a, int *b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
 
int main()
{
	int a = 10;
	int b = 20;
 
	Swap(&a, &b);
 
	cout << "a : " << a << endl;
	cout << "b : " << b << endl;
}

결과: 잘 바뀜

중요한 차이: 매개변수가 포인터 변수로 정의되어있다는 점.

변수의 주소를 인자로 받으니 Swap함수 내에선 *역참조 연산자로 주소에 저장된 값에 직접 접근할 수 있게 됨

728x90

'CS > ETC' 카테고리의 다른 글

순수 가상함수, 일반 가상함수  (0) 2023.12.19
FSM(Finite-state machine)  (0) 2023.12.19
OOP(Object-oriented programming)  (0) 2023.12.19
C++과 C#의 차이 (+ 속도차이)  (0) 2023.09.27
추상클래스와 interface 차이 (용도차이)  (0) 2023.09.27