반응형
Modern C++ 공부 Day 4입니다.
오늘 공부할 내용은 함수 인자 전달 방식 중 하나인 Pass by Reference입니다.
이전 포스트를 읽고 오시면 본 포스트를 공부하는 데 더 도움이 됩니다.
2023.06.15 - [Programming/C++] - [Modern C++ 공부 - Day3] 주소에 의한 전달 Pass by Address
Pass by Reference
Pass by Reference는 변수를 함수에 전달할 때 해당 변수의 참조(reference)를 전달하는 방식을 말합니다. Pass by Address는 변수의 주소를 함수 내에서 포인터 변수로 수신하지만, Pass by Reference는 함수의 매개변수로 원본 변수의 참조가 전달된다는 점에서 차이가 있습니다. 아래의 코드를 통해서 직관적으로 이해해봅시다.
void test(int& y) { // y는 호출자의 변수 x에 대한 참조가 될 것입니다.
y = 7;
}
int x = 5;
test(x); // x는 이제 값 7을 가지게 된다.
- 변수 y는 변수 x에 대한 참조다. y는 결국 변수의 x의 또다른 이름이라고 볼 수 있다.
- y의 주소는 x의 주소와 같고, 즉, x와 y는 같은 변수다.
- y의 값을 7로 바꾸면, 변수 x의 값도 7로 바뀐다. x와 y는 같은 변수이기 때문이다.
이번에도 변수의 주소값과 데이터 값을 출력해서 더 명확하게 이해해 보도록 하겠습니다.
#include <iostream>
using namespace std;
int test(int &y) {
cout << "변수 y의 주소는: " << &y << endl;
cout << "변수 y의 값은: " << y << endl;
y = 20;
return y;
}
int main() {
int x = 10;
cout << "변수 x의 주소는: " << &x << endl;
int z = test(x);
cout << "변수 z의 주소는: " << &z << endl;
cout << "함수 test 호출 후 변수 x값은: " << x << endl;
cout << "함수 test 호출 후 변수 z값은: " << z << endl;
return 0;
}
위의 코드를 컴파일하면 아래와 같은 출력값을 얻을 수 있습니다.
변수 x의 주소는: 0x61ff0c
변수 y의 주소는: 0x61ff0c
변수 y의 값은: 10
변수 z의 주소는: 0x61ff08
함수 test 호출 후 변수 x값은: 20
함수 test 호출 후 변수 z값은: 20
출력값을 보면, 명확히 다음의 사실을 알 수 있습니다.
- 변수 x와 y는 같은 변수다.
- 함수 test에서 y를 통해 변수 x의 값을 직접적으로 바꿨다.
- 함수 test가 Pass by Reference를 통해 인자를 받기 때문에 변수 x의 값이 함수 test 호출 후 변화된다.
요약
- Pass by Reference는 함수 인자로 전달된 변수의 복사본을 만들지 않습니다. 대신에 함수는 원본 변수의 참조를 받습니다. 이 참조는 원본 변수를 가리키는 역할을 한다.
- 함수 내부에서 이 참조를 사용해 원본 변수의 값을 읽거나 변경할 수 있습니다. 참조를 통해 원본 변수에 접근하기 때문에, 원본 변수의 값이 함수 내부에서 변경될 경우 이 변경이 원본 변수에 반영된다.
- 큰 데이터 구조를 복사하는 것이 비효율적이거나, 원본 변수를 변경해야 할 때 pass by reference 방식이 유용하다.
- Pass by Address와 Pass by Reference 두 방식은 모두 함수 내에서 원본 변수를 변경하는 데 사용되지만, 포인터를 사용하는지 아니면 참조를 사용하는지에 따라 사용법과 특성이 달라진다.
지금까지 Pass by Reference에 대해서 알아봤습니다.
다음 포스트에서는 Pass by const Reference 상수 참조에 인한 전달에 대해 알아보겠습니다.
2023.06.15 - [분류 전체보기] - [Modern C++ 공부 - Day5] 참조에 의한 전달 Pass by const Reference
728x90
반응형
'Programming > C++' 카테고리의 다른 글
[Modern C++ 공부 - Day6] C++ Semantics 시맨틱스 (0) | 2023.06.15 |
---|---|
[Modern C++ 공부 - Day5] 상수 참조에 의한 전달 Pass by const Reference (0) | 2023.06.15 |
[Modern C++ 공부 - Day3] 주소에 의한 전달 Pass by Address (0) | 2023.06.15 |
[Modern C++ 공부 - Day2] 값에 의한 전달 Pass by value (0) | 2023.06.15 |
[Modern C++ 공부 - Day1] 지역 변수 local variable (0) | 2023.06.15 |