레퍼런스
C++에서부터 등장하는 자료형.
포인터를 통해서 메모리 공간을 참조했을 때,
int * p = #
*p = 20;
포인터가 주소값을 통해서 참조하는 행위를 “간접 참조”한다고 칭함. → p와 num은 동일한 것이 아님. 엄연히 다른 자료형과 다른 값을 지니지만 단지, 같은 메모리 공간에 접근할 수 있을 뿐임.
*(&num)= 20;
직접 참조 : 어떠한 도구나 변수 없이 직접적으로 해당 변수의 주소를 추출하여 메모리 공간의 접근함.
레퍼런스
int& r = num; //자료형에 &
r =20;
→ 직접 참조의 방식. 이것이 왜 직접 참조인가? 위 p와 num의 주소는 다르지만, r과 num의 주소는 같음. 또한, 레퍼런스는 용량이 없음. sizeof(r)을 하면 4바이트가 나오지만, 그저 ‘참조 가능한 데이터의 크기’를 의미할 뿐임.
! 레퍼런스는 기능만 가지고 있는 자료형이라고 보는 것이 맞음. 그렇기에 용량이 없기에 선언과 동시에 초기화를 꼭 실행해주어야 함.
! 레퍼런스는 참조의 대상이 오로지 하나만 가능함.(초기화 이후로 변경될 수 없다는 뜻)
레퍼런스의 장점 용량이 없고 속도가 빠르며 개별적 참조 대상을 두어 데이터 관리가 효율적. call_by_value쓰듯이 사용할 수 있음.
레퍼런스의 한계 lvalue만 참조가 가능함, 동적할당을 할 수가 없다. 참조 대상이 변경 불가하다.
Lvalue만 참조 가능하다?
const int& r = 100; //예외적으로 가능함
읽기 전용 레퍼런스 : 문자열 상수에 많이 사용함. 매개변수로 사용할 때. (rvalue 레퍼런스도 있는데 지금은 안배울 것)