클래스 (객체지향)

Call by value / address / reference

이 포스트에서는 Call by value / Call by address / Call by reference 를 설명한다.

 

이 포스트에서는 값을 바꾸는 알고리즘을 예제로 한다.

 

main 함수

int main() {
	int num1 = 10;
	int num2 = 20;

	cout << "스왑 전 데이터 :" << num1 << " , " << num2 << endl;
	Swap(num1, num2);
	cout << "스왑 후 데이터 :" << num1 << " , " << num2 << endl;
	cout << "======================" << endl;

	int swapAddressNum1 = 10;
	int swapAddressNum2 = 20;

	cout << "스왑 전 데이터 :" << swapAddressNum1 << " , " << swapAddressNum2 << endl;
	Swap_Address(&swapAddressNum1, &swapAddressNum2);
	cout << "스왑 후 데이터 :" << swapAddressNum1 << " , " << swapAddressNum2 << endl;

	cout << "======================" << endl;
	int swapReferenceNum1 = 10;
	int swapReferenceNum2 = 20;
	cout << "스왑 전 데이터 :" << swapReferenceNum1 << " , " << swapReferenceNum2 << endl;
	Swap_reference(swapReferenceNum1, swapReferenceNum2);
	cout << "스왑 후 데이터 :" << swapReferenceNum1 << " , " << swapReferenceNum2 << endl;
}

 

1. Call by value (값에 의한 전달)

- Call by value는 함수를 호출하여 매개변수를 호출된 함수에게 전달할 때, 값의 복사로 전달을 하겠다는 방식이다.

- 값이 복사되어 전달되어 그 값으로 초기화된 매개변수는 전달되기 이전의 변수와는 완전히 별개의 변수다.

- 그래서 함수 내에서 아무리 매개변수를 조작해도 전달되기 이전의 그 변수하고 다르기 때문에 어떠한 변경이 없다.

void Swap_Address(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

 

2. Call by address (주소값에 의한 전달) 

주소값을 매개변수로 전달해서 스왑하려는 변수에 직접접근

*는 주소를 반환하는 연산자 (주로 c에서 쓰는 포인터이다)

void Swap_Address(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

 

3. Call by reference (참조에 의한 전달)

 

&는 주소를 반환하는 연산자가 아님 (주로 c++에서 쓰는 포인터이다)
참조는 변수의 별명 -> 스왑하려는 메모리를 공유한다.
즉 별명이 바뀌면 (참조자) 참조하는 변수의 값이 변경된다.

 

void Swap_reference(int& a, int& b)
{
	int temp = a;
	a = b;
	b = temp;
}