rueki

Call by Value, Call by Reference 본문

C,C++ 기초 및 자료구조

Call by Value, Call by Reference

륵기 2020. 7. 12. 14:14
728x90
반응형

따배 C++ 강의 노트

 

 

이번 강의는 Call by Value와 Call by Reference에 대한 내용이다.

그에 앞서 먼저 함수의 매개변수 전달에 대해 간단히 알아보자.

int foo(int x, int y) 
{
	return x + y;
}

int main()
{
	int x = 1, y = 2;
	foo(6, 7); // 6과 7을 직접 매개변수로 넣음
	foo(x, y + 1); // 인수 할당받아서 넣는 방법

	return 0;

}

foo라는 함수에 두 개의 매개변수를 받아서 return 값으로 두 변수의 덧셈 결과를 반환받는다.

즉, x와 y는 foo 함수의 파라메러토써, x와 y에 따라 결과는 달라지게 되며, 이 변수들은 함수 내에서만 선언됨에따라,

함수가 끝나면 메모리가 반횐된다는 것을 기억하자.

 

이제 main 부분을 보면 각기 다른 방식으로 foo함수를 불러온 것을 볼 수가 있는데, 차이점이 있다.

첫번째의 foo함수에는 인자로 6과 7을 전달했고, 두 번째에는 변수를 선언해서 넣는 방법이다.

첫 번째 방법은 뒤에서 나올 Call by value에 대한 예시이다.

 

 

  • Call by Value
//값에 의한 전달 (call by value)

#include <iostream>
using namespace std;

//Y값에 대한 주소 출력하기
// 매개변수 y가 다른데에 영향을 주지는 않는다.
void doSomething(int y)
{
	cout << "In func" << y << " " << " " << &y << endl;
}

int main()
{
	doSomething(5); // 5라는 값이 함수의 y에 전달됨

	//변수 사용 경우
	int x = 6;
	cout << "In main" << x << " " << &x << endl;

	doSomething(x); // x라는 변수가 전달되는 것이 아니라 값 6이 전달된다.
	doSomething(x + 1); //변수 자체 전달하는 것이 아니라 값을 전달함
	return  0;


}

예시 함수로 doSomething이라는 함수를 만들었으며, 기능으로는 파라메터로 받은 변수와 그에대한 주소를 출력한다.

main 부분을 살펴보자.

먼저 5라는 값을 넣었고, 그 다음에는 변수를 사용해서 함수에 넣어보았다. 

이에 대한 결과는 아래와 같다.

여기서 알아낼 수 있는 것은 doSomething에 대한 주소 출력된 값이 모두 같다는 것이다.

doSomething(5)와 doSomething(x)에 대한 이해는 아마 쉬울 것이다.

두 함수 모두 값을 전달 했으며, x도 x에 선언한 6을 넣었기때문에 6이 전달되게 된다.

요약하자면, 말 그대로 값 그자체를 함수에 넣어서 결과를 받는 것을 Call by Value라고 할 수가 있다.

  • Call by reference

Call by Value와는 다르게 변수 자체가 전달하게 된다.

위에서의 예제를 통해서 보면, Call by Value는 함수내의 변수는 함수 내에서만 적용된다.

그러나 Call by reference는 주소에 의한 참조라고 생각하면 쉬울 것 같다.

함수 내에서는 y라는 임의 변수를 사용했으나, 어찌됬든간에 그 안에 넣는 변수에 대한 주소를 참조한다 라고 생각하자.

//referenece를 통한 전달
void addOne(int &y)
{
	y = y + 1;
}

int main()
{
	int x = 5;
	cout << x << " " << &x << endl;

	// 값이 전달 되는 것이 아니라 변수 자체가 전달되게 된다.
	// 값에 의한 전달은 함수내에서 변수가 새로 정의된다.
	addOne(x);
	cout << x<< " " << &x << endl;
 
	return 0;
}

 

//reference 통해 값 여러개 전달
// reference만 존재할 경우 출력값이라고 예상할 수 있음

void getSinCos(const double degrees, double& sin_out, double& cos_out)
{	
	//const를 통해서 값 변화 막음
	//degrees는 함수 내에서만 영향
	// 재사용을 위한 정의
	static const double pi = 3.141592 / 180.0;
	const double radians = degrees * pi;

	// 값이 들어와서 변하게된다.
	sin_out = std::sin(radians);
	cos_out = std::cos(radians);
}

위와 같은 함수가 있다고 하자. C나 C++에서는 함수 값으로 하나만 반환받게 되는데, 여러개를 전달하고자 할 때,

reference를 통해서 전달하면 된다고 한다.

 

Call by value와 Call by reference를 요약해보자.

Call by value의 특징은 원본 값에 영향을 미치지 않고,  그 값 자체를 전달한다. 즉, 함수에서 값을 복사해서

전달하는 방식이다.

Call by reference는 호출 시 인자로 전달되는 변수의 referenece를 전달한다. 즉 주소 값을 전달하고 생각하자.

728x90
반응형
Comments