참조자 (Reference)의 이해
참조자는 자신이 참조하는 변수를 대신하는 다른 별명이라고 생각하면 된다.
예로, int * ptr = &num1;
int &num2 = ptr;
이 되었을 때, num2는 num1의 참조자가 되어지며, *ptr = *num2= num1에 변수에 접근할 수 있다는 것이다.
참조자의 특징으로는
" 참조자는 수의 제한에 없으며, 참조자를 대상으로도 참조자를 선언할 수 있다".
" 참조자는 변수에 대해서만 참조가 가능하며, 상수에 대한 선언이 불가능하다".
int arr[3];
int &ref1 = arr[0];
int &ref2 = arr[1];
int &ref3 = arr[2];
위 예제와 같이, 참조자는 변수를 포함한 배열 내의 인덱스를 참조 또한 가능하다.
참조자와 함수
C언어와 밀접한 우리는 함수의 두 가지 호출 방식에 대해 이미 알고 있다.
- Call-by-value : 값을 인자로 전달하는 함수의 호출방식
- Call-by-reference : 주소 값을 인자로 전달하는 함수의 호출방식
int Adder(int num1, int num2)
{
return num1 + num2;
}
이 함수는 int형을 자료형으로 인자값을 전달한다. 따라서, call-by-value의 형태로 함수를 호출한다.
call- by- value 함수는 함수 외부에 선언된 변수에 접근이 불가능한데,
void Swap(int a, int b)
{
int temp = a;
a = b;
b= temp;
}
int main(void)
{
int a = 10;
int b = 20;
Swap(a,b);
cout << a << endl;
cout << b << endl;
return 0;
}
// 결과값
a = 10;
b = 20;
a , b 값이 변경되지 않았음을 확인할 수 있다.
반면에, 다음과 같은 call-by-reference 형식을 취하게 된다면...
void Swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b= temp;
}
int main(void)
{
int a = 10;
int b = 20;
Swap(a,b);
cout << a << endl;
cout << b << endl;
return 0;
}
// 결과값
a = 20;
b = 10;
a 와 b 의 값이 변경되었음을 확인할 수 있다!
그렇다면, call-by-reference 형태의 함수 호출이 call-by-address 라고 불리는 경우가 종종 있다.
int * Func(int *ptr)
{
return ptr+1;
}
다음과 같이 연산주체의 값이 주소값이 아닌, 포인터의 연산 값의 결과를 반환하는 정의는 call-by-reference와 거리가 멀다.
int * Func(int *ptr)
{
*ptr += 1;
return ptr;
}
이 함수는 주소 값을 이용해서 함수 외부에 선언된 변수를 "참조"하였는디 Call-by-reference를 띈다.
'C++' 카테고리의 다른 글
다형성 (0) | 2024.09.18 |
---|---|
C++ Static (0) | 2024.09.18 |
범위지정 연산자 (1) | 2024.09.18 |
함수 오버로딩 (1) | 2024.09.18 |
String 메서드 (0) | 2024.05.24 |