C++에서는 C언어에 없는 reference 개념을 도입했다. 포인터 변수를 선언하기 위해 *기호를 사용하지만. 참조변수를 선언하기 위해서는 &기호를 사용한다.
●참조(reference)와 참조변수(reference variable)의 의미를 이해하기 위해 예를 들어 보겠다
'AA'는 '반장'이다. '반장'과 'AA'은 동일 인물이며 '반장'은 'AA'의 별명이다. 참조란 가리킨다는 뜻으로 ,
reference variable(참조변수)은 AA에게 붙여진 '반장' 별명처럼 이미 선언된 변수에 대한 별명이다.
C++ 참조 활용
●참조변수
●참조에 의한 호출
●함수의 참조 리턴
참조변수 선언
이미 선언된 변수에 대한 별명으로서, &를 이용하여 선언하며, 선언 시 반드시 원본 변수를 초기화 해야 한다.
●사용법
1
2
3
4
5
|
int a = 2;
int &aa = a; //참조 변수 aa선언, aa는 a에 대한 별명, aa와 a는 동일한 변수
Circle circle;
Ciecle &ab = circle; //참조 변수 ab 선언, ab는 circle에 대한 별명, ab와 circle은 동일한 변수
|
cs |
aa는 선언된 변수 a에 대한 별명이며, ab는 circle 객체에 대한 별명이다. aa와 ab는 따로 변수 공간을 갖지 않고, 각각 a와 circle을 공유한다. 참조변수가 선언되면, 참조 변수 이름만 생성되며, 별도의 공간은 할당되지 않는다. 대신, 참조 변수는 초기화로 지정된 원본 변수의 공간을 공유한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
●예제
#include <iostream> using namespace std;
/*래퍼런스(reference)
nickname
선언과 동시에 초기화를 해야한다
한번 참조하면 변경 불가*/
void main() {
int a = 10;
int b = 20;
int &aa=a; //reference variable, 선언시 변수 앞에 붙여야함 선언과 동시에 초기화
cout << a << "\t" << b << "\t" << aa << endl;
cout << &a << "\t" << &b << "\t" << &aa << endl;
aa = 500;
cout << a << "\t" << b << "\t" << aa << endl;
aa = b;
cout << a << "\t" << b << "\t" << aa << endl;
|
cs |
▶ call by reference(참조에 의한 호출)
함수의 먀갸 변수를 참조 타입으로 선언하여, 매개 변수가 함수를 호출하는 쪽의 실인자를 참조하여 실인자와 공간을 공유하도록하는 인자 전달 방식이다. 참조 타입으로 선언된 함수의 매개 변수를 참조 매개 변수(reference parameter)라고 부른다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
●예제
#include <iostream> using namespace std;
void input(int &x, int &y);
void dis(int x, int y);
int main() {
int a = 10;
int b = 20;
input(a, b);
dis(a, b);
}
void input(int &x, int &y) { //참조 매개 변수 a, b
int tmp;
tmp = x;
x = y; //참조 매개 변수를 보통 변수처럼 사용
y = tmp;
} //x, y는 a, b의 별명, x, y는 이름만 생성하고 변수 공간 생기지 않음
void dis(int x, int y) {
cout << x << " " << y << endl;
} ●결과
|
cs |
input() 함수가 호출되면, 참조 매개 변수 x, y는 실인자 a, b를 참조하도록 초기화되며, 함수 내에서는 보통 변수처럼 사용한다. 변수 a, b는 main() 스택에 생성되지만, 참조 매개 변수 x, y는 이름만 존재하면 input()의 스택에 공간 할당을 받지 않는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
●예제2
#include <iostream> using namespace std;
void input(int &a);
void dis(int a);
void main() {
int a = 10;
input(a);
dis(a);
}
void input(int &a) {
a = 100;
}
void dis(int a) {
cout << a << endl;
}
●결과 결과는 맞춰보세요 ^^ |
cs |