일반 변수

  • 직접 값을 보유.

포인터

  • 다른 값의 주소(또는  NULL)를 보유.

레퍼런스

  • 참조자(Reference)는 변수에 "별명"을 붙인다고 한다.
  • 별명을 통해서 변수의 메모리 공간에 접근이 가능하다.
  • 참조자(Reference)는 이름 앞에 "&"붙여서 선언한다.
  • 참조자(Reference)는 변수에 대해서만 선언이 가능, 선언과 동시에 누군가를 참조 해야만 한다.
  • 참조자(Reference)는 참조의 대상을 바꾸는 것이 불가능.
  • 참조자(Reference)는 NULL로 초기화 하는 것이 불가능.

세 가지 종류의 참조형 지원

  1. non-const 값 참조형
  2. const 값 참조형
  3. 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

+ Recent posts