참조 변수 (Reference Variable)
•
참조 변수는 C++에서 새로 추가된 변수이다.
•
변수의 또 다른 이름으로서 사용 한다.
•
내부적으로 포인터와 동일하게 동작 한다.
•
포인터처럼 동작하지만, 포인터 문법이 아닌 일반 변수의 문법을 사용 한다.
•
& 기호를 사용하여 선언 한다.
#include <iostream>
int main()
{
int num = 42;
int* numPTR = #
int& numREF = num;
std::cout << &num << std::endl;
std::cout << numPTR << std::endl;
std::cout << &numREF << std::endl;
std::cout << num << std::endl;
std::cout << *numPTR << std::endl;
std::cout << numREF << std::endl;
return 0;
}
C++
복사
•
아래 사진은 참조, 포인터의 선언 및 사용에 대한 디스어셈블리 결과이다.
•
참조와 포인터의 내부 동작이 동일한 것을 확인할 수 있다.
참조와 포인터의 차이
1.
편의성
•
참조 : 일반 변수처럼 사용 한다.
•
포인터 : 포인터 전용 문법(’→’, ‘*’)을 사용 한다.
2.
초기화
•
참조 : 선언과 동시에 초기화가 필수 이다.
•
포인터 : 초기화가 필수는 아니다.
3.
NULL 포인터 사용
•
참조 : NULL 포인터를 값으로 가질 수 없다.
•
포인터 : NULL 포인터를 값으로 가질 수 있다.
4.
재할당
•
참조 : 다른 변수로 재할당이 불가능 하다. (const 처럼)
•
포인터 : 다른 변수의 주소로 값 변경이 가능 하다.
참조의 용도
1.
함수 매개 변수
•
참조를 함수의 매개 변수로 사용하면, call by address로 동작 한다.
•
call by address로 동작하므로, 매개 변수의 값 복사 비용이 들지 않는다.
2.
함수 반환 자료형
•
참조를 함수의 반환 자료형으로 사용하여, return by address처럼 동작 가능하다.
•
포인터가 주소를 반환하는 것처럼, 참조하고있는 객체의 주소를 반환 한다.
참조와 포인터 중 어떤거 쓰지?
•
Team By Team or 사바사.. 정해진 답은 없다.
•
객체가 없는 경우도 고려해야 한다면 “포인터”. (NULL 체크 필수)
•
read only로 사용한다면 “const 참조”.
•
편의성을 생각한다면 “참조”.
•
원본을 바꾼다는 의미를 명확히 나타내고 싶은 경우 “포인터”.
•
“참조” 사용시 컴파일러 최적화 부분의 장점도 있다고 한다. (inline으로 대체..? 잘 모르겠다.)