c++에서는 변수에 또 다른 별명(alias)을 부여할 수 있습니다. 이를 일컬어 레퍼런스(Reference, 참조)라고 부릅니다. 내부적으로는 포인터처럼 취급해서 포인터의 장점을 가지고 있으면서 외부적으로는 일반 변수처럼 취급해 가독성이 좋으며 편리합니다. 이번 장에서는 이런 레퍼런스의 특징에 대해서 정리해 보겠습니다.
레퍼런스
먼저 레퍼런스를 선언하는 방식부터 알아보겠습니다. 레퍼런스를 선언하기 위해서는 변수 앞에 &를 붙이고 다른 변수를 대입하면 됩니다. 예를 들면 다음과 같습니다.
int value = 10;
int& ref = value;
ref 변수는 value 변수의 레퍼런스가 됩니다. 두 개의 변수가 모두 같은 값을 가리키기 때문에 둘 중 하나만 변경해도 다른 변수의 값도 동일하게 바뀝니다. 다음 예제는 ref값을 변경함에 따라 value값도 동일하게 바뀌는 것을 보여줍니다.
int value = 10;
int& ref = value; // ref를 value의 레퍼런스로 선언
ref = 12; // ref값을 변경한다.
cout << value; // value의 값도 바뀐다 10 --> 12
레퍼런스 전달 방식
보통 함수에 값을 전달할 때 값 전달 방식(pass by value)으로 수행합니다. 함수에 매개변수를 넘겨줄 때 원본에 대한 복제본을 넘겨주기 때문에 매개 변수 값을 조작해도 원본의 값은 변하지 않습니다. 하지만 레퍼런스로 매개변수를 전달하면 매개변수를 조작했을 때 원본의 값도 바뀌게 됩니다.
#include <iostream>
using namespace std;
int addOne(int& i)
{
i++;
return i;
}
int main()
{
int x = 5;
int result = addOne(x); //사용법은 정수값을 받는 함수를 호출하는 방법과 같다
cout << "result = " << result << endl;
cout << "x = " << x << endl;
return 0;
}
결과
result = 6
x = 6
복제하는 데 용량이 큰 배열, 클래스, 구조체등을 함수의 매개변수로 넘겨줄 때 레퍼런스로 넘겨주면 복제에 대한 오버헤드가 거의 발생하지 않아 성능 저하를 최소화할 수 있습니다.
const 레퍼런스 전달 방식
함수에 매개변수를 레퍼런스로 전달하면 위에서 언급했듯이 함수 내에서 원본 객체의 값을 변경시킬 수 있습니다. 만약 원본 객체의 값을 변경시키지 않고 복사에 대한 성능저하도 방지하려면 const 레퍼런스로 전달하면 됩니다. 다음은 string 객체를 const 레퍼런스로 전달하는 예를 보여주고 있습니다.
#include <iostream>
using namespace std;
void outputString(const string& str)
{
cout << str << endl;
}
int main()
{
string str = "Hello, World!";
outputString(str);
outputString("Hello, World!");// 리터럴 전달
return 0;
}
결과
Hello, World!
Hello, World!
const 레퍼런스로 넘겨주면 리터럴도 넘겨줄 수 있기 때문에 함수를 더 유용하게 사용할 수 있습니다.
<참고>
1. 전문가를 위한 c++(개정4판) (저자 : 마크 그레고리 / 옮긴이 남기혁)
2. 명품 c++ Programming (저자 : 황기태)
'Program Language > c++' 카테고리의 다른 글
c++ 기초(클래스 정의) (9) | 2023.01.25 |
---|---|
c++ 기초(타입 추론 : auto & decltype) (5) | 2023.01.19 |
c++ 기초 (const 키워드의 사용법) (4) | 2023.01.16 |
c++ 기초(스마트 포인터) (1) | 2023.01.13 |
c++ 기초(동적 배열 할당) (0) | 2023.01.13 |
댓글