본문 바로가기
언어 공부/C++

reference(참조)-1

by 세희홍 2022. 6. 21.

레퍼런스

  1. 변수의 별명. 객체의 또 다른 이름. 코드에서 다루는 방법은 일반 변수와 같지만 내부적으로는 원본 변수에 대한 포인터로 취급
  2. 레퍼런스 변수는 반드시 초기화 해야 한다. (이렇게 참조관계가 한 번 정의되면 이를 끊고 다른 변수와 연결이 불가능)
  3. const 속성을 부여할 수 있다(const 속성을 갖는 레퍼런스 변수는 자신의 값을 변경할 수 없게 된다.)
int score = 92; // score 선언 후 초기화
int& rScore = score; // rScore 선언하고 연결

레퍼런스는 선언과 동시에 초기화를 해줘야 한다. 초기화 안해주면 오류지만 예외는 있다.

rScore는 Score와 똑같이 사용할 수 있다. 

int num = 100;
double& rNum = num; // 컴파일 오류

컴파일 오류가 발생한다. 자료형이 일치해야 한다. 

 

int score = 92;
int& rScore = score;
int num = 80;
int& rScore = num; // 컴파일 오류

rScore 참조변수가 score와 연결한 뒤, 이를 끊고 num과 연결하려고 해서 컴파일 오류가 발생한다. 

참조 관계는 한 번 정의되면 변경될 수 없다. 참조 변수가 선언되고 어떤 변수와 연결되면, 참조 관계는 스코프를 벗어나서 변수가 파괴되기 전까지는 계속 유지된다. (constant relation: 영구적인 관계)

int score = 92;
int& rScore = score;
int num = 80;
rScore = num;

이 코드의 마지막 문장은  참조 연결을 하는 문장이 아니라 에러가 발생하지 않는다. 

score, rScore는 80으로 값이 변경된다. 

 

double d1 = 3.97;
double& rd1 = d1;

cout << d1 << ' ' << rd1 << endl; // 3.97 3.97
rd1 = 3.5;
cout << d1 << ' ' << rd1 << endl; // 3.5 3.5

d1에게 rd1이라는 별명을 붙여주면 둘은 같은 값을 가리키게 된다.

rd1의 값을 바꾸면 d1의 값도 바뀐다. 

d1의 값을 바꿔도 rd1의 값이 바뀐다. 

 

double d1 = 3.97;
double d2 = 4.01;
double& rd1 = d1;

rd1 = 3.5;
rd1 = d2;
cout << d1 << ' ' << rd1 << ' ' << d2 << endl; // 4.01 4.01 4.01

rd1과 d1의 관계가 이미 초기화됐기 때문에 d2를 rd1에 넣는 것은 둘이 묶이는 것이 아니라 d2의 값이 rd1이 가리키는 값(d1)에 들어가게 된다. 

 

참조 다중성

int num = 100;
num& rNum1 = num; // rNum1과 num을 연결
num& rNum2 = num; // rNum2과 num을 연결
num& rNum3 = num; // rNum3과 num을 연결

3개의 참조 변수를 만들었으므로 num, rNum1, rNum2, rNum3으로 같은 메모리 위치에 접근할 수 있다.

int num1 = 100;
int num2 = 200;
num& rNum = num1; 
num& rNum = num2; // 컴파일 오류

참조 변수 하나를 여러 변수와 연결하려고 하면 컴파일 오류가 발생한다. 

int& x = 92; // 컴파일 오류

참조 변수에 값을 바로 넣는 것은 불가능하다. 

 

값 변경

const

1.  원본 변수, 참조 변수로 메모리 위치의 값 변경 가능

int score = 92;
int& rScore = score;

2. const 한정자가 붙지 않은 참조 변수에 const 한정자가 붙은 변수를 바인드하면 컴파일 오류 발생

const int score = 92;
int& rScore = score; // 컴파일 에러

3. 원본 변수를 사용해서 값을 변경할 수 있지만, 참조 변수를 사용해서는 값 변경 불가(read only)

int score = 92;
const int& rScore = score;

4. 원본 변수와 참조 변수를 통해서 데이터를 변경할 수 없다. (read only)

원본 변수에 const 한정자가 붙으면 값을 변경할 수 없다. 원본 변수에 const 변수를 붙였다면 참조변수도 const 한정자를 붙여야 한다. 

const int score = 92;
const int& rScore = score;

int b = 1;
int& rb = b;

cout <<  " " << b << " " << rb << endl; // 1 1
rb = 2;
cout << " " << b << " " << rb << endl; // 2 2

레퍼런스 변수에 const 속성을 부여하면

int b = 1;
const int& rb = b;

cout <<  " " << b << " " << rb << endl; // 1 1
// rb = 2; // 컴파일 에러
b = 3;
cout << " " << b << " " << rb << endl; // 3 3

레퍼런스 변수를 통해 값을 변경할 수 없게 된다. rb의 값을 변경할 수 없다. 

변수 b의 값을 변경하는 것은 가능하다. 

'언어 공부 > C++' 카테고리의 다른 글

메모리 관리  (0) 2022.06.22
포인터-2  (0) 2022.06.22
포인터-1  (0) 2022.06.22
reference(참조)-2  (0) 2022.06.21
클래스와 생성자  (0) 2022.06.20

댓글