본문 바로가기

Programming Languages/C++

참조

포인터와 유사한 개념을 지원하는 것으로 참조(reference)가 있다. 어떠한 변수에 대한 참조는 그 변수의 별명이라고 할 수 있다. 참조형은 ' & ' 기호를 이용하여 다음과 같은 형식으로 선언한다.

TypeName &refVar = varName;

참조는 초기화를 통해 참조 대상을 지정해야 한다. 위의 형식에서 refVar를 varName으로 초기화한 것은 refVar에 varName의 값을 넣는 것이 아니라 refVar가 varName을 참조하도록 지정함으로써 앞으로 refVar를 사용하는 것이 varName을 사용하는 것과 동일한 결과를 내도록 하는 것이다. 다음의 예를 살펴보자.

int a = 10;, b = 20;
int &aRef = a; // aRef는 정수형 변수 a에 대한 참조
cout << aRef << endl;
aRef = 100; // a = 100; a가 100으로 바뀜
aRef = b; // a = b; a = 20으로 바뀜

====== 같은 내용의 포인터 사용 ======

int a = 10;, b = 20;
int *aPtr = &a;
cout << *aPtr << endl;
*aPtr = 100;
*aPtr = b;

aRef는 정수형 참조로서, int &aRef = a; 문장은 aRef에 a의 값을 넣으라는 의미가 아니라 aRef가 a를 참조하라는 의미이다. 그 결과 aRef는 이제 변수 a의 별명처럼 사용할 수 있으며, 따라서 aRef를 출력하는 것은 a를 출력하는 것과 같다. 또한 aRef = 100; 는 a에 100을 넣은 것과 동일하다. 단, 참조가 이처럼 어떤 변수를 참조하도록 초기화하는 것은 참조를 선언할 때에만 하며, 이후에는 참조 위치를 바꿀 수 없다. aRef = b; 는 aRef가 변수 b를 참조하도록 하는 것이 아니라, b의 값을 aRef가 참조하는 곳, 즉 a에 20을 넣는 것이다.

참조는 어떠한 대상을 가리킨다는 점에서 포인터와 유사하지만 몇 가지 차이가 있다.

  1. 참조를 이용하여 값을 읽거나 저장할 때는 변수를 사용하는 형식과 동일하다. 참조의 이름을 그대로 사용하며, 포인터처럼 ' * ' 와 같은 연산자를 사용하지 않는다.
  2. 참조는 초기화를 통해 반드시 어떤 대상을 참조해야만 하므로 아무것도 참조하지 않는 상황은 발생하지 않는다. 포인터는 초기화를 하지 않거나 가리키던 대상을 delete 하거나 포인터에 nullptr가 대입됨에 따라 사용하면 안 되는 곳을 가리키거나 아무것도 가리키지 않는 상황이 발생할 수 있다.
  3. 참조는 초기화를 통해 지정된 참조 대상을 바꿀 수 없어 참조의 유효 기간 동안 하나의 대상만 참조할 수 있다. 포인터는 const 한정어를 지정하지 않는 이상 프로그램 동작 중에 다른 대상을 가리키도록 변경할 수 있는데, 이러한 특성은 프로그램을 파악하기 어렵게 한다.

C++11에서 참조는 l-value 참조와 r-value 참조로 구분된다. C++11 이전의 참조는 l-value 참조에 해당되며, 값을 저장할 수 있는 대상을 참조하기 위한 참조이다. 만일 l-value 참조를 사용하되 그 참조를 통해 참조 대상의 값을 바꾸지 못하게 하려면 const 한정어를 지정한다. 다음은 const l-value 참도의 용법을 보여주는 예이다.

int x {10};
const int &xRef = x;
cout << &xRef << endl; // x의 값을 읽어 출력함
xRef += 10; // 오류: const 참조로 값을 수정할 수 없음

r-value 참조는 값을 사용한 후에는 그 값을 더 이상 가지고 있을 필요가 없는 대상을 참조한다. 특히 객체의 값을 다른 객체로 이동하는 용도에 r-value 참조가 유용하게 활용된다.

'Programming Languages > C++' 카테고리의 다른 글

[함수]-함수의 정의와 호출-함수의 호출  (0) 2020.05.13
[함수]-함수의 정의와 호출-함수의 정의  (0) 2020.05.12
메모리 할당 및 반환  (0) 2020.05.07
포인터  (0) 2020.05.06
배열  (0) 2020.04.30