|
개인적으로 call by reference는 가급적이면 사용하지 않으려고 하고 있습니다.
call by reference를 사용하면 이놈이 파라미터로 넘어 갈때
value로 넘어 가느냐 아니면 reference로 넘어 가느냐
일일이 확인을 해야 하는 불편함이 존재할 수도 있기 때문입니다.
C언어에 익숙한 개발자라면 아마 이런 생각들을 가질 것입니다.
하지만 call by refence가 굉장한 효력을 발생시키는 경우가 있고
그러한 경우에는 call by refence를 사용하는 것이 효과적입니다.
가장 대표적인 예가 바로 operator overloading 부분인데
operator overloadin의 인자를 call by value로 한다고
pointer를 인자로 주게 되면
의미론적으로 오히려 더 복잡해 지는 경우를 발생시킬 수 있습니다.
call by reference는 이것 말고도
constructor의 인자에 class type이 존재할 때
call by value만을 사용하다 보면
쓸데 없는 메모리 카피만 양상되어야 하는 경우가 있습니다.
이를 위해서도 call by refenece를 사용하는 것이
효과적일 수 있습니다.
아무튼 개인적인 의견으로는
가급적이면 call by value를 사용하고
프로그램 짜다가
"아, 이 부분은 call by refence로 하는 것이 더 깔끔하겠구나"하는 생각이 들면
그때 가서 call by reference를 사용하시기를 권장합니다. ^^
이경문 님이 쓰신 글 :
: C언어에서는 call by value만 사용할 수 있고
: C++언어에서는 call by value뿐 아니라 call by reference까지 사용할 수 있습니다.
: C++언어에서 call by reference를 사용할 때 & 라는 연산자가 사용됩니다.
: 내부적으로는 pointer 방식이 적용된다고 보시면 됩니다.
:
: Mins 님이 쓰신 글 :
: : BC++을 처음 해보는 아이입니다~
: : 역시나 C++은 좀 어렵네요^^;;;
: : 예제 소스를 쳐서 하던중에 좀 이해가 가지 않는 부분이 있어서 적습니다~
: :
: : TListBox& operator << (TListBox& lbox, AnsiString str)
: : {
: : lbox.Items->Add(str);
: : return lbox;
: : }
: :
: : void __fastcall TForm1::Button4Click(TObject *Sender)
: : {
: : *ListBox1 << Edit1->Text;
: : }
: :
: : 이런 소스가 있어서 한참을 봤습니다. 잘 이해가 가질 않았습니다.
: : 그래서 포인터 변수를 배운 기억이 나서 아래와 같이 수정해 봤습니다.
: :
: : TListBox* operator << (TListBox* lbox, AnsiString str)
: : {
: : lbox->Items->Add(str);
: : return lbox;
: : }
: :
: : void __fastcall TForm1::Button4Click(TObject *Sender)
: : {
: : ListBox1 << Edit1->Text;
: : }
: :
: : 이렇게 수정해서 실행해 봤는데 둘다 같은결과가 나왔습니다.
: : 무슨 차이점이 있는지 궁금합니다.
|