[0]

c++에 익숙하지 않은 c 개발자라면 c++의 레퍼런스가 도대체 무슨 쓸모인지 의문이 갈 것이다. 아니 그냥 포인터를 쓰면 될걸 왜 굳이 이런 걸? 이란 생각이 들기 마련이다. 나 또한, c++에 익숙하지 않기 때문에, 아래에서 레퍼런스가 무엇인지, 포인터와는 어떤 차이가 있는지 간단히 정리해 보았다. 

 

기본적으로, c++의 레퍼런스는 상수 포인터이며(상수 값을 가르키는 포인터와는 다르다.), automatic indirection을 지원한다. 즉 *ptr로 역참조 할 필요 없이, ref로 사용하면 된다(ref == *ptr). 

 

[1]

포인터는 가르키는 오브젝트를 변경할 수 있다. 즉 ptr = a에서 ptr = b로 변경이 가능하다. 또한 int * ptr과 같이 초기화하지 않고 선언이 가능하다. 

 

레퍼런스는 이와 반대로, 가르키는 오브젝트를 변경할 수 없다. 이 부분은 contant pointer와 같은 특성이다. 또한 선언 시에 반드시 초기화를 해야 한다.

 

[2]

포인터는 고유한 주소를 갖는다. ptr = a에서 ptr의 주소는 a의 주소와 다르다. *ptr의 값이 a의 주소와 같을 뿐이다. 반면에 레퍼런스는 가리키는 오브젝트와 같은 주소를 갖는다. ret = obj일 때, &ref == &obj이다.

 

[3]

포인터는 이중,삼중 포인터를 만들 수 있고, 역참조 시에도 **ptr, ***ptr 등으로 사용한다. 반면에 레퍼런스는 이중 레퍼런스를 만들 수 없다. [2]를 생각해보면, 이중 레퍼런스를 왜 막았는지는 자명하다.

 

[4]

포인터는 null값을 가질 수 있지만, 레퍼런스는 불가능하다. 단, 컴파일러에 따라서 약간의 트릭으로 null을 갖게 할 수 있다. null포인터의 레퍼런스를 만들면 된다.

 

[5]

포인터는 포인터 연산을 수행할 수 있다. ptr++라던지 ptr+4라던지. 레퍼런스는 불가능하다.

 

[6]

포인터는 배열로 만들 수 있다. int * ptr[3]와 같은 방식으로. 레퍼런스는 불가능하다.

 

[7]

(뇌피셜 문단)

왜 c++에는 포인터가 이미 존재함에도 레퍼런스를 제공할까? 우선 포인터는 c와의 호환성(물론 현재 c는 c++의 subset 아니므로 완전히 호환되지 않는다)을 위해서 반드시 필요하다. 하지만 c++의 철학에 더 맞는 것은 레퍼런스라고 생각할 수 있다. 즉 '반드시 필요한 경우가 아니라면 포인터가 아니라 레퍼런스를 사용한다'. 

 

레퍼런스가 존재함으로써, c++에서는 call-by-reference가 가능해진다. 간혹 c/c++에서 포인터를 매개변수로 전달하는 것을 call-by-reference라고 가르치는 경우가 아닌데, 틀린 설명이다. 포인터를 매개변수로 전달하는 것은, 포인터의 값(즉 가르키는 주소 값)을 call-by-value로 전달함에 지나지 않는다. 자세한 설명은 여기를 참고하자.

 

또한 레퍼런스는 오브젝트의 '또 다른 이름(alternative name)'으로 간주할 수 있다. [1], [4]의 특성이 자연스럽게 여기서 기인한다. 레퍼런스가 처음 선언되었을 때 반드시 오브젝트하나에 bind 되며, 포인터와 다르게 그 오브젝트를 가리키고 있는 것이 아니라 그 오브젝트(referent) 자체이다. 이에 따라서 당연히 다른 오브젝트를 가리키도록 변경할 수 없다.

 

 

 

[참고]

https://stackoverflow.com/questions/57483/what-are-the-differences-between-a-pointer-variable-and-a-reference-variable-in

 

What are the differences between a pointer variable and a reference variable in C++?

I know references are syntactic sugar, so code is easier to read and write. But what are the differences? Summary from answers and links below: A pointer can be re-assigned any number of times w...

stackoverflow.com

https://isocpp.org/wiki/faq/references

 

Standard C++

 

isocpp.org

https://blog.naver.com/han95173/220934411280

 

C언어에 Call by reference는 없다.

위 사진은 위키피디아의 것을 그대로 가져 온 것입니다. 여기서 볼 수 있듯이, C언어는 1972년에 데니스리...

blog.naver.com

 

+ Recent posts