참조자(Reference)
참조자(Reference)
변수를 선언하면 자료형의 크기만큼 메모리 공간을 할당받고, 할당된 공간을 변수명으로 접근이 가능하다.
참조자란 할당된 메모리 공간을 접근할 때 변수명을 대신할 수 있는 또 하나의 이름이다.
즉, 변수에 별명을 하나 붙여 주는것 입니다.
참조자의 선언
참조자는 참조명 앞에 &를 붙여 선언합니다. 참조자의 수는 제한이 없으며, 참조자를 대상으로 참조할 수 있습니다.
#include <iostream>
using namespace std;
int main(void)
{
int num = 10;
int &ref = num; // 참조
int &dref = ref; // 참조
cout << &num << endl; // 주소출력
cout << &ref << endl;
cout << &dref << endl;
return 0;
}참조자는 변수에 대해서만 선언이 가능하고, 선언과 동시에 참조를 해야만 한다.
참조자와 함수
이미 배웠던 것들
Call-by-value : 값을 인자로 전달하는 호출 방식
Call-by-reference : 주소값을 인자로 전달하는 호출방식
복습의 의미에서 다시 코드를 봅시다.
Call-by-value
매개변수는 복사되어 전달되므로 swap 함수내부에서 main함수의 변수에 접근할 수 없다.
Call-by-reference
주소값을 전달하므로 swap 함수 내부에서 main함수의 변수에 접근하여 두 값을 교환할 수 있다.
참조자를 이용한 Call-by-reference
형식매개변수를 참조자로 받게되면 실매개변수의 참조자가 되므로 별칭이 생긴것과 같으므로 swap함수 내부에서 main 함수의 변수에 접근이 가능하다.
참조자와 const
참조자를 이용한 Call-by-reference는 포인터를 활용하는것 보다 활용하기 쉽기 때문에 참조자를 사용하는것이 좋아보인다. 하지만 참조자를 사용하는것이 무조건 좋은것은 아니다. 다음의 코드를 예상해보자
func 함수 호출후에 num값을 출력했을때 결과가 어떻게 될것인지 생각해보자. func 함수의 원형이 다음과 같다면
const를 사용하여 참조로 받지만 a값을 변경할 수 없도록 상수화 한다.
반환형이 참조자료형인 함수
참조자도 반환할 수 있다. 참조자도 하나의 자료형으로 생각하자!
잘못된 참조 반환
상수화된 변수를 참조하는 const 참조자
리터럴 상수가 참조가 가능한 것은 컴파일러가 리터럴 상수를 임시 변수를 만들고 그것을 참조자가 참조하게 되는것이다.
Last updated