소년코딩

값으로 전달 (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가 만들어지고 값 5y로 복사된다. 변수 yfoo() 함수가 종료되면 소멸한다.

두 번째 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)를 전달할 때

값에 의한 전달은 함수가 인수를 변경할 필요가 없을 때 기본 자료형 변수를 전달하는 가장 좋은 방법이다.


cpp 번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/72-passing-arguments-by-value/ 입니다.

댓글 로드 중…

블로그 정보

소년코딩 - 소년코딩

소년코딩, 자바스크립트, C++, 물리, 게임 코딩 이야기

최근에 게시된 이야기