본문 바로가기
SWE/C++ OOP

call by value, call by reference 비교 / 함수 인자 복사

by S나라라2 2020. 2. 25.
반응형

함수의 매개변수는 두 가지 할당 방법이 존재한다.

하나는 '값에 의한 호출(call by value)', 다른 하나는 '참조에 의한 호출(call by reference)'

하나는 함수 내부에서 값을 변경하여도 해당 변수에 반영이 되지 않고, 하나는 해당 변수의 값이 변한다. 

자세히 살펴보자

 

call by value, call by reference 비교

 

  • call by value(값에 의한 호출) 이란?

 : '변수'가 아닌, 인자의 '값'이 복사되어 전달

 

간단하게, call by value 변수는 실제로 지역변수라고 보면 된다.

함수안에서만 수정이 되고, 수정된 값을 해당 함수 바깥에서 호출해도 변경되지 않은 값이 유지된다.

복사된 값이 전달되었기 때문에, 원본에는 변함이 없는 것이다.

 

- 작성방법 예시) void functionA(int data);

 

 

  • call by reference(참조에 의한 호출) 

 : 변수가 전달. 그러므로 변수의 값이 함수 호출시 변할 수 있다.

 

- 작성방법 예시) void functionA(int& data);  매개변수 형식에 &을 덧붙여서 표시한다.

 

 

간단하게 설명하면 위와 같다.

 

나는 항상 '함수 파라미터로 포인터를 전달할 때와 레퍼런스를 전달할 때와의 차이점은 무엇이지' 하고 헷갈렸다.

왜냐하면 함수 바깥에서 확인했을 때 '값의 변경 유무'에만 초점을 맞췄기 때문에, 둘의 동작은 똑같다.

 

정석대로 이해를 하면 포인터 파라미터와 레퍼런스 파라미터의 차이가 명확하다. 

아래 그 설명을 해보겠다.

 

 

포인터와 레퍼런스의 차이Call by pointer / Call by reference

 

아래 링크에서 진짜X100 잘 설명해놓았다.

결국 핵심은 '포인터는 메모리의 주소값을 가지고 있는 변수'라는 것을 생각했더라면, 쉽게 차이를 이해할 수 있었을 것이다.

 

woo-dev.tistory.com/43

 

[C++] 포인터와 레퍼런스(참조)의 차이를 이해해보자

C++에는 포인터(Pointer)와 레퍼런스(Reference)라는 개념이 있다. 포인터는 C 에도 있었던 개념이며 레퍼런스는 C++ 에서 등장한 개념이다. 언뜻 보면 용도가 비슷한데 정확히 어떤 차이점이 있는지,

woo-dev.tistory.com

 

 

포인터보단 레퍼런스의 사용 추천

void swap(int* x, int* y)

void swap(int& x, int& y)

 

추천 이유 1. 위의 예시에서 int*가 참조하는 대상이 int형 변수인지, int형 배열인지 명확하지 않음.

                 반면에, int& x가 참조하는 대상은 오직 int형 변수뿐이다.

 

추천 이유 2. 레퍼런스는 메모리 소모가 일어나지 않음. 

추천 이유 3. 포인터는 참조하는 대상을 중간에 변경할 수 있어서 코딩하다가 실수할 수 있는데, 레퍼런스는 한번 참조할 대상을 정하면 레퍼런스 변수가 소멸하기 전에 그 대상이 변경되지 않음.

 

 


그리고 레퍼런스는 C에는 없던 개념이라고 한다. C++에서 생긴 개념. 내가 왜 익숙하지 않았는지 알 것 같긴 하다... 

학과에서 너무 C위주로 공부하긴 했었지

 

 

참고로 읽어도 좋은 링크 (포인터와 레퍼런스)

topnanis.tistory.com/172

반응형