컴퓨터
2-4. 레퍼런스와 함수
sayyesdoit
2019. 4. 5. 20:21
레퍼런스의 장점을 알아보기 위해 먼저 아래 코드를 보자. 포인터를 이용한 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 함수는 전달되는 인자를 레퍼런스로 받고 있다.
레퍼런스를 이용하므로 포인터를 대체했다.