값으로 전달 (Pass by value)
C++에서 포인터가 아닌 인수는 값으로 전달된다. 인수가 값으로 전달되면 인수의 값은 해당 함수 매개 변수의 값으로 복사된다.
#include <iostream>
void foo(int y)
{
std::cout << "y = " << y << '\n';
}
int main()
{
foo(5); // first call
int x = 6;
foo(x); // second call
foo(x+1); // third call
return 0;
}
첫 번째 foo(5) 호출에서 인수는 리터럴 5다. foo(5)가 호출되면 변수 y가 만들어지고 값 5가 y로 복사된다. 변수 y는 foo() 함수가 종료되면 소멸한다.
두 번째 foo(x) 호출에서 인수는 변수 x다. x는 값 6으로 평가된다. 두 번째 호출에서 변수 y가 다시 만들어지고 값 6이 복사된다. 마찬가지로 foo() 함수가 종료되면 소멸한다.
세 번째 foo(x +1) 호출에서 인수는 값 7로 평가되며, 변수 y로 복사되고 foo() 함수가 끝나면 소멸한다.
// 따라서 위 프로그램은 다음과 같이 출력한다.
y = 5
y = 6
y = 7
인수의 복사본이 함수로 전달되므로 원래 인수는 함수 안에서 수정할 수 없다.
#include <iostream>
void foo(int y)
{
std::cout << "y = " << y << '\n';
y = 6;
std::cout << "y = " << y << '\n';
} // y is destroyed here
int main()
{
int x = 5;
std::cout << "x = " << x << '\n';
foo(x);
std::cout << "x = " << x << '\n';
return 0;
}
/*
x = 5
y = 5
y = 6
x = 5
*/
main 함수의 시작 부분에서 변수 x의 값은 5다. foo(x)가 호출되면 foo의 매개 변수 y에 값 5가 복사되어 전달된다. foo() 함수 내부에서 y의 값은 6으로 변경되고 소멸하지만, y가 변경되더라도 변수 x의 값은 아무런 영향을 받지 않는다. (변경되지 않는다)
값으로 전달된 함수 매개 변수도 const
로 만들 수 있다. 함수가 매개 변수의 값을 변경하지 못하게 할 때 유용하다.
값으로 전달의 장단점 (Pros and cons of pass by value)
값으로 전달의 장점:
- 호출되는 함수에 의해 인수가 변경되지 않으므로 예기치 못한 부작용이 발생하지 않는다.
값으로 전달의 단점:
- 함수를 여러 번 호출하는 경우 구조체(struct) 및 클래스(class)를 복사하는데 큰 비용이 들어 성능이 저하될 수 있다.
값으로 전달을 사용해야 하는 경우:
- 기본 자료형과 열거자를 전달할 때(함수가 인수를 변경할 필요가 없을 때)
값으로 전달을 사용하지 않아야 하는 경우:
- 배열(array), 구조체(struct) 및 클래스(class)를 전달할 때
값에 의한 전달은 함수가 인수를 변경할 필요가 없을 때 기본 자료형 변수를 전달하는 가장 좋은 방법이다.
번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/72-passing-arguments-by-value/ 입니다.