반응형
Modern C++ 공부 Day 5입니다.
오늘 공부할 내용은 함수 인자 전달 방식 중 하나인 Pass by const Reference입니다.
이전 포스트를 읽고 오시면 본 포스트를 공부하는 데 도움이 됩니다.
2023.06.15 - [Programming/C++] - [Modern C++ 공부 - Day4] 참조에 의한 전달 Pass by Reference
Pass by const Reference
Pass by const Reference는 이전 포스트에서 살펴봤던 Pass by Reference와 같이 함수 인자를 참조로 전달하지만, 해당 인자를 변경할 수 없다는 점에서 다릅니다. 이는 특히 대규모 구조체나 클래스 객체와 같이 복사 비용이 높은 경우에 유용하며, 객체의 내용을 변경하지 않는 함수에서 주로 사용됩니다.
이 방식을 사용하면, 복사 비용을 절약하면서도 함수가 실수로 객체를 변경하는 것을 방지할 수 있습니다. 아래의 코드를 통해서 직관적으로 이해해봅시다.
void test(const int& y) {
// y = 7; // 이런 코드는 에러를 발생시킨다. y는 const이므로 변경할 수 없다.
std::cout << y; // 이런 코드는 허용된다. y를 읽는 것은 가능합니다.
}
int x = 5;
test(x);
- 변수 y는 변수 x에 대한 참조다. y는 변수의 x의 또다른 이름이라고 볼 수 있다.
- 함수 test 내에서 y의 값을 7로 바꿀 수 없다. 변수 x의 값도 바뀌지 않고 그대로 5다.
이번에는 실질적으로 Pass by const Reference를 객체에 사용하는 예제를 살펴봅시다.
class TestClass {...};
void test(const TestClass& tc) { // tc는 호출자의 객체에 대한 참조
... // tc의 const public 멤버 함수를 호출할 수 있다.
}
TestClass test_class;
test(test_class); // 객체를 함수 test에 전달
- 함수 test는 TestClass의 객체 tc에 대한 const 참조를 인자로 받는다. 여기서 const 키워드는 tc가 가리키는 객체를 함수 내에서 변경할 수 없도록 만든다.
- 함수 내에서 tc를 이용해 TestClass의 const 멤버 함수를 호출할 수 있지만, 객체의 상태를 변경하는 비-const 멤버 함수는 호출할 수 없다.
- const 참조를 이용하면 객체를 복사하지 않고 안전하게 사용할 수 있어서 큰 객체를 전달할 때 유용하다.
- 마지막 줄에서 함수 test를 호출할 때, TestClass의 객체 test_class를 전달한다. 이 경우, test_class 객체는 test 함수에서 변경되지 않음이 보장된다.
이번에도 변수의 주소값과 데이터 값을 출력해서 더 명확하게 이해해 보도록 하겠습니다.
#include <iostream>
using namespace std;
int test(const 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;
}
위의 코드를 컴파일하면 에러가 발생합니다.
'y': you cannot assign to a variable that is const
에러를 없애기 위해서는 아래 코드를 지워야 합니다.
y = 20;
위의 코드를 지우고 컴파일하면 성공적으로 컴파일되고 다음과 같이 출력됩니다.
변수 x의 주소는: 0x61ff0c
변수 y의 주소는: 0x61ff0c
변수 y의 값은: 10
변수 z의 주소는: 0x61ff08
함수 test 호출 후 변수 x값은: 10
함수 test 호출 후 변수 z값은: 10
요약
- Pass by const Reference는 원래 데이터를 복사하지 않고, 원본 데이터에 대한 참조를 만들어 함수로 객체를 효율적으로 전달하는 방식이다.
- 이 참조는 함수 내부에서 해당 객체를 읽기 전용으로 다룰 수 있게 만들어 준다. 즉, "const" 키워드를 통해 해당 함수에서 원본 객체를 수정할 수 없게 된다.
- 이 방법은 큰 객체를 전달할 때 특히 유용하며, 원본 객체의 변경을 방지하려는 경우에 사용된다.
- Pass by Reference와의 차이점은 Pass by const Reference는 원본 데이터를 수정하는 것을 허용하지 않는 반면, Pass by Reference는 그렇게 할 수 있다는 점이다.
지금까지 Pass by const Reference에 대해서 알아봤습니다.
다음 포스트에서는 C++ Semantics에 대해 알아보겠습니다.
728x90
반응형
'Programming > C++' 카테고리의 다른 글
[Modern C++ 공부 - Day7] 선언과 초기화 Declaration & Initialization (0) | 2023.06.16 |
---|---|
[Modern C++ 공부 - Day6] C++ Semantics 시맨틱스 (0) | 2023.06.15 |
[Modern C++ 공부 - Day4] 참조에 의한 전달 Pass by 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 |