C++의 참조

개요


c++에서 포인터 대용으로 사용할 수 있는 참조(레퍼런스)에 대해서 알아보겠다.




참조(reference)


c++은 참조 변수라는 새로운 복합형을 언어에 추가했다.

참조는 미리 정의된 어떤 변수의 실제 이름 대신 쓸 수 있는 대용 이름이다.

참조의 주된 용도는 함수의 매개변수에 사용하는 것이다. 참조를 매개변수로 사용하면, 그 함수는 복사본 대신 원본 데이터를 가지고 작업한다.

call by value 대신 call by reference 하는 것이다.




참조변수의 생성


c와 c++에서 변수의 주소를 나타내기 위해 &기호를 사용한다 c++에서 &기호는 참조의 의미를 추가로 가지고 있다.

1
2
int a;
int &b = a;

위와 같은 코드에서 b와 a는 코드에서 같은 역할을 하며 실제로 가리키는 메모리 공간또한 같다.

참조는 선언과 동시에 초기화해야한다.

참조는 const 포인터와 상당히 비슷하다.




함수 매개변수로서의 참조


참조는 주로 함수의 매개변수로 사용된다.

참조 매개변수를 사용하면 부른 곳의 데이터가 변경될 수 있다.

만약 함수에 전달하는 정보를 사용만 하게 하려면 상수 참조를 사용하면된다.

int example(const int &a);와 같은 형식으로 사용하면 a의 값을 변경하려 할 때 에러를 발생한다.

간단한 함수는 값을 넘겨주는 것이 좋다. 그러나 구조체나 클래스와 같이 덩치 큰 데이터를 다룰 때에는 상수 참조를 사용하는 것이 좋다.

실제 매개변수와 참조 매개변수가 일치하지 않을 때 임시 변수를 생성할 수 있다. 이는 매개변수가 const 참조일 때만 허용한다.

가능하면 const로 사용하는 것이 좋다. 이유는 다음과 같다.

  1. const를 사용하면, 실수로 데이터 변경을 일으키는 에러를 막을 수 있다.
  2. 원형에 const를 사용하면, 함수가 const와 const가 아닌 실제 매개변수를 모두 처리할 수 있지만, 원형에 const가 아닌 함수는 const가 아닌 데이터만 처리할 수 있다.
  3. const 참조를 사용하면 함수가 자신의 필요에 따라 임시 변수를 생성하여 사용할 수 있다.




구조체에 대한 참조


참조는 c++의 구조체나 클래스를 다루는 데 아주 유용하다.

구조체 매개변수를 선언할 때 참조 연산자를 앞에 붙이면 된다.

1
2
3
4
5
6
7
8
9
struct example
{
  int a;
  int b;
};

void ex_func(example &ex);
void ex_func2(const example &ex);

위와 같은 예시로 사용된다.

리턴형이 참조일 때 함수 안에서만 사용하는 변수를 리턴하지 않도록 해야한다. 그때는 포인터를 이용해서 리턴해야한다.




참조 매개변수를 사용할 때


호출 함수에 있는 데이터 객체의 변경하거나 전체 데이터 객체 대신 참조를 전달하여 속도를 높이기 위해 사용한다.



값만 사용하는 경우


  • 데이터 객체가 기본 데이터형이나 작은 구조체라면 값으로 전달
  • 데이터 객체가 배열이라면 포인터, const를 지시하는 포인터
  • 데이터 객체가 덩치 큰 구조체라면 const 포인터나 const 참조
  • 데이터 객체가 클래스 객체라면 const 참조



기존값을 변경하는 경우


  • 데이터 객체가 기본 데이터형이면 포인터
  • 데이터 객체가 배열이면 포인터
  • 데이터 객체가 구조체이면 참조나 포인터
  • 데이터 객체가 클래스 객체이면 참조




로우레벨로 갔을 때 포인터와 참조


로우레벨 단으로 갔을 때 컴퓨터는 둘의 차이점을 모른다.

같은 어셈블리 명령어를 생성하므로 참조는 오직 인간이 포인터를 더 쉽게 사용하기 위해서 만든것이라 볼 수 있다.