삶의 공유

[C++]참조자(Reference) 정의 본문

Programing/C++

[C++]참조자(Reference) 정의

dkrehd 2020. 11. 2. 21:36
728x90
반응형

#출저 : 열혈 C++프로그래밍(책)

 

변수는 할당된 공간에 붙여진 이름이다. 그리고 그 이름을 통해서 해당 메모리 공간에 접근이 가능하다.

여기서, 할당된 하나의 공간에 둘 이상의 이름을 부여하는 경우를 참조(Reference)한다 라고 말한다.

 

int num1 = 2010;

이렇게 변수를 선언 하면 메모리 공간 상에서는, 아래 처럼 된다.

 

 

여기에서 int &num2 = num1; 를 실행하면 num1이라는 이름이 붙어 있는 메모리 공간에는 num2라는 이름이 하나 더 붙게 된다.

 

 

*포인터와 헷갈리면 안된다. 포인터 의미와 구분 짓자면,

int *ptr = &num1 // 변수 num1의 주소 값을 반환해서 포인터 ptr에 저장해라.

int &num2 = num1 // 변수 num1에 대한 참조자 num2를 선언해라.

이렇게 구분이 된다. 

 

변수와 기능,연산의 결과가 동일 하나, '참조자' 라는 별도의 이름으로 정의된다.

만약 num2 = 3047; 이라는 구문이 실행되면, 변수 num1의 메모리 공간에 3047이 저장되어 다음과 같이 된다.

즉, 참조자는 자신이 참조하는 변수를 대신할 수 있는 또 하나의 이름 인 것이다.(변수에 별명을 하나 붙여주는것과 같다)

아래 예시는, num1, num2가 동일한 메모리 공간에 두개의 이름으로 되어 동일한 변수 값과 주소를 갖는것을 볼 수 있다.

#include <iostream>

using namespace std;

int main()
{
    int num1 = 1020;
    int &num2 = num1;
    
    num2 = 3047;
    cout << "변수 : " << num1 << endl; // 3047
    cout << "참조 : " << num2 << endl; // 3047

    cout << "변수 : " << &num1 << endl; // 0x7ffee64c2734
    cout << "참조 : " << &num2 << endl; // 0x7ffee64c2734
}

참조자의 몇가지 특징을 보면,

1) 참조자의 수에는 제한이 없으며, 참조자를 대상으로도 참조자를 선언 할 수 있다.

 

int num1 = 2759;

int &num2 = num1;

int &num3 = num1;

int &num4 = num1;

이 문장은, 아래와 같이 실행해도 위와 같은 결과를 얻을 수 있다.

int num1 = 2759;

int &num2 = num1;

int &num3 = num2; // 3 -> 2 -> 1

int &num4 = num3; // 4 ->3 -> 2 -> 1

 

2)참조자는 변수에 대해서만 선언이 가능하고, 선언됨과 동시에 변수(배열의 요소 포함, 배열 X)를 참조 해야만 한다.

int &ref = 20; (x)

int &ref; (x)

int &ref = NULL (x) 

 

또한, 포인터 변수도 변수이기 때문에 참조자의 선언이 가능하다.

#include <iostream>
using namespace std;

int main()
{
    int num = 12;
    int *ptr = &num; // 포인터 변수 prt에 num의 주소를 대입함. 
    int **dptr = &ptr; // num에 저장된 값 12 가 dptr에 저장됨.

    int &ref = num; //num이라는 메모리 공간에 ref 별칭을 붙임.
    int *(&pref) = ptr; // pref는 포인터 변수 ptr의 참조자이므로, 변수 num에 저장된 값이 출력됨.
    int **(&dpref) = dptr; // dpref 포인터 변수 dptr의 참조자 이므로, 변수 num에 저장된 값이 출력된다.

    cout << ref << endl; //12
    cout << *pref << endl; //12 
    cout << **dpref << endl; //12
}
반응형

'Programing > C++' 카테고리의 다른 글

[C++] 코딩테스트 준비(백준, 고양이문제)  (0) 2021.01.14
[C++] Call by reference & Call by Value  (0) 2020.11.09
C++ 자료형 bool  (0) 2020.10.26
[C++]namespace(이름 공간)  (0) 2020.10.21
[C++]인라인(Inline) 함수  (0) 2020.10.21