본문 바로가기

컴퓨터

2-3 레퍼런스(Reference)의 이해

레퍼런스란?

레퍼런스란 이미 이름이 있는 대상에게 붙여주는 별명이다.

int &ref = val;

val이라는 int형 변수의 이름에 ref라는 별명을 붙인 것이다.

&연산자는 C++에서 레퍼런스를 선언할 때에도 사용된다. C에서는 주소 값을 얻을 때 사용한다.

레퍼런스의 특징

#include <iostream>

using std::cout;
using std::endl;

int main(void) {
	int val = 10;
	int &ref = val;

	val++;
	cout << "ref : " << ref << endl;
	cout << "val : " << val << endl;

	ref++;
	cout << "ref : " << ref << endl;
	cout << "val : " << val << endl;

	return 0;
}

10, 14: 레퍼런스를 조작하든지 변수를 직접 조작하든지 모두 변수의 값이 바뀐다. 즉, 레퍼런스를 가지고 하는 연산은 레퍼런스가 참조하는 변수의 이름을 가지고 하는 연산과 같은 효과를 지닌다.

변수와 레퍼런스의 비교

◇ 변수 선언 과정: 메모리 공간 할당 → 이름 부여

◇ 레퍼런스 선언 과정: 이름부여

레퍼런스 선언이란 이름이 존재하는 메모리 공간에 하나의 이름을 더 부여하는 행위이다.

결국 레퍼런스와 변수는 생성되는 방법에 있어서만 차이를 보일 뿐 일단 만들어지고 나면 완전히 같은 것이다.

레퍼런스를 이용하면 심지어 하나의 메모리 공간에 셋 이상의 이름을 부여할 수도 있다.

레퍼런스의 제약

레퍼런스는 이미 이름을 지니고 있는 메모리 공간에 하나의 이름을 더 부여한다는 특징을 지닌다. 그러므로 아래와 같은 경우는 에러가 발생한다.

int main(void) {
	int &ref1;
	int &ref2 = 10;

	int val = 10;
	ref1 = val1;

	return 0;
}

2: 선언만 하고 초기화되지 않았으므로 오류이다. 레퍼런스는 선언과 동시에 초기화되어야 한다.

3: 상수는 "이미 이름을 지니고 있는 메모리 공간"이 아니므로 오류이다.