본문 바로가기

컴퓨터

2-4. 레퍼런스와 함수

레퍼런스의 장점을 알아보기 위해 먼저 아래 코드를 보자. 포인터를 이용한 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