일반 변수
- 직접 값을 보유.
포인터
- 다른 값의 주소(또는 NULL)를 보유.
레퍼런스
- 참조자(Reference)는 변수에 "별명"을 붙인다고 한다.
- 그 별명을 통해서 변수의 메모리 공간에 접근이 가능하다.
- 참조자(Reference)는 이름 앞에 "&"붙여서 선언한다.
- 참조자(Reference)는 변수에 대해서만 선언이 가능, 선언과 동시에 누군가를 참조 해야만 한다.
- 참조자(Reference)는 참조의 대상을 바꾸는 것이 불가능.
- 참조자(Reference)는 NULL로 초기화 하는 것이 불가능.
세 가지 종류의 참조형 지원
- non-const 값 참조형
- const 값 참조형
- r-value 참조형
1)사용법
- 참조자(Reference)가 가지고 있는 값을 변경하면 원래 있던 변수의 값이 변경됨.
- 코드 중에 '&'는 주소(address)를 의미하지 않고 참조(reference)를 의미함.
- 따라서 num1과 num2는 동의어라고 취급된다. (num1 -= 10 해주면 num2도 -10 됨)
int num1 = 10;
int &num2 = num1;
num2 += 10; //num1,2 모두 20으로 변환
2)참조자와 함수
- 레퍼런스를 함수의 매개변수로 사용 가능(Call by Reference)
- C에서는 Call-by-pointer, C++에서는 Call-by-Reference
두 가지 차이점
1.NULL 사용 여부
- 포인터는 NULL 사용을 허용O
- 레퍼런스는 NULL 사용 허용X
struct Point
{
int x;
int y;
};
struct Point *aaa = NULL;
aaa->x = 120;
aaa->y = 240;
- 하지만, 레퍼런스는 문제 발생하지 않음 why ? 페러런스 자체는 NULL을 할당할 수 없도록 아예 처음부터 제한함.
- 포인터와 목적은 같지만 잘못된 참조로 인해 발생하는 오류를 방지하기 위해 고안.
2.참조 대상 할당 및 접근
- 포인터는 참조대상에 대해 &연산을 통해 주소값을 할당함.
- 하지만, 레퍼런스는 참조 대상을 그대로 할당함.
- 레퍼런스는 선언과 동시에 초기화 하지 않으면 컴파일 오류가 발생함. (NULL을 할당 불가)
int a = 10;
int *ppp = &a; //포인터변수에는 주소값이 할당됨.
int &r = a; //레퍼런스에는 참조대상을 그대로 할당함.
결론
레퍼런스는 포인터를 잘못 사용해서 생기는 수많은 재앙과도 같은 문제들을 최소화하기위해 등장
Use references when you can, and pointers when you can have to
사용할 수 있다면 참조자를, 어쩔 수 없다면 포인터를 써라
'C++' 카테고리의 다른 글
[C++] 메모리누수 체크 (0) | 2020.07.23 |
---|---|
[C++] char[] 와 char*의 차이 (0) | 2020.07.22 |
[C++] char*, const char*, char* const (0) | 2020.07.21 |
C++ assign (vector, map) (0) | 2020.07.16 |
C++ 동적할당 (0) | 2020.07.14 |