728x90
[C, C++] Call by value, Call by reference 쉽게 이해하기 (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 |