티스토리 뷰

목차

    반응형

    [074] Call by Reference, Vale, Address 차이점, 참조 방식 차이


    초보자를 위한 C++ 200제 독자 포스트에 올라온 이준우님 질문의 답글입니다.


    질문 글


    Call by Reference와 Call by Address를 공부하는 중 질문이 생겼습니다.

    둘의 공통점은 Call by Value와 달리 주소의 값을 직접 바꾸는 것이고, 차이점은 *를 인자로 주면 4바이트 크기이고 &를 인자로 주면 자료형의 크기를 넘긴다는 것 같은데, 어떤 때 *를 넘기고 어떤 때 &를 넘기나요??


    우선 Call by Address는 Call by Value와 유사하지만 "Value"가 주소입니다. Call by Value 형태지만 Value가 주소이므로 Call by Address라 따로 지칭합니다. 그래서 큰 맥락으론 Call by Reference와 Call by Value로 구분합니다.


    callbyvalue-callbyreference-in-c[C++ 함수 인자 전달 방식]


    Call by Reference vs Call by Value


    결론부터 말씀드리자면, 상황에 맞춰 적절히 사용하면 됩니다.


    Call by Reference로 전달된 인자는 함수 내부에서 변경할 수 있습니다. 주소를 참조하기에 인자를 직접 수정할 수 있습니다. 장점은 주소를 전달하므로 100바이트 튜플을 100개 담는 벡터를 전달해도 인자 크기는 4바이트 포인트 변수에 불과하다는 점입니다.


    Call by Value로 전달된 인자는 함수 내부에서 사용할 수 있도록 별도의 메모리 공간에 복사됩니다. 값이 복사되어 전달되므로 원본 데이터를 직접 수정할 순 없습니다. 장점은 원본에 영향을 주지 않으면서 같은 데이터를 이용할 수 있다는 점입니다. 다른 메모리 영역에 관여할 여지도 없으므로 상대적으로 안전합니다.


    반면, 복사 과정에서 데이터 손실이 발생해 예상치 못한 오류가 발생할 여지가 있습니다. 또한, 100바이트 튜플을 100개 담는 벡터를 전달한다면 10,000바이트를 복사할 새로운 메모리 영역이 필요해 프로그램 성능이 저하될 수 있습니다. 이것을 주로 "비용이 많이 든다"라고 표현합니다.


    그래서 간략하게 차이점 3가지를 정리하면 아래와 같습니다.


    [74] Call by Reference, Vale, Address 차이점, 참조 방식 차이[C++ 함수 인자 전달 방식]


     

    Call by Value

    Call by Reference

    1

     복사한 값을 전달

     원본 주소를 전달

    2

     함수에서 변경한 내용이 다른 함수에 적용되지 않음

     함수에서 변경한 내용이 다른 함수에도 적용됨

    3

     인자를 다루는 메모리 위치가 다름

     인자를 다루는 메모리 위치가 같음


    결론적으로 위와 같은 차이점을 숙지하고 상황에 맞춰 적절히 사용하는 것이 좋습니다. Call by Value, Call by Reference 중 무엇이 좋은지, 아니면 인자를 *로 받는 게 &로 받는 것보다 좋은지 등은 상황에 따라 다릅니다.


    예를 들어, 컨테이너(vector, list 등)를 다룰 때 내부 데이터 가공이 필요하면 주소 참조를 하는 것이 좋고, 내부 데이터 중 일부를 검증할 땐 복사 참조가 좋을 수 있습니다. 물론 이것도 상황에 따라 다릅니다.


    [074] Call by Reference, Vale, Address 차이점, 참조 방식 차이

    반응형