반응형

Intro


안녕하세요. 이번 시간에는 C++에서 함수를 호출 방법에 대해 알아보도록 하겠습니다. 지난 시간에 STL 람다에 대해 스터디를 할 때 캡처에서 Call by value(값에 의한 호출)와 Call by reference(참조에 의한 호출)의 개념이 나와서 정리해보는 시간에 대해 갖겠습니다.

Call by value(값에 의한 호출) vs Call by reference(참조에 의한 호출)


함소를 호출하는 방법에는 2가지 방법이 있습니다. Call by value(값에 의한 호출)과 Call by reference(참주에 의한 호출)입니다.

Call by value(값에 의한 호출) : Call by value는 함수에 원본 값을 그대로 전달하여 복사해서 사용하는 방식입니다. 원본을 그대로 복사하여 사용하기 때문에 원본에 영향을 미치지가 않습니다. 함수에서 원본에 대해 아무리 무언가를 바꿔도 그 함수 내에서만 영향을 끼치고, 함수 밖에서는 전혀 영향을 끼치지 못합니다.

간단한 example 코드에서 확인해 보겠습니다.

#include <iostream>  
void func(int n)  
{  
    n = 20;  
    std::cout << "함수에서 호출" << n << std::endl;  
}  

int main(void)  
{  
    int nNum = 0;  
    func(nNum);  
    std::cout <<"Main함수 호출"<< nNum << std::endl;  
    return 0;  
}  

결과

결과를 보면 func함수의 매개 변수로 원본값인 nNum을 전달하여 nNum에 숫자를 대입했습니다. 대입 후 결과를 봤을 때 nNum의 값은 func함수에서만 변화하였고, Main함수에서는 초기 초기화한 그대로 0이 출력이 됩니다. 함수 안에 n = 20; 은 함수가 종료되며 자동으로 소멸되기 때문입니다. 그래서 실제 함수에서 변경되는 값을 받고 싶으면 함수에 return값을 주거나 Call by reference를 통해 주소를 참조하면 됩니다.

return 타입을 통해 값 변경

#include <iostream>
int func()
{
    int n = 20;
    std::cout << "func함수 호출" << n << std::endl;
    return n;
}

int main(void)
{
    int nNum = 0;
    nNum = func();
    std::cout <<"Main함수 호출"<< nNum << std::endl;
    return 0;
}

결과

Call by reference(참조에 의한 호출) : Call by reference는 주소에 의한 호출로 주소를 참조하여 호출하는 방식입니다. 원본의 주소값을 전달하기 때문에 원본을 변경할 수 있습니다.

간단한 example 코드에서 확인해 보겠습니다.

#include <iostream>
void func(int *n)
{
    *n = 20;
    std::cout << "func함수 호출" << *n << std::endl;
    std::cout << "func함수 호출" << n << std::endl;
}

int main(void)
{
    int nNum = 0;
    func(&nNum);
    std::cout <<"Main함수 호출"<< nNum << std::endl;
    return 0;
}

결과

함수에 주소를 전달하여 값을 변경했기 때문에 nNum의 값은 함수가 종료가 되어도 메모리 상에 있는 20이라는 값을 유지 합니다. 이유는 원본(nNum)에 주소 값을 통해 접근했기 때문입니다. 위의 결과에 0000009C08FCF710이 원본이 가지고 있는 주소 있니다. 저 주소는 프로그램이 끝날 때까지 가지고 있는 주소입니다.

마무리


오늘은 Call by value vs Call by reference에 대한 포스팅을 해 봤습니다. Call by value vs Call by reference는 C++에서 가장 기본이 되는 개념중 하나입니다. 함수를 호출할 때 매개변수로 전달받은 값이 원본에 영향을 끼치는지 주의 깊게 살펴봐야 합니다.

이상으로 포스팅을 마치겠습니다. 감사합니다.

반응형

+ Recent posts