[C++] 참조(Refernce) 변수 #1

참조(reference)는 미리 정의된 어떤 변수의 실제 이름 대신 쓸 수 있는 대용 이름이다. 참조의 주된 용도는 함수의 형식 매개변수에 사용하는 것이다. 참조를 전달인자로 사용하면, 그 함수는 복사본 대신 원본 데이터를 가지고 작업한다. C와 C++는 변수의 주소를 나타내기 위해 &기호를 사용한다. C++는 & 기호에 또 하나의 의미를 추가하여 참조 선언을 나타내게 하였다. 예제를 통해 알아 보자.

예제 #1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>

using namespace std;
void main()
{
    int rats = 101;
    int & rodents = rats; // rodents는 참조변수이다.
    
    cout << "rats = " << rats;
    cout << ", rodents = " << rodents << endl;
    rodents++;
    cout <<"rats = "<< rats;
    cout <<", rodents="<< rodents<<endl;
    
    cout <<"rats의 주소 = " << &rats;
    cout <<", rodents의 주소"<< &rodents << endl;
}
1
2
3
4
💻출력💻
rats = 101, rodents = 101
rats = 102, rodents = 102
rats의 주소 = 0031FC38, rodents의 주소0031FC38

다음 명령문에 사용된 & 연산자는

int & rodents = rats;

주소 연산자가 아니라, rodents 변수를 int &형, 즉 int 형 변수에 대한 참조로 선언한다. 그러나 다음 명령문에 사용된 & 연산자는

cout <<", rodents의 주소"<< &rodents << endl;

주소 연산자이며, &rodents는 rodents가 참조하는 변수 의주소를 나타낸다.

실행 결과를 보면, rats와 rodents는 같은 값과 같은 주소를 가지고 있다. 그리고 rodents를 1만큼 증가시키는 일이 두 변수 모두에 영향을 주었다. 더 정확하게 말하자면, rodents++는 이름이 두 개인 변수의 값을 증가시켰다.

1
2
3
4
int rat;
int & rodent;
rodent = rat; //이렇게 할 수는 없다.
// 또한 참조를 선언할 때 참조 변수를 함께 초기화 해야 한다.

예제 #2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
 
using namespace std;
 
void main()
{
    int rats = 101;
    int & rodents = rats;    //rodents는 참조이다
    
    cout<< "rats = " << rats;
    cout << ", rodents = " << rodents << endl;
    
    cout << "rats의 주소 = " << &rats;
    cout << ", rodents의 주소 = " <<&rodents << endl;
    
    int bunnies = 50;
    rodents = bunnies;                     //참조를 바꿀수 있을까?
    cout << "bunnies = " << bunnies;
    cout << ", rats = " << rats;
    cout << ", rodents = " << rodents << endl;
    
    cout << "bunnies의 주소 = " << &bunnies;
    cout << ", rodents의 주소 = " << &rodents << endl;
}
1
2
3
4
5
💻출력💻
rats = 101, rodents = 101
rats의 주소 = 0031FC38, rodents의 주소0031FC38
bunnies = 50, rats = 50, rodents = 50
bunnies의 주소 = 0029FD20, rodents의 주소 = 0029FD38

언뜻 보기에 rodents의 값이 101에서 50으로 변했기 때문에 rodents로 하여금 bunnies를 참조하게 하려는 시도는 성공한 것 처럼 보인다. 그러나 자세히 보면 rats와 rodents가 여전히 같은 주소를 공유하고 있다. 이 주소는 bunnies의 주소와는 다르다. rodents가 rats 의 대용 이름이기 때문에, rodents = bunnies; 이 대입 명령문은 실제로는 다음 명령과 동일한 것이다.

  • rats = bunnies;

즉, “rats 변수에 bunnies 변수의 값을 대입하라” 는 의미이다. 쉽게 말해서, 참조는 대입문이 아니라 초기화 선언에 의해서만 설정할 수 있다.

Cpp 카테고리 내 다른 글 보러가기

댓글남기기