본문 바로가기
IT/C++(CPP)

CPP 초급 강좌 19. C++ 레퍼런스 reference

by 신림83 2020. 10. 29.
반응형

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이 될 수 없습니다.

 포인터 출력 시 기존 변수의 주소와 같은 주소를 출력합니다.

 

공부하자!

  봐주셔서 감사합니다.

반응형

댓글