CPP 초급 강좌 19. C++ 레퍼런스 reference
레퍼런스에 대해 알아보겠습니다.
C++에서 레퍼런스란 무엇인가를 알기 위해 기존의 변수 라는 표현이 뭔가를 정리해 볼까요?
변수
메모리의 특정 위치를 가르치는 이름입니다.
코딩시 해당 메모리에 접근하기 위한 용도로 사용을 합니다.
그럼 레퍼런스는?
기존 변수에 또 다른 이름을 부여하는 것이라고 보면 됩니다.
코드를 보겠습니다.
#include <iostream>
using namespace std;
int main()
{
int n = 0;
n = 10;
int& r = n; //레퍼런스의 선언
r = 20;
cout << n << endl; //값 출력
cout << r << endl; //값 출력
cout << &n << endl; //주소 출력
cout << &r << endl; //주소 출력
}
레퍼런스는 코드로 형식& 라 선언합니다. 위의 int& r에서 r은 레퍼런스로 선언되어 있습니다.
n 변수를 선언한 뒤 10 값을 넣었습니다. 해당 변수를 래퍼런스로 연결한 뒤 다시 20 값을 넣었을 때 n과 r은 같은 지역의 바라보고 있기 때문에 둘 다 20으로 값 변경이 일어났습니다. 이 관련하여 아래 주소 출력 시 같은 주소를 출력합을 보실 수 있습니다.
call by value, pointer, reference
특정 함수의 인자로 각 형태들이 넘어가는 걸 해볼까요?
void f1(int n) { ++n; }; //a
void f2(int *p) { ++(*p); }; //b
void f3(int& r) { ++r; }; //c
각 int 형 변수를 하나 선언하여 넣었다고 가정해 봅시다.
int n = 0;
a.
f1(n); 을 호출하면 이는 call by value입니다. 원본과는 상관없이 복사되어 동작하고 원본 값에 영향이 없습니다.
b.
f2(&n); call by pointer 입니다. 값을 변경 시 원본 값 또한 변화합니다.
c.
f3(n); call by reference 입니다. 역시 값을 변경 시 원본 값 또한 변화합니다.
레퍼런스 형식은 동작은 포인터와 유사합니다.
하지만 레퍼런스와 포인터는 분명 차이가 있습니다.
포인터
초기화시 변수 주소로 초기화해야 하며 초기값 생략이 가능합니다.
int* p = &n;
int* p = null;
값 접근 시 * 연산자가 필요합니다.
null 값을 가질 수 있습니다.
주소 출력 시 포인터 변수의 주소가 출력됩니다.
레퍼런스
초기화 시 반드시 변수 이름으로 초기화해야 합니다. 초기값이 무조건 필요합니다.
null이 될 수 없습니다.
포인터 출력 시 기존 변수의 주소와 같은 주소를 출력합니다.
봐주셔서 감사합니다.
'IT > C++(CPP)' 카테고리의 다른 글
CPP 초급 강좌 21. C++ reference return, rvalue reference && (0) | 2020.10.31 |
---|---|
CPP 초급 강좌 20. C++ const reference (16) | 2020.10.30 |
CPP 초급 강좌 18. C++ if init, if constexpr, rang for (4) | 2020.10.28 |
CPP 초급 강좌 17. C++ 람다표현식 lambda expression (22) | 2020.10.27 |
CPP 초급 강좌 16. C++ constexpr function (6) | 2020.10.26 |
댓글