[C/C++] const int& vs const int

    반응형

    *개인적인 공부내용을 기록하는 용도로 작성한 글 이기에 잘못된 내용을 포함하고 있을 수 있습니다.


    const 키워드는 변수의 값이 변경되지 않기를 원하는 경우 변수를 상수화 시키는 용도로 사용하곤 합니다.

    int a = 10;
    const int a = 10; // 상수화

    const는 변수 뿐 만 아니라 포인터 혹은 참조자(&)에도 사용이 가능합니다. 이번 포스팅에서는 const를 참조자(&)에 사용한 예시와 const와 참조자를 함께 사용 시 얻을 수 있는 이점에 대해 정리해 보도록 하겠습니다.

     

    참조자에 100과 같은 값(리터럴)을 대입하려고 하면 에러가 발생합니다. 그 이유는 어찌보면 당연한데 참조자는 변수의 메모리 주소를 저장하는 문법인데 리터럴 값을 대입하려고 하니 오류가 발생하는 것 입니다.

    int& a = 100; // error;

     

    하지만 아래처럼 const 키워드를 앞에 붙여주면 참조자에도 값(리터럴)을 대입할 수 있습니다.

    const int& a = 100; // const 키워드 사용 시 가능

     

    그렇다면 왜 굳이 const 키워드와 참조자를 사용하면서 까지 값을 대입해야 하는지 의문이 들 수 있습니다.

    const int a = 100;
    const int& a = 100;
    // 무슨 차이 ?

     

    참조자의 const 사용은 함수의 파라미터로 사용 시 그 진가를 발휘합니다.

    우선, 보통의 Call-By-Reference 방식의 함수였다면 불가능할 리터럴을 바로 함수의 인자로 보내는 것이 가능해 집니다.

    // Call-By-Reference_3
    void prtX(const int &x)
    {
    	cout << x << endl;
    }
    
    void prtY(int &y)
    {
    	cout << y << endl;
    }
    
    int main(){
    	prtX(6) // ok
        	prtY(6) // error
    	return 0;
    }

     

    다음으로 const int&를 함수의 파라미터로 사용하면 const int와 달리 변수의 복사가 일어나지 않습니다.

    const int 방식으로 함수의 파라미터를 받을 때는 call-by-value 즉, 값에 의한 전달 방식이기에 변수의 복사가 발생해 복사 손실 문제가 발생합니다.

    하지만 const int& 방식으로 보내면 call-by-reference 이기에 복사 손실 문제에서 자유롭습니다.

     

    * call-by-value와 call-by-reference 관련 포스팅은 다음을 참고해 주세요. link

    반응형

    댓글

    Designed by JB FACTORY