C++ 의 참조자 (레퍼런스)

은수·2022년 5월 20일

cpp study

목록 보기
2/21

참조자

  • 변수 : 할당된 메모리 공간에 붙여진 이름으로, 변수를 통해 해당 메모리에 접근 가능
  • 참조자 : 할당된 하나의 메모리 공간에 다른 이름을 붙이는 것을 의미. 즉, 다른 변수나 상수를 가리키는 또 다른 방식
#include <iostream>

int main() {
  int a = 3;
  int& another_a = a;

  another_a = 5;
  std::cout << "a : " << a << std::endl;
  std::cout << "another_a : " << another_a << std::endl;

  return 0;
}

  • 참조자를 정하는 방법은, 가리키고자 하는 타입 뒤에 &를 붙이는 것
  • 즉 레퍼런스란, another_aa의 또 다른 이름이라고 컴파일러에게 알려주는 것을 의미

레퍼런스 사용 시 주의사항

  1. 레퍼런스는 반드시 처음에 누구의 별명이 될 것인지 지정해야함
int& another_a; // 불가능
int& another_a = a; // 가능
  1. 레퍼런스가 한 번 별명이 되면 절대로 다른 이의 별명이 될 수 없음
int a = 10;
int &another_a = a; // another_a 는 이제 a 의 참조자!

int b = 3;
another_a = b; // b의 별명이 another_a라는게 아니라, a에 b의 값을 대입하라는 의미
  1. 레퍼런스는 메모리 상에 존재하지 않을 수도 있다.
int a = 10;
int &another_a = a; // another_a 가 쓰이는 자리는 모두 a로 바꿔치기하면 되므로 메모리 상에 공간을 할당할 필요가 없음

레퍼런스의 배열과 배열의 레퍼런스

레퍼런스의 레퍼런스, 레퍼런스의 배열, 레퍼런스의 포인터는 존재할 수 없음

int a, b;
int& arr[2] = {a, b}; // error

문법 상 배열의 이름(arr)은 첫 번째 원소의 주소값으로 변환될 수 있어야 함.
따라서 arr[1]과 같은 문장이 *(arr+1)로 바뀌어 처리될 수 있음. 즉, 주소값이 존재한다라는 의미는 해당 원소가 메모리 상에서 존재한다는 것을 의미함. 하지만 레퍼런스는 특별한 경우가 아닌 이상 메모리 상에서 공간을 차지하지 않기 때문에 cpp 언어 차원에서 금지되어 있음.

_
그러나 반대로, 배열들의 레퍼런스는 가능

#include <iostream>

int main() {
  int arr[3] = {1, 2, 3};
  int(&ref)[3] = arr;

  ref[0] = 2;
  ref[1] = 3;
  ref[2] = 1;

  std::cout << arr[0] << arr[1] << arr[2] << std::endl;
  // 출력 결과 231
  return 0;
}

위의 예제에서는 ref가 arr를 참조.
따라서 ref[0] ~ ref[2]는 각각 arr[0] ~ arr[2]의 레퍼런스가 되는 것!

0개의 댓글