본문 바로가기
Programming/C++

[Modern C++ 공부 - Day5] 상수 참조에 의한 전달 Pass by const Reference

by 롱일스 2023. 6. 15.
반응형

Modern C++ 공부 Day 5입니다.

오늘 공부할 내용은 함수 인자 전달 방식 중 하나인 Pass by const Reference입니다.

 

이전 포스트를 읽고 오시면 본 포스트를 공부하는 데 도움이 됩니다.

2023.06.15 - [Programming/C++] - [Modern C++ 공부 - Day4] 참조에 의한 전달 Pass by Reference

 

[Modern C++ 공부 - Day4] 참조에 의한 전달 Pass by Reference

Modern C++ 공부 Day 4입니다. 오늘 공부할 내용은 함수 인자 전달 방식 중 하나인 Pass by Reference입니다. Pass by Reference Pass by Reference는 변수를 함수에 전달할 때 해당 변수의 참조(reference)를 전달하는

huangdi.tistory.com

 

 

 

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);

 

  1. 변수 y는 변수 x에 대한 참조다. y는 변수의 x의 또다른 이름이라고 볼 수 있다.
  2. 함수 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에 전달

 

  1. 함수 test는 TestClass의 객체 tc에 대한 const 참조를 인자로 받는다. 여기서 const 키워드는 tc가 가리키는 객체를 함수 내에서 변경할 수 없도록 만든다.
  2. 함수 내에서 tc를 이용해 TestClass의 const 멤버 함수를 호출할 수 있지만, 객체의 상태를 변경하는 비-const 멤버 함수는 호출할 수 없다.
  3. const 참조를 이용하면 객체를 복사하지 않고 안전하게 사용할 수 있어서 큰 객체를 전달할 때 유용하다.
  4. 마지막 줄에서 함수 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
반응형