레퍼런스의 장점을 알아보기 위해 먼저 아래 코드를 보자. 포인터를 이용한 Call-By-Reference의 예에 잘못된 코드가 한 줄 들어간 것이다.
#include <iostream>
using std::cout;
using std::endl;
void swap(int *a, int *b) {
int temp = *a;
a++;
*a = *b;
*b = temp;
}
int main(void) {
int val1 = 10;
int val2 = 20;
cout << "val1: " << val1 << ' ';
cout << "val2: " << val2 << endl;
swap(&val1, &val2);
cout << "val1: " << val1 << ' ';
cout << "val2: " << val2 << endl;
return 0;
}
7: 실수로 들어간 코드인데 포인터 연산이 일어나버렸다. 이것이 바로 포인터를 이용한 Call-By-Reference의 단점이다. 포인터 연산이 가능하기 때문에 잘못된 메모리 접근을 할 가능성이 높다.
레퍼런스를 이용한 Call-By-Reference
함수 내에서 외부에 존재하는 변수에 직접 접근하는 것은 허용하되, 포인터 연산은 못하게 하면 위의 문제를 해결할 수 있다. 그것이 바로 레퍼런스를 이용한 Call-By-Refernce 이다.
#include <iostream>
using std::cout;
using std::endl;
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
int main(void) {
int val1 = 10;
int val2 = 20;
cout << "val1: " << val1 << ' ';
cout << "val2: " << val2 << endl;
swap(val1, val2);
cout << "val1: " << val1 << ' ';
cout << "val2: " << val2 << endl;
return 0;
}
18: val1, val2 변수를 전달하며 swap 함수를 호출하고 있다.
5: 그런데 swap 함수는 전달되는 인자를 레퍼런스로 받고 있다.
레퍼런스를 이용하므로 포인터를 대체했다.
'컴퓨터' 카테고리의 다른 글
2-7. new & delete (0) | 2019.04.06 |
---|---|
2-5 레퍼런스를 이용한 성능의 향상 (0) | 2019.04.06 |
2-3 레퍼런스(Reference)의 이해 (0) | 2019.04.05 |
1-5. 이름공간(namespace)에 대한 소개 (0) | 2019.04.05 |
1-4. 인-라인(in-line) 함수 (0) | 2019.04.05 |