6-3-라.C++의 참조호출

C언어는 포인터를 사용하여 참조 호출 흉내를 낸다. C++은 포인터를 이용하는 방법외에 레퍼런스라는 개념으로 참조 호출을 추가로 지원한다. 다음 예제의 plusref2함수가 C++의 레퍼런스를 사용하여 참조 호출을 하는 예이다.

 

: CallRef2

#include <Turboc.h>

 

void plusref2(int &a);

 

void main()

{

     int i;

 

     i=5;

     plusref2(i);

     printf("결과=%d\n",i);

}

 

void plusref2(int &a)

{

     a=a+1;

}

 

int &a라는 좀 이상한 타입을 사용하는데 이것이 레퍼런스이다. 호출부에서는 &i가 아닌 i를 전달하며 함수의 본체에서는 *a를 쓰지 않고 a를 바로 쓴다. C++의 레퍼런스에 대해서는 15장에서 상세하게 다루므로 여기서는 구경만 해 보고 넘어가기로 하자. 지금 단계에서 레퍼런스를 논하는 것은 순서에 맞지 않다. C++이 참조 호출을 위해 레퍼런스라는 새로운 개념을 지원하기는 하지만 C의 포인터를 이용한 참조 호출도 알아 두어야 한다.

C언어의 포인터를 통한 참조 호출은 사실 엄밀한 의미의 참조 호출이라고 볼 수 없다. 왜냐하면 이때도 함수로 전달되는 것은 변수 그 자체가 아니라 변수의 번지값(Address Value)이라는 특수한 값이기 때문이다. C는 언제나 값만 전달한다. 다만 이 번지값으로 실인수를 조작할 수 있도록 흉내만 낼 수 있으며 흉내를 통해 참조 호출 효과가 발생할 뿐이다. 그래서 혹자는 C언어는 참조 호출을 지원하지 않는다고 주장한다. 이는 문법적으로는 사실이지만 실제로는 포인터를 통해 참조 호출과 동일한 효과를 낼 수 있으므로 다소 비약적인 표현이라고 할 수 있다.

C언어의 함수 호출방식은 모두 값 호출 방식이되 편의상 포인터를 통한 호출을 참조 호출이라고 부를 뿐이다. 그렇다면 C++의 경우는 어떠할까? C++의 레퍼런스는 C의 포인터를 사용하는 방법보다는 더 발전된 방법이지만 이것도 엄밀하게 따지면 값 호출이다. 다음에 레퍼런스를 깊게 배워 보면 알겠지만 레퍼런스는 내부적으로 포인터를 흉내낸다. 따라서 레퍼런스를 사용한 참조 호출은 포인터를 흉내내어 참조 호출을 흉내내는 아주 기만적인 참조 호출일 뿐이다.