반응형

 

참조자 (Reference)

- 할당된 어떤 하나의 메모리 공간에 다른 이름을 부여하는 것이다.

  ※ 별명이라고 생각해도 좋다.

- 참조자는 변수 앞에 &를 붙여줌으로써 선언할 수 있다.

  ※ 이미 선언된 변수 앞에 &를 붙이면 주소값을 반환하지만, 새로 선언되는 변수 앞에 &를 붙이면 참조자 선언을 뜻한다.

 

 

 

활용

- 다음과 같이 사용하게되면 num2는 num1의 참조자가 되며 두 변수는 같은 메모리 공간을 가리키게 된다.

int num1 = 10;
//참조자 num2 선언
int& num2 = num1;

 

- 즉, 같은 메모리 공간을 가리키므로 num2에 100을 대입해주면 num1, num2의 값이 100으로 변경된다.

num2 = 100;
//결과 : num1 : 100, num2 = 100

 

 

- 참조자의 수에는 제한이 없으며 참조자를 대상으로도 참조자 선언이 가능하다.

int num1 = 10;
int& num2 = num1;
int& num3 = num1;

//---------------

int num1 = 10;
int& num2 = num1;
int& num3 = num2;

  ※ 위 코드와 아래 코드 모두 동일하게 num1의 메모리 공간을 가리킨다.

  ※ 하지만, 필요 이상으로 참조자를 선언하는것은 바람직하지도 않고, 필요하지도 않다.

 

- 참조자의 선언 가능 범위

  • 참조자는 변수에 대해서만 선언 가능.
int& ref = 20;	//(X)
  • 참조자는 변수에 별명을 붙이는 것이기에 미리 선언했다가 나중에 다른 변수를 참조하는 것이 불가능하다.
int& ref;	//(X)
  • 참조자는 상수에 대해 참조가 허용되지 않는다.
const int num = 10;
int& ref = num;		//(X)
  • 참조자는 NULL로 초기화하는것이 불가능하다.
int& ref = NULL;	//(X)
  • 배열의 요소와 포인터도 변수로 간주되어 참조자의 선언이 가능하다.
//Array reference
int arr[1] = {1};
int& arrRef = arr[0];	//1

//--------------------

//Pointer reference
int num = 1;
int* ptr = #
int& nRef = num;	//1
int* (&pRef) = ptr;	//1

 

 

 

Call-by-value & Call-by-reference

- 참조자의 활용에는 함수가 큰 지분을 차지한다.

  • Call-by-value : 값을 인자로 전달하는 함수의 호출방식
  • Call-by-reference : 주소 값을 인자로 전달하는 함수의 호출방식

- C에서의 Call-by-reference는 주소값을 전달받아 함수 외부에 선언된 변수에 접근한다.

- C++에서의 Call-by-reference는 두가지로 구분할 수 있다.

  • 주소값을 이용한 Call-by-reference (C의 개념과 동일)
  • 참조자를 이용한 Call-by-reference

 

 

참조자를 이용한 Call-by-reference

- 다음 코드를 통해 참조자를 활용해도 Call-by-reference가 가능하다는것을 알 수 있다.

void Swap(int& n1, int& n2)
{
    int tmp = n1;
    n1 = n2;
    n2 = tmp;
}

void main()
{
    int n1 = 10;
    int n2 = 20;
    
    Swap(n1, n2);
    
    //결과 n1 : 20, n2 : 10
}

  ※ 매개변수의 경우 함수가 호출되어야 초기화가 되기때문에 별도의 에러를 발생시키지 않는다.

 

 

 

참조자를 이용한 Call-by-reference의 단점

int n = 20;
TempFunc(n);
cout << n << endl;

- 위의 코드를 기준으로 봤을때, C의 개념이면 무조건 20이 출력되지만, C++에서의 출력값은 예상할 수 없다.

  ※ TempFunc(int)의 매개변수가 참조자일 가능성이 있기 때문.

- 따라서, n의 값을 예상하기 위해서는 TempFunc(int)의 함수 원형을 일일이 확인해야하는 불편함이 생긴다.

- 이 단점은 매개변수에 const를 붙여 상수화 시켜서 매개변수의 값 변경을 막을수있다.

- 이런 불명확함 때문에 C++ 프로그래머들은 참조자를 잘 사용하지 않는다.(고 한다.)

 

 

 

상수 참조하기

- 다음과 같은 방법으로 상수의 참조가 가능하다.

const int num = 10;
const int& ref = num;

- Why?

  • 이것은 '임시객체'를 참조하기 위한 방법이다.
  • 리터럴 상수는 임시적으로 존재하는 값. 즉, 다음 행으로 넘어가면 존재하지 않는 상수다.
  • 그래서 C++은 const 참조자를 이용해서 상수를 참조할 때 '임시변수'를 만들고 이 장소에 상수를 저장해 참조하게 끔 한다.
반응형

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

C++ 파일 입출력 ofstream, ifstream  (0) 2021.10.16
C++ 생성자, 복사생성자, 소멸자 (+ const)  (0) 2021.10.15
C++ 동적할당 new, delete  (0) 2021.10.13
C++ 클래스, 객체, 인스턴스  (0) 2021.09.29
C++ 객체지향  (0) 2021.09.28

+ Recent posts