컴퓨터

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 함수는 전달되는 인자를 레퍼런스로 받고 있다.

레퍼런스를 이용하므로 포인터를 대체했다.