먼저 소스를 간단히 만들어 봅시다.
//---------------------------------------------------------------------------
void add(int &a, int &b)
{
a = a + b;
}
void add2(int *a, int *b)
{
*a = *a + *b;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int a = 1;
int b = 2;
add(a,b);
add2(&a, &b);
Caption = a;
}
//---------------------------------------------------------------------------
결과 값은 5가 찍힙니다.
add 는 참조자(레퍼런스 reference)를 통한 인자의 전달이고
add2는 포인트를 통한 인자의 전달입니다.
이 둘의 코드는 어떻게 틀릴까요?
이 코드를 컴파일하고 적당한 곳에 브레이크 포인트를 걸어 CPU 화면을 봅시다.
add 함수와 add2 함수의 어셈블리 코드가 완벽하게 일치함을 알수 있습니다.
또한 add(a,b); add2(&a, &b); 로 호출하는 부분의 어셈블리 코드도 완벽하게 일치함을 알수 있습니다.
그런데 참조자를 쓰면 코딩이 좀 더 편하고 알아보기도 쉽죠.
이것이 참조자를 쓰는 주된 이유입니다.
C++의 문법적인 문제로 참조자를 쓰지 않을 수 없는 경우도 있습니다.
연산자 오버로딩 같은 경우 등인데 이는 좀 세부적인 이해가 필요합니다.
그런 경우가 있다는 것을 기억하시고 궁금하신 분은 따로 공부해 보세요.
위처럼 참조자와 포인트를 통한 변수의 전달은 같은 것에 대한 다른 표현에 불과하므로
컴파일러는 참조자를 포인트로 인식해서 컴파일하게 됩니다.
어느 것을 쓸 것인지는 스스로 적정하게 판단해서 사용하시기를...
|