답변 2
3
참조변수를 어떤 변수를 사용하고자 할 때 사용한다고 이해하시기 보다는,
포인터는 주소값을 할당하고, 참조변수는 대상(객체)를 직접 할당 한다고 이해하시는 것이 좋을 것 같습니다.
int a = 10;
int *p = &a; // 포인터는 주소값을 할당
int &r = a; // 레퍼런스(참조)는 대상을 직접 할당
포인터의 정의를 다시 살펴보면, 포인터는 메모리의 주소를 가지고 있는 변수이고
참조자는 자신이 참조하는 변수를 대신할 수 있는 또 하나의 이름입니다.
즉, 변수에 별명과도 같은 별칭을 붙여주는 것입니다.
포인터변수와 참조로 swap하는 것에 표면적으로 드러나는 차이점은 없습니다.
이번 제 강의에서는 메모리와 관련된 내용을 다루지 않기에 간단하게 넘어갔는데요.
포인터 변수와 참조 변수의 차이점에 관해서만 간단하게 보충해드리면,
1. 포인터는 NULL로 초기화할 수 있지만 참조는 NULL 초기화를 할 수 없다.
int* p = nullptr;
int& r = nullptr // error
2. 포인터는 주소 값을 저장하기 위해 메모리 공간을 소모하지만,
참조는 같은 메모리 공간을 참조하므로 추가적으로 메모리 공간을 소모하지 않는다.
3. 포인터를 매개변수로 함수 인자 전달 시 메모리 소모가 일어나고, 값 복사가 일어나지만 참조로 함수 인자를 전달할 시 메모리 소모가 없고 값 복사 또한 발생하지 않는다.
로 정리할 수 있을 것 같습니다.
그래서 질문에 대한 답변을 드리자면,
포인터로 인한 값을 변화하였을 때 함수 내부적으로 값이 복사되는 과정이 있었냐 없었냐로
참조로 swap과 포인터 변수의 swap의 차이점을 말씀드릴 수 있을 것 같습니다.
(따라서 참조 변수를 가장 많이 사용하는 순간도 함수에 매개변수로 값을 넘겨줄 때 입니다!)
2