Channi Studies

[C++] 참조로 전달하기 (Pass by Reference) 본문

C++/함수 (Function)

[C++] 참조로 전달하기 (Pass by Reference)

Chan Lee 2023. 12. 17. 23:33

C++ 에서 함수에 인자를 전달하면, 전달된 인자 그 자체가 아닌 그 인자의 값이 복사되어 사용됩니다.

즉, 함수 내에서 따로 변수의 값을 변화시키는 행위를 하지 않는 이상 원본 값의 변화는 없습니다.

이를 우리는 'pass by value' 방법으로 부릅니다.

 

Passy by value(값에 의한 전달)은 우리가 기존에 사용하던 모든 함수들이 하고 있습니다.

C++ 함수의 기본 작동 방법입니다.

 

하지만, 우리는 함수를 통해 원본 값에 변화를 주고 싶을 때가 있습니다.

또는 매우 크기가 큰 벡터와 같은 자료에 대해서 데이터의 낭비를 방지하고자 하고 싶을 수도 있습니다.

크기가 엄청 큰 벡터를 다루는데 굳이 동일한 벡터를 복사해서 저장할 필요는 없을 때도 있을 테니까요.

 

그렇게 하기 위해서는, 우리는 함수에 인자로써 활용될 매개변수의 위치(주소)값을 전달해야 합니다.

이는 reference parameters를 활용하여 할 수 있습니다.

C++에서 reference parameters를 사용하는 방법은 매우 쉽습니다.

바로 ampersand symbol(&)를 사용하는 겁니다.

이 방법을 우리는 'pass by reference' 라고 부릅니다.

 

다음 코드에서 쉽게 알아보겠습니다.

void scale_number(int &num);

int main() {
    int number {1000};
    cout << number << endl;
    scale_number(number);
    cout << number << endl;
    return 0;
}

void scale_number(int &num){
    if (num > 100)
        num = 100;
}

실행 결과 1

기존의 함수에서 매개변수에 대한 값 변화는 원본 인자 값의 변화로 이어지지 않았습니다.

하지만 우리가 & 기호를 활용한 pass by reference 방법으로,

매개 변수로 사용된 원본 변수인 정수 number가 1000에서 100으로 변화했음을 확인할 수 있습니다.

 

 

이러한 '참조로 전달하기' 방법은 한가지 매개 변수만 사용할 수 있는 것은 아닙니다.

두개 이상의 매개 변수에 대해서도 활용할 수 있습니다.

 

 

만약 데이터 관리를 위해 이 방법을 활용하고 있지만 데이터 값의 변형을 원하지 않는다면 어떻게 할까요?

답은 간단합니다. const 키워드를 포함시키면 됩니다.

void print (const std::vector<int> &v);

프로토타입과 함수의 선언 때 이런 식으로 하면 실수로 값이 변경되는 일을 방지할 수 있습니다.