참조 변수

1 minute read


참조 변수(reference variable)

참조형 변수는 다른 객체 또는 값의 별칭으로 사용되는 변수이다. 즉 참조 변수는 저장하는 변수의 메모리와 같은 주소를 참조한다.


1. 변수 참조

  • 참조 변수의 선언
    자료형& 별칭 = 저장할 변수;

    int iValue = 7;
    int& ref = iValue;
    
    std::cout << "iValue = " << iValue << std::endl;
    std::cout << "ref = " << ref << std::endl;
    
    std::cout << "iValue address = " << &iValue << std::endl;
    std::cout << "ref address = " << &ref << std::endl;
    

    참조 변수는 null값을 참조할 수 없기 때문에 반드시 선언할 때 초기화를 해주어야 한다.

    출력해보면 동일한 값과 주소가 나오는데 변수명만 다를 뿐 동일한 메모리를 사용하는 것을 알 수 있다.

  • 참조 변수 재할당

    int iValue1 = 7;
    int iValue2 = 9;
    
    int& ref = iValue1;
    ref = iValue2;
    
    std::cout << "iValue1 = " << iValue1 << std::endl 
        << "iValue2 = " << iValue2 << std::endl 
        << "ref = " << ref << std::endl;
    
    std::cout << "iValue1 address = " << &iValue1 << std::endl
        << "iValue2 address = " << &iValue2 << std::endl 
        << "ref address = " << &ref << std::endl;
        
    // 출력결과
    // iValue1 = 9
    // iValue2 = 9
    // ref = 9
    // iValue1 address = 012FFC78
    // iValue2 address = 012FFC6C
    // ref address = 012FFC78
    

    참조변수의 값이 대입한 변수의 값으로 바뀌었다. 동시에 참조 변수를 초기화한 변수 또한 값이 변경되었다. 주소를 확인해보면 선언할 때 참조한 변수의 주소와 동일하다.

    결국 참조변수는 한번 선언하면 참조할 변수를 재할당 할 수 없고 변수의 값만을 복사해서 저장하게 된다.

    또한 원본 변수의 값도 바뀌는 것으로 동일한 메모리를 사용한다는걸 확인할 수 있다.


2. 매개변수로 활용

매개변수를 참조 변수로 사용한다면 동일한 메모리를 사용하기 때문에 값의 복사가 이루어지지 않기 때문에 크기가 큰 객체를 전달할 때에 드는 비용을 줄여 성능을 향상 시킨다.

  • Swap 함수
    참조 변수와 원본 변수가 메모리를 같이 쓰는 점을 활용하여 포인터를 통해서 Swap 함수를 만들었던 것처럼 참조 변수로 만들 수 있다.

    #include <iostream>
    
    void Swap(int& _lhs, int& _rhs);
    
    int main()
    {
      int iLhs = 5;
      int iRhs = 10;
          
      std::cout << "before) iLhs = " << iLhs << ", iRhs = " << iRhs << std::endl;
    
      Swap(iLhs, iRhs);
    
      std::cout << "after) iLhs = " << iLhs << ", iRhs = " << iRhs << std::endl;
    
    }
    
    void Swap(int& _lhs, int& _rhs)
    {
      int temp = _lhs;
      _lhs = _rhs;
      _rhs = temp;
    }