while (1): study();
[C++] call-by-address와 call-by-reference 본문
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의 메모리 주소를 공유하여, 함수 내부에서 값을 변경할 경우 실제 외부의 변수 값을 변경할 수 있게 된다.
'학습 > 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 |