티스토리 뷰

  참조(refefence)는 C++의 새로운 기능 중 일부이다. C 에서는 포인터를 사용했지만 포인터는 여러가지 문제점을 발생시킬 수 있는 기능이여서 C++에서는 굳이 포인터가 필요없을 때 더 안전하게 사용하기 위해서 참조(reference)를 사용한다.

 

참조(reference)

  • 포인터를 사용하는 좀 더 안전한 방법
  • 하지만 Java만큼 제한적이지는 않음
  • 먼저 이것부터 살펴 보자
    • 값에 의한 호출(call by value)
    • 참조에 의한 호출(call by reference)
    • 포인터(pointer)

 

값에 의한 호출(call by value)

void swap(int arg1, int arg2)
{
  int temp = arg1;
  arg1 = arg2;
  arg2 = temp;
}

void main()
{
  int num1 = 10;
  int num2 = 20;
  
  swap(num1, num2);
}

  위 함수를 보면 main()에서 생성한 num1, num2의 값을 swap 함수를 호출함으로서 swap의 매개변수로 가져온다.

  swap 함수는 두 값을 바꾸는 함수인데 swap 함수 안에서는 두 값이 바뀌지만 원본을 바꾸지는 않는다.

 

참조에 의한 호출(call by reference)

void swap(int& number1, int& number2)
{
    int temp = number1;
    number1 = number2;
    number2 = temp;
}

void main()
{
    int num1 = 10;
    int num2 = 20;
    
    swap(num1, num2);
}

  아까와는 다르게 swap 의 매개변수를 인트 포인터로 받아온다. 즉, 변수의 주소를 뽑아서 함수에 전달하겠다는 뜻.

  값에 의한 호출과는 다르게 참조에 의한 호출은 원본의 주소를 가져오기 때문에 주소의 값을 바꾸면 원본의 값또한 바꾼다.

 

  • 별칭이다
int number = 100;
int& reference = number;

  원본의 이름이 아닌 별칭으로 부르는 것. number는 100이라는 값을 가지고 있는 변수인데, 이것을 다른 이름으로 부르는 것이 참조이다. 즉, reference는 number의 별칭이된다.

  중요한 것은 참조형을 표현할 때는 `&`을 붙여야한다.

 

  • NULL이 될 수 없다
int& reference = NULL;	// error

  이렇게 되면 바로 컴파일러 에러난다.

 

  • 초기화 중에 반드시 선언되어야 한다
int& reference;		// error

  누군가의 별칭인지 반드시 선언해줘야 한다.

 

  • 참조하는 대상을 바꿀 수 없다
int num1 = 100;
int num2 = 200;

int& reference = number1;
reference = number2;	// 세 변수 값이 모두 200이 됨

  reference의 값이 바뀌는 것이 아니다. reference는 number1을 참조하고 있기 때문에 number1의 값이 바뀌게 되고 세 변수 값이 모두 200이 된다.

 

  • 포인터보다 참조가 안전한 이유
포인터
void Swap(int* number1, int* number2)
{
    int temp = *number1;
    *number1 = *number2;
    *number2 = temp;
}

  Swap 함수는 두 변수를 바꾸는 함수이다. 포인터는 호출자가 NULL을 가져올 수 있는데, *number1을 읽을려고할 때 에러난다.

  그리고 포인터는 *(number1 + 1)을 가리킬 수 있는데 우리가 소유한 메모리 장소가 아니기 때문에 올바른 방법은 아니다. 무슨 말이냐면, number1의 메모리 장소가 4096이라면 number1 + 1은 4104를 가르킨다.

참조
void Swap(int& number1, int& number2)
{
    int temp = number1;
    number1 = number2;
    number2 = temp;
}

  참조는 애초에 NULL인 변수를 참조할 수 없다. 그렇기 때문에 호출자가 NULL을 가져올 것에 대해 걱정할 필요가 없다.

  참조는 우리가 소유하지 않은 메모리 장소를 가리킬 수 없기 때문에 포인터에 비해 안전하다.

 

 

컴퓨터는 참조가 뭔지 알까?

  • 모름
  • 포인터와 참조는 같은 어셈블리 명령어를 생성함
  • 참조는 오직 인간을 위한 것임
  • 컴파일러는 기계가 이해할 수 있도록 참조를 "포인터"로 바꿔 줌.
댓글