타입 &변수 = 대상체;
레퍼런스(Reference)
= 변수에 대한 별명(Alias)을 정의하여 이름을 하나더 붙인다. 동일한 메모리의 위치를 지목한다는 점에서 공통점이 있지만, 차이점도 많다.
레퍼런스의 특징을 몇가지 적자면 다음과 같다.
1. Alias의 선언에 있어서 레퍼런스와 대상체는 타입이 일치해야 한다.
(ex. int - int , double - double)
2. 레퍼런스는 선언할 때 초기화되어 같은 대상체를 계속 가리키며 실행 중에 참조 대상을 변경할 수 없다.
(ex.
int main()
{
int i=3,j=9;
int &ri =i; //i의 Reference 선언
printf("i = &d, ri = &d, j = &d \n", i, ri, j);
ri = j;
printf("i = &d, ri = &d, j = &d \n", i, ri, j);
출력문의 결과 :
3 3 9
9 9 9 )
3. 레퍼런스에 대한 모든 연산은 대상체에 대한 연산이다. 또한 포인터와 달리 모든 연산이 가능하다.
레퍼런스의 활용방안
1. 레퍼런스를 인수로 활용
함수를 실행시킬 때 인수로 구조체같이 큰 데이터를 받게 될 경우 복사 시간이 오래 걸린다. 포인터나 레퍼런스를 받는 참조 호출은 번지나 별명을 받기 때문에 실인수를 즉각 변경할 수 있고 전달 속도도 빠르다.
(C++ 트레이닝 '김상형' 님의 책에 따르면 포인터보다 레퍼런스의 이용이 훨씬 직관적이라고 한다)
+ 이중포인터의 경우 인수의 선언은 *& 변수명이다.
2. 레퍼런스 리턴
함수가 레퍼런스 타입을 리턴할 수도 있다. 함수가 레퍼런스 타입을 리턴하는 형식을 위할 경우 '함수 호출문'에서 변수에 값을 대입하는 것이 가능해진다. 이러한 형식의 함수는 일반적으로 직관력이 많이 떨어지지만 복잡한 배열과 구조체 속에서 특정 요소를 검색하여 값을 변경할 해야하는 경우 유용하다.
int Array[] = {1,2,3};
int &FixArray(int i)
{
return Array[i];
}
int main()
{
FixArray(3)= 6;
printf("Array[3] = %d\n", Array[3]);
}
'Language > C++' 카테고리의 다른 글
vector 사용 시 []연산자와 at() 멤버 함수의 차이 (0) | 2021.01.21 |
---|---|
함수 객체와 그 활용성에 관하여 (0) | 2021.01.06 |
연산자 오버로딩과 주의할 점 (0) | 2020.12.23 |
인라인 함수와 매크로 함수 (0) | 2020.11.20 |
C++의 개선된 문법 (0) | 2020.11.10 |