2. C++ 참조자(레퍼런스)의 도입

이준혁·2026년 3월 18일

해당 내용은 씹어먹는 C++ 책을 기반으로 하단 블로그의 내용을 공부하기위해 적성한 글임을 알립니다.

레퍼런스의 개념

int x = 10;
int& r = x;

  • r과 x는 완전히 동일한 객체

  • r을 바꾸면 x가 바뀜

  • 선언과 동시에 반드시 초기화 필요

  • 한 번 바인딩되면 다른 변수로 변경 불가

  • 포인터: 주소를 저장 (int* p)

  • 래퍼런스: 변수의 별명 (int& r)

래퍼런스 = “복사가 아닌 원본 자체를 직접 다루는 별명”

#include <iostream>

int change_val(int *p) {
  *p = 3;

  return 0;
}
int main() {
  int number = 5;

  std::cout << number << std::endl;
  change_val(&number);
  std::cout << number << std::endl;
}

change_val 함수의 인자 p 에 number 의 주소값을 전달하여, *p 를 통해 number 를 참조하여 number 의 값을 3 으로 바꿈

int& another_a = a;

그 후에 우리는 a 의 참조자 another_a 를 정의하였습니다. 이 때 참조자를 정하는 방법은, 가리키고자 하는 타입 뒤에 & 를 붙이면 됨

int a = 10;
int* p = &a; // p 는 a 를 가리킨다.

int b = 3;
p = &b // 이제 p 는 a 를 버리고 b 를 가리킨다
  • p는 a를 가리키는것 즉 a가 현재 주소값을 보여 그것을 가리킴
  • b는 3의 주소값을 가리킴
#include <iostream>

int main() {
  int &ref = 4;

  std::cout << ref << std::endl;
}
  • 오류가나옴
  • 위 상수 값 자체는 리터럴 이기 때문에
  • 프로그래밍 언어에서 리터럴(literal)이란, 소스 코드 상에서 고정된 값을 가지는 것을 일컫습니다
int a, b;
int& arr[2] = {a, b};
  • 주소값이 존재한다라는 의미는 해당 원소가 메모리 상에서 존재한다 라는 의미와 같습니다. 하지만 레퍼런스는 특별한 경우가 아닌 이상 메모리 상에서 공간을 차지 하지 않습니다. 따라서 이러한 모순 때문에 레퍼런스들의 배열을 정의하는 것은 언어 차원에서 금지가 됨
int& function() {
  int a = 2;
  return a;
}

int main() {
  int b = function();
  b = 3;
  return 0;
}

-> [1] 7170 segmentation fault (core dumped) ./test 이런 오류가 나옴

int& ref = a;

// 근데 a 가 사라짐
int b = ref;  // !!!
  • 레퍼런스가 필요한데 사라지게됨 이래서 문제임
  • 따라서 위 처럼 레퍼런스를 리턴하는 함수에서 지역 변수의 레퍼런스를 리턴하지 않도록 조심해야함
int& function(int& a) {
  a = 5;
  return a;
}

int main() {
  int b = 2;
  int c = function(b);
  return 0;
}
  • 이경우는 래퍼런스 값이 b로 연결이 되어 그대로 레퍼런스와 연결이 됨 그래서 오류가 안나옴
#include <iostream>

int function() {
  int a = 5;
  return a;
}

int main() {
  const int& c = function();
  std::cout << "c : " << c << std::endl;
  return 0;
}

이런 경우 const로 예외 상수로 받아 상수 레퍼런스로 리턴값을 받게 되면 해당 리턴값의 생명이 연장됨

함수 반환받는 방식가능 여부동작 설명주의사항
int f() (값 반환)int a = f()가능값 복사됨없음
int f() (값 반환)int& a = f()컴파일 오류rvalue를 non-const 참조로 받을 수 없음-
int f() (값 반환)const int& a = f()가능임시 객체를 const 참조로 바인딩lifetime 연장
int& f() (참조 반환)int a = f()가능값 복사됨참조 의미 사라짐
int& f() (참조 반환)int& a = f()가능원본 변수 참조지역 변수 반환 금지
int& f() (참조 반환)const int& a = f()가능const 참조로 바인딩지역 변수 반환 금지

참고

https://modoocode.com/141

profile
#자기공부 #틀린것도많음 #자기개발 여러분 인생이 힘들다 하더라도 그것을 깨는 순간 큰 희열감으로 옵니다~

0개의 댓글