이 포스트에서는 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;
}
'클래스 (객체지향)' 카테고리의 다른 글
업 캐스팅(Upcasting)과 다운캐스팅(Downcasting) (0) | 2021.06.27 |
---|---|
템플릿(Template) 개념정리 (0) | 2021.06.26 |
클래스 상속(inheritance) 이란?? (생성자,소멸자 접근 제어 지시자) (0) | 2021.06.21 |