참조자(Reference)
변수란 할당된 메모리 공간에 붙여진 이름이다.
우리는 그 이름을 통해 해당 메모리 공간에 접근이 가능하다.
C++에서는 참조자를 통해 변수에 이름을 둘 이상 부여할수있다.
단순하게 말하자면 변수에 별칭을 붙여줄 수 있는 것이다.
참조자를 선언하기 위해서는 &연산자를 사용해야한다.
C에서의 &연산자는 변수의 주소 값을 반환하지만, C++에서는 조건에 따라 변수의 주소 값을 반환하기도 하고 참조자의 선언을 하기도 한다.
int num1 = 10;
int *ptr = &num1; // num1의 주소 값을 반환해 포인터에 저장
int &ref = num1; // num1에 대한 참조자 선언
참조자는 기존 변수와 같은 메모리 공간을 참조한다.
따라서 주소 값 또한 기존 변수와 동일하다.
int num1 = 10;
int &ref = num1;
cout << num1 << endl // 10
cout << ref << endl // 10
cout << &num1 << endl // 0012FF60
cout << &ref << endl // 0012FF60
참조자는 변수를 대상으로만 선언이 가능하고 선언과 동시에 초기화 되어야한다.
참조자는 선언의 방식은 변수와 다르지만 선언이 된 이후로는 변수와 큰 차이가 없다.
그래서 함수 내 선언된 지역적 참조자는 지역 변수와 마찬가지로 함수를 빠져나가면 소멸되고
참조자를 대상으로 참조자를 선언할 수도 있다.
(참고로 배열이 아닌 배열의 요소는 변수로 간주되어 참조자를 선언할 수 있다.)
Call-by-reference
C에서의 Call-by-reference는 주소 값을 전달 받아 함수 외부의 변수에 접근하는 형태였다.
하지만 C++에서의 Call-by-reference는 주소 값을 이용하는 형태 외 참조자를 이용하는 형태 또한 존재한다.
주소 값을 이용한 Call-by-reference
주소 값을 매개변수로 두어 해당 주소 값이 참조하는 영역에 저장된 값을 직접 변경
// 주소 값을 이용한 Call-by-reference
void Swap(int* ptr1, int* ptr2)
{
int temp = *ptr1;
*ptr1 = *ptr2;
*ptr2 = temp;
}
void main()
{
int num1 = 1;
int num2 = 2;
Swap(&num1, &num2);
cout << num1 << endl; // 2
cout << num2 << endl; // 1
}
참조자를 이용한 Call-by-reference
참조자를 매개변수로 두어 함수 외부의 변수에 접근
참조자는 선언과 동시에 초기화 되어야 하지만, 매개변수는 함수가 호출되어야 초기화가 진행되는 변수이기 때문에 가능하다. 즉, 함수 호출 시 전달되는 인자로 참조자를 초기화 하겠다는 의미인 것이다.
// 참조자를 이용한 Call-by-reference
void Swap(int &ref1, int &ref2)
{
int temp = ref1;
ref1 = ref2;
ref2 = temp;
}
void main()
{
int num1 = 1;
int num2 = 2;
Swap(num1, num2);
cout << num1 << endl; // 2
cout << num2 << endl; // 1
}
'개념' 카테고리의 다른 글
[C++] 참조자 개념 (2) const 참조자와 참조형을 반환하는 함수 (3) | 2022.09.30 |
---|---|
[C#] 클래스의 메모리 할당 (Stack, Heap) (1) | 2022.09.20 |
[개념] 메모리의 구조 (0) | 2022.09.20 |
[개념] 구조체 패딩 (Struct Padding) (1) | 2022.04.15 |
[개념] 빅 엔디안 & 리틀 엔디안 (Big-Endian & Little-Endian) (0) | 2022.03.28 |
댓글