참조자 (Reference)
- 할당된 어떤 하나의 메모리 공간에 다른 이름을 부여하는 것이다.
※ 별명이라고 생각해도 좋다.
- 참조자는 변수 앞에 &를 붙여줌으로써 선언할 수 있다.
※ 이미 선언된 변수 앞에 &를 붙이면 주소값을 반환하지만, 새로 선언되는 변수 앞에 &를 붙이면 참조자 선언을 뜻한다.
활용
- 다음과 같이 사용하게되면 num2는 num1의 참조자가 되며 두 변수는 같은 메모리 공간을 가리키게 된다.
int num1 = 10;
//참조자 num2 선언
int& num2 = num1;
- 즉, 같은 메모리 공간을 가리키므로 num2에 100을 대입해주면 num1, num2의 값이 100으로 변경된다.
num2 = 100;
//결과 : num1 : 100, num2 = 100
- 참조자의 수에는 제한이 없으며 참조자를 대상으로도 참조자 선언이 가능하다.
int num1 = 10;
int& num2 = num1;
int& num3 = num1;
//---------------
int num1 = 10;
int& num2 = num1;
int& num3 = num2;
※ 위 코드와 아래 코드 모두 동일하게 num1의 메모리 공간을 가리킨다.
※ 하지만, 필요 이상으로 참조자를 선언하는것은 바람직하지도 않고, 필요하지도 않다.
- 참조자의 선언 가능 범위
- 참조자는 변수에 대해서만 선언 가능.
int& ref = 20; //(X)
- 참조자는 변수에 별명을 붙이는 것이기에 미리 선언했다가 나중에 다른 변수를 참조하는 것이 불가능하다.
int& ref; //(X)
- 참조자는 상수에 대해 참조가 허용되지 않는다.
const int num = 10;
int& ref = num; //(X)
- 참조자는 NULL로 초기화하는것이 불가능하다.
int& ref = NULL; //(X)
- 배열의 요소와 포인터도 변수로 간주되어 참조자의 선언이 가능하다.
//Array reference
int arr[1] = {1};
int& arrRef = arr[0]; //1
//--------------------
//Pointer reference
int num = 1;
int* ptr = #
int& nRef = num; //1
int* (&pRef) = ptr; //1
Call-by-value & Call-by-reference
- 참조자의 활용에는 함수가 큰 지분을 차지한다.
- Call-by-value : 값을 인자로 전달하는 함수의 호출방식
- Call-by-reference : 주소 값을 인자로 전달하는 함수의 호출방식
- C에서의 Call-by-reference는 주소값을 전달받아 함수 외부에 선언된 변수에 접근한다.
- C++에서의 Call-by-reference는 두가지로 구분할 수 있다.
- 주소값을 이용한 Call-by-reference (C의 개념과 동일)
- 참조자를 이용한 Call-by-reference
참조자를 이용한 Call-by-reference
- 다음 코드를 통해 참조자를 활용해도 Call-by-reference가 가능하다는것을 알 수 있다.
void Swap(int& n1, int& n2)
{
int tmp = n1;
n1 = n2;
n2 = tmp;
}
void main()
{
int n1 = 10;
int n2 = 20;
Swap(n1, n2);
//결과 n1 : 20, n2 : 10
}
※ 매개변수의 경우 함수가 호출되어야 초기화가 되기때문에 별도의 에러를 발생시키지 않는다.
참조자를 이용한 Call-by-reference의 단점
int n = 20;
TempFunc(n);
cout << n << endl;
- 위의 코드를 기준으로 봤을때, C의 개념이면 무조건 20이 출력되지만, C++에서의 출력값은 예상할 수 없다.
※ TempFunc(int)의 매개변수가 참조자일 가능성이 있기 때문.
- 따라서, n의 값을 예상하기 위해서는 TempFunc(int)의 함수 원형을 일일이 확인해야하는 불편함이 생긴다.
- 이 단점은 매개변수에 const를 붙여 상수화 시켜서 매개변수의 값 변경을 막을수있다.
- 이런 불명확함 때문에 C++ 프로그래머들은 참조자를 잘 사용하지 않는다.(고 한다.)
상수 참조하기
- 다음과 같은 방법으로 상수의 참조가 가능하다.
const int num = 10;
const int& ref = num;
- Why?
- 이것은 '임시객체'를 참조하기 위한 방법이다.
- 리터럴 상수는 임시적으로 존재하는 값. 즉, 다음 행으로 넘어가면 존재하지 않는 상수다.
- 그래서 C++은 const 참조자를 이용해서 상수를 참조할 때 '임시변수'를 만들고 이 장소에 상수를 저장해 참조하게 끔 한다.
'Stack > C++' 카테고리의 다른 글
C++ 파일 입출력 ofstream, ifstream (0) | 2021.10.16 |
---|---|
C++ 생성자, 복사생성자, 소멸자 (+ const) (0) | 2021.10.15 |
C++ 동적할당 new, delete (0) | 2021.10.13 |
C++ 클래스, 객체, 인스턴스 (0) | 2021.09.29 |
C++ 객체지향 (0) | 2021.09.28 |