대표적인 함수 호출 방법
Call by value (값에 의한 호출)
Call by reference (참조에 의한 호출)
함수에 정의된 매개변수의 형태에 따라서 Call by value 또는 Call by reference인지 결정한다.
Call by value는 값에 의한 호출로 함수의 인자로 넘기는 값을 복사해서 새로운 함수에 넘겨주는 방식이다.
즉, 값을 인자로 전달하는 함수의 호출 방식
예시로 swap 함수를 보면
#include <iostream>
using namespace std;
void Swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int num1 = 10;
int num2 = 5;
cout << "이전 : " << num1 << "," << num2 << endl;
Swap(num1, num2);
cout << "변경 : " << num1 << "," << num2 << endl;
}
겉으로 보기에는 a와 b 값을 바꾸는 건 성공이다 하지만 출력을 해보면 값이 다르게 나온다.
Swap을 했음에도 결괏값은 바뀌지 않았다.
Call by value는 num1과 num2의 값을 가져가는게 아닌 num1과 num2의 값을 a와 b에 복사하여 전달하기때문에 함수 내부에서만 변경되며 함수를 빠져나올 시 a와 b는 사라진다. 추가적으로 a와 b라는 변수를 새롭게 만들면서 메모리는 늘어난다.
하지만 이 부분을 Call by reference하면 해결된다.
Call by reference는 참조에 의한 호출로 주소 값을 인자로 전달하는 함수 호출이다.
#include <iostream>
using namespace std;
void Swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int num1 = 10;
int num2 = 5;
cout << "이전 : " << num1 << "," << num2 << endl;
Swap(num1, num2);
cout << "변경 : " << num1 << "," << num2 << endl;
}
Swap 함수에 &(참조자)를 붙임으로써 값이 변경됐다.
이를 Call by reference라고 한다.
Call by reference는 num1과 num2의 값을 함수의 매개변수인 a, b에 단순히 복사하는 방법이 아닌 num1과 num2의 변수 자체를 참조하여 호출하는 방식이다.
여기서 참조자(&)란
할당된 하나의 메모리 공간에 다른 이름을 붙이는 것이다.
철수라는 사람을 변수라고 생각하면, 참조자는 철수의 별명이 된다.
#include <iostream>
using namespace std;
int main()
{
int num1 = 10;
int& num2 = num1;
// num2는 num1을 참조
// 두 변수는 같은 메모리 공간 주소를 가진다.
cout << num1 << endl;
cout << num2 << endl;
cout << &num1 << endl;
cout << &num2 << endl;
}
num2는 num1과 다른 변수가 아닌 num1과 같은 변수이며, num1의 별명과 같은 변수이다.
하지만 참조자를 선언할 때 조건이 있다.
이미 선언되어 있는 변수에 대해서만 선언이 가능하다.
즉, 선언과 동시에 누군가를 참조해야 한다는 의미이며, NULL값으로 초기화하는 것도 불가능하다.
'C++' 카테고리의 다른 글
프로세스 메모리 (0) | 2023.03.17 |
---|---|
C++ 포인터, 역참조 (0) | 2023.03.17 |
아스키코드 (0) | 2023.03.11 |
C++ 바이트 패딩(Byte Padding) (0) | 2023.03.11 |
C 자료형 변환 (0) | 2023.03.03 |