레퍼런스

Yama·2023년 12월 22일
0

어소트락 수업

목록 보기
22/55

레퍼런스

  • 레퍼런스는 포인터랑 많이 비교된다.
    • 거의 비슷하다.
void Set(int* _pInt)	// 3
{
	*_pInt = 10;
}

void Set(int& _Ref) 	// 4
{
	_Ref = 100;
}

int main()
{
	int i = 0;

	Set(&i); // 1
    Set(i);	 // 2
	return 0;
}
  • // 1은 원본주소를 넘겨서 // 3으로 접근해서 10을 넣었을것이다.(포인터)
  • // 2는 i라는 자기자신을 참조하고 넘겨서 // 4로 접근한후 100을 넣는다.(레퍼런스)
    • 레퍼런스를 불러도 원본 i 값이 수정된다.
  • // 1,2는 전달하는 인자 갯수는 같지만 형이 달라서 함수 오버로딩된것이다.

레퍼런스가 필요한 이유

  • 포인터 활용해서 주소를 접근할려면 주소연산자(&)라는걸 알려줘야됬다 그렇지만 레퍼런스는 자기 자신을 참조할떄 &를 붙이지 않는다.
  • 포인터는 *p = 10;처럼 포인터를 붙여서 접근을 해야됬지만 레퍼런스는 받은 변수는 직접적으로 포인터 접근이 아니라 그냥 직접 값을 바꿔주기때문이다.

레퍼런스 동작원리

#include <iostream>

int main()
{

	int iData = 0;

	int* p = &iData;
	*p = 10;
	
	int& ref = iData;
	ref = 20;

	return 0;
}
  • C++에서 추가된 Reference는 포인터와 내부적으로 동작원리가 같다.
    • 내부 동작은 주소를 받아서 원본에 접근 후 수정한다.
  • C++ 문법 상으로는 참조 변수에 원본 변수 &를 붙여서 주소를 전달할 필요가 없고 레퍼런스는 변수는 *을 붙여서 원본에 접근하는 연산을 할 필요가 없다.
  • 포인터와 레퍼런스는 동작방식은 같지만 C++에서는 레퍼런스를 사용해서 부수적인 기호를 안붙이고 사용할수 있다.
#include <iostream>

int main()
{
	// 1
    int iData = 0, iData2 = 0;
	int* p = &iData2;
	*p = 10;
    
	// 2
	int& ref = iData;
	ref = 20;
	ref = iData2;

	// 3
	int* const pointer = &iData; 
	//pointer = &iData2; 		// 오류 1
	*pointer = 200;
    
	// 4
	const int& const_ref = iData;
	const_ref = 100; 			// 오류 2
	const_ref = &iData2;		// 오류 3
	
    
    // 5
	int d = const_ref;


	return 0;
}
  • // 1, 2는 둘다 iData2값을 // 1은 p에 // 2는 ref 변수에 대입할려는 것이다.
    • // 1은 포인터는 두가지 iData,iData2값을 대입하고싶다면 주소값(참조 대상)을 일일히 다 넘겨줘야한다.
    • // 2는 레퍼런스한걸로 ref에 iData값을 넣고 다음에 20넣고 iData2값을 넣어서 ref자체의 값(원본 값)을 수정하고 있다.
  • // 3은 포인터(*)const 타입 포인터와 레퍼런스의 기능이 유사하다.
    • 처음 초기화 당시 받은 대상을 다른 대상으로 바꿀 수 없는 부분이.
  • // 4는 const & 타입은 const * const와 유사하다.
    • 처음 초기화 당시 받은 원본 참조를 다른 대상으로 변경 불가능하고 참조받은 대상 원본 또한 수정하는 것도 불가능하기 때문이다.
  • // 5는 규모가 큰 데이터를 읽어 들일때 사용한다.
    • 인자가 너무 크면 주소를 넘긴 경우가 있었당.

레퍼런스가 포인터 보다 좋은가?

  • 참조할 대상의 자료형에 따라서 레퍼런스와 포인터를 고민해서 잘 사용해야 한다.
  • 하나의 데이터를 넘길때는 레퍼런스 타입이면 괜찮지만
  • 내가 전달할 데이터가 배열처럼 연속적인 구조면 가리킬 수 있는건 포인터 밖에 없다.

강의 코드

main_reference.cpp

#include <iostream>

void Set(int* _pInt)
{
	*_pInt = 10;
}

void Set(int& _Ref)
{
	_Ref = 100;
}

int main()
{
	int i = 0;

	Set(&i);
	Set(i);

	int iData = 0, iData2 = 0;

	int* p = &iData;
	*p = 10;

	p = &iData2;
	*p = 10;

	int& ref = iData;
	ref = 20;
	ref = iData2;
    
	int* const pointer = &iData;
	//pointer = &iData2;
	*pointer = 200;

	const int& const_ref = iData;
	//const_ref = 100;

	int d = const_ref;

	return 0;
}

1차 23.12.22
2차 23.12.25
3차 23.12.26
4차 23.12.27
5차 23.12.28
6차 23.01.02

0개의 댓글