Call by Value / Call by Reference

LeeJE20·2021년 1월 23일
0

C++ 공부

목록 보기
1/2

개념

call by value

  • 파라미터 자체를 넘기는 것이 아니라 함수 내부에서 똑같아 보이는 애를 찍어낸다.
    • 새로 메모리 공간을 할당하고 파라미터 값을 복사하는 과정이 있다.
  • 찍어낸 애는 로컬 변수가 되어, 함수 내부에서만 쓰일 수 있다.
  • 함수 외부의 변수 값을 함부로 변경할 수 없어 안정성은 높지만, 메모리를 할당하고 값을 복사하는 작업을 해야하므로 느리다.

call by reference

  • 주소를 넘겨준다.

    • 따라서 함수 내부에서 값을 변경해도 함수 바깥에 영향을 줄 수 있다.
  • 안정성은 낮지만 빠르다.

    • 안정성을 높이고자 한다면 const int& parameter의 형식을 사용하자.
      • 상수 값을 넘겨 값을 변경할 수는 없게 해 안정성을 높인다.
      • 또한 주소를 넘겨주므로 메모리 할당하고 값을 복사하는 과정을 생략할 수 있어 call by value보다 빨라진다.

코드

  • 실수: call by reference로 해야하는데 call by value로 했다. 앞으로 이런 일이 없도록 유념하자.

  • call by reference는 &를 써야 한다.

#include<iostream>
using namespace std;

int a = 0;

// call by reference는 &를 써야 하는 것에 유의하자.
int callByReference(int &parameter)
{
	parameter= 2;
	return parameter;
}

int callByValue(int parameter)
{
	parameter= 1;
	return parameter;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	
	cout<< a << endl; // 0이 출력된다.
	cout<< callByValue(a) << endl; // 1이 출력된다.
	cout<< a << endl; // 0이 출력됨: callByValue라서 전역변수 값이 안 바뀜

	cout<< callByReference(a) << endl; // 2가 출력된다.
	cout<< a << endl; // 2가 출력됨: callByReference라서 전역변수 값이 바뀌었다!

}

출력 결과

0개의 댓글