레퍼런스
변수에 이름을 하나 더 만들어 줄 수 있다.
#include <iostream>
int main()
{
int nData{};
int &ref = nData;
ref = 100;
printf("%d\n", nData); // 100 출력
}
주의 사항
#include <iostream>
int main()
{
int nData{};
// int &ref; // 오류!!
int &ref = nData; // 선언하면서 대입해야 함.
ref = 100; // ref를 부르면 nData를 부르는 것과 같다.
printf("%d\n", nData); // 100 출력
}
레퍼런스와 포인터 차이
1. 레퍼런스는 NULL값이 존재하지 않는다. (포인터는 NULL값 있음.)
레퍼런스는 선언하면서 바로 값을 대입하기 때문에, NULL값 없음.
2. 레퍼런스는 지정한 객체를 바꿀 수 없다.
포인터는 주소값을 바꾸면 되지만, 레퍼런스는 못 바꿈.
// 포인터
#include <iostream>
int main()
{
int* p{};
int nData1{};
int nData2{};
p = &nData1;
p = &nData2;
}
// 레퍼런스
#include <iostream>
int main()
{
int nData1{};
int nData2{};
int& ref = nData1;
&ref = &nData2; // 이런 문법 없음. 오류!!
}
3. 레퍼런스는 사용할 때, 좀 더 편할 수 있다??
2개의 수를 더하는 간단한 코딩을 예시로 보자.
#include <iostream>
// 함수 인자를 포인터 변수로 받으면
void add(const int *pData1, const int *pData2, int *pTotal);
int main()
{
int nData1{}; // 메모리를 잡고,
int nData2{};
int nTotal{};
add(&nData1, &nData2, &nTotal); // 주소값을 전달해야 함.
}
void add(const int * pData1, const int * pData2, int * pTotal)
{
*pTotal = *pData1 + *pData2;
}
#include <iostream>
// 함수 인자를 레퍼런스로 받으면
void add(const int &nData1, const int &nData2, int &nTotal);
int main()
{
int nTotal{};
add(10, 20, nTotal); // 메모리 잡고, 주소값 전달할 필요없이 상수로 함수 사용 가능.
printf("%d\n", nTotal);
}
void add(const int & nData1, const int & nData2, int & nTotal)
{
nTotal = nData1 + nData2;
}
4. 레퍼런스가 사용이 간편하다고 느낄 수 있지만, 배열에서는 포인터가 더 쉽다.
배열이 애초에 포인터라서 따로 불편하지 않다.
#include <iostream>
// 배열을 포인터로 쓰면
void printData(const int* pData, int nLength);
int main()
{
int arData[5]{ 5,4,3,2,1 };
printData(arData, 5);
}
void printData(const int* pData, int nLength)
{
for (int i = 0; i < 5; i++)
{
printf("%d ", pData[i]);
}
printf("\n");
}
레퍼런스도 포인터처럼 간단하게 쓰려면 이렇게 한계가 있다.
#include <iostream>
// 배열을 레퍼런스로 쓰면
void printData(const int(&arData)[5]);
int main()
{
int arData[5]{ 5,4,3,2,1 };
printData(arData);
}
void printData(const int(&arData)[5]) // 5개짜리 배열밖에 입력 못받음..
{
for (int i = 0; i < 5; i++)
{
printf("%d ", arData[i]);
}
printf("\n");
}
억지로 레퍼런스를 포인터처럼 쓰면 되긴 하는데, 포인터가 있으니 배열은 포인터를 쓰자 ㅎㅎ
#include <iostream>
void printData(const int& arData, int nLength);
int main()
{
int arData[5]{ 5,4,3,2,1 };
printData(*arData, 5);
}
void printData(const int& arData, int nLength)
{
for (int i = 0; i < 5; i++)
{
printf("%d ", *(&arData + i));
}
printf("\n");
}
'기타 > C++' 카테고리의 다른 글
[C++] 복사 생성자에 대해서 (2) | 2020.12.24 |
---|---|
[C++] 메모리 관리, 누수잡기 (0) | 2020.12.23 |
[C++] 동적 할당과 메모리 해제 (0) | 2020.12.17 |
[C++] 클래스 생성자에 대해서 (0) | 2020.08.16 |
[C++] 클래스 기본 동작 개념 (0) | 2020.07.10 |