본문으로 바로가기

LR Value의 이해 - ① 함수 인자 전달

C++에서 함수에 인자를 넘겨주는 방법에는 3가지 방법이 존재.

  • Pass by Value
  • Pass by Pointer
  • Pass by Reference

Pass by Value

함수 인자로 값을 넘겨주는 방식. 값에 대한 복사가 발생

void foo(int a)
{
    int b = a + 1;
}
int main()
{
    int a = 0;
    foo(a);
    return 0;
}

Pass by Pointer

함수 인자로 주소 값을 넘겨주는 방식. 인자로 넘겨받은 값을 포인터로 가리킬 수 있다.

void foo(int* ap)
{
    int b = *ap + 1;
    *ap = 100; // main 함수의 a에도 접근할 수 있다.
}
int main()
{
    int a = 0;
    foo(&a);
    return 0;
}

Pass by Reference

함수 인자로 참조를 넘겨주는 방식. Pass by Pointer와 동일하게 동작한다.

void foo(int& a)
{
    int b = a + 1;
    a = 100; // main 함수의 a에도 접근 할 수 있다.
}
int main()
{
    int a = 0;
    foo(a);
    return 0;
}

어셈블리 코드로 살펴보면 Pass by Pointer와 Pass by Reference는 완벽하게 동일함을 확인할 수 있다.

Pointer와 Reference 중 가급적 Reference를 사용하는 것이 좋다. Pointer를 그대로 노출시키게 되면 버그를 발생시킬 가능성이 더 높기 때문이다. 그리고 넘겨받은 인자를 수정하지 않을 것이라면 const를 붙여서 더욱 안전하게 코드를 작성할 수 있다.

void foo(const int& a)
{
    int b = a + 1;
}
int main()
{
    int a = 0;
    foo(a);
    return 0;
}

그리고 큰 오브젝트를 함수 인자로 전달할때는 Pass by value를 사용하면 큰 오브젝트에 대한 복사가 일어나면서 시간과 공간의 낭비가 발생한다. 오브젝트의 복사가 필요한 경우가 아니라면 반드시 Pass by Pointer 혹은 Pass by Reference를 사용하자.

 

출처: https://www.youtube.com/channel/UCHcG02L6TSS-StkSbqVy6Fg