while (1): study();

[C++] call-by-address와 call-by-reference 본문

학습/C, C++

[C++] call-by-address와 call-by-reference

전국민실업화 2021. 12. 18. 23:31
728x90

C++에서 구현하는 함수의 매개변수는 이용되는 형태에 따라 다양하게 불리운다. 

가장 기본적인 경우는 call-by-value로, 전달받은 인수의 값을 복사하여 함수 내부의 지역변수로만 사용하고, 함수 외부에는 전혀 영향을 미치지 않는다.

#include <iostream>

int MyAdd(int, int);

int main(void)
{
    int a = 3;
    int b = 5;
    
    std::cout << MyAdd(a, b) << std::endl;

    return 0;
}

int MyAdd(int a, int b)
{
    a += 1;
    b += 2;
    return a + b;
}

위의 경우 함수 내부에서 각 인수에 1, 2를 더해준 것은 호출자인 main 함수 내의 변수에 전혀 영향을 주지 않는다. 

 

반면, 함수 외부의 변수를 제어할 필요가 있는 경우 C++에서는 두 가지 선택지를 제공한다. 첫 번째는 C에서부터 제공하는 포인터를 이용한 call-by-address이다. 포인터는 메모리의 주소 모드 중 간접주소지정을 추상화한다.

#include <iostream>

void MyFunc(int*, int*);

void main(void)
{
    int a = 3, b = 5;
    int* pa = &a, *pb = &b;
    
    MyFunc(pa, pb);

    return 0;
}

void MyFunc(int* pa, int* pb)
{
    *pa += 1;
    *pb += 2;
    std::cout << *pa << *pb << std::endl; 
}

위의 예시에서는 인수로 포인터로 넘겨주었기 때문에 main 함수 내에 선언된 a, b의 메모리 주소에 접근하여 실제로 값을 변경할 수 있다. 혹은 주소 연산자 &를 이용하여도 같은 결과를 얻을 수 있다.

 

C++에서는 새로운 방법을 제공하는데 이는 call-by-reference라고 한다. 프로그래밍 언어의 함수 호출 방식을 일반적으로 call-by-value와 call-by-reference로 구분하기 때문에 call-by-address라는 명칭은 사실 참조자를 이용한 해당 방식과 비교하기 위한 목적성이 강하다.

#include <iostream>

void MyFunc(int&, int&);

void main(void)
{
    int a = 3, b = 5;
    
    MyFunc(a, b);

    return 0;
}

void MyFunc(int& a, int& b)
{
    a += 1;
    b += 2;
    std::cout << a << b << std::endl; 
}

두 번째 예시에서 약간만 수정한 코드이다. 참조자를 이용하면 변수의 메모리 주소를 공유할 수 있다. 즉, 함수의 지역변수로 정의된 매개변수들이 인수로 주어진 a, b의 메모리 주소를 공유하여, 함수 내부에서 값을 변경할 경우 실제 외부의 변수 값을 변경할 수 있게 된다.

728x90

'학습 > C, C++' 카테고리의 다른 글

[C++] 정보은닉과 캡슐화  (0) 2021.12.19
구조체에 대한 new & delete 연산  (0) 2021.12.19
[C++]함수 오버로딩  (0) 2021.12.17
사칙연산 계산기  (0) 2021.12.16
[C언어] 전처리 지시자  (0) 2021.12.16
Comments