Minwoo Dev.

[C++] const 참조자, const 참조자를 사용한 Call-by-reference 본문

C++

[C++] const 참조자, const 참조자를 사용한 Call-by-reference

itisminu 2024. 3. 10. 17:38
728x90
반응형
SMALL

const 참조자

#include <iostream>
using namespace std;


int main(void)
{
    const int num = 10; // 변수같아 보이지만 상수. 정확히는 상수화된 변수
    int &ref=num; // 상수화된 const 값을 참조 불가, 변수만 참조가능
    num+=10; // const 값은 변경불가! 

    return 0;
}

 

 

위 코드는 num이라는 변수를 const를 사용하여 변경할 수 없도록 만들었다.

그리고 그 값을 ref가 참조하여, ref를 통해 num을 변경하고자 한다.

 

위 코드는 오류가 발생한다.

실행이 된다면 num 을 const로 선언한 이유가 없을 것이다.

 

이럴 때, const 참조자를 사용한다.

#include <iostream>
using namespace std;

int main(void)
{
    const int num = 10;
    const int &ref = num;

    return 0;
}

 

제일 위의 코드에서 상수화된 변수에 값을 더하는 것은 누가봐도 잘못된 코드이고, 상수화된 변수, 즉 const 변수를 참조하려면 참조자에도 const 참조자가 사용되어야 한다.

 

참조자는 보통 변수만을 참조할 수 있지만, 상수값은 참조하지 못한다.

하지만 const 참조자는 상수값 혹은 상수화된 변수(const 변수를 의미함) 을 참조할 수 있다.

 

 


 

const 참조자는 함수에서도 많이 사용한다. 

 

 

 

C++에서 Call-by-reference 형식의 함수를 작성하는 방법은 크게 두 가지가 있다.

 

  1. 포인터를 사용
  2. 참조자를 사용

 

Call-by-reference 함수는 함수 내부에서 함수 외부의 값을 변경할 수 있다는 장점이 존재한다.

 

#include <iostream>
using namespace std;

void PrintValue(int &n1, int &n2)
{
    cout << n1 << endl;
    cout << n2 << endl;
}

int main(void)
{
    int num1 = 3, num2 = 5;
    PrintValue(num1, num2);

    return 0;
}

 

예를 들어, 위처럼 단순하게 출력만을 해주는 프로그램을 참조자를 사용한 함수로 구현했다고 하자.

출력만을 요구하기 때문에 Printvalue 함수에서 n1과 n2의 값을 변경해서는 안될 것이다.

 

실수로 코드를 하나 잘못 작성한다면 값이 변경되는 참사가 일어날 것이다.

 

C++에서는 이러한 상황을 방지하기 위해 const를 사용한다.

 

 

#include <iostream>
using namespace std;

void PrintValue(const int &n1, const int &n2) // 인자에 const 변수 선언!
{
    cout << n1 << endl;
    n2 = 30; // 오류 발생
    cout << n2 << endl;
}

int main(void)
{
    int num1 = 3, num2 = 5;
    PrintValue(num1, num2);

    return 0;
}

 

 

위처럼 함수의 매개변수에 const를 붙이면 함수 내부에서 값을 변경하려는 경우에 오류를 발생시킨다.

 

 

 

 

const 를 매개변수의 자료형 앞에 붙이는 거 만으로도 우리가 원치않는 방향으로 값이 변경되는 걸 막을 수 있다.

728x90
반응형
LIST