레퍼런스(Reference)

레퍼런스(Reference)

main

레퍼런스(Reference)

  • 우선 C언어에서는 레퍼런스(Reference) 라는 것이 없다.
  • C언어에서는 포인터를 이용한 Call-By-Reference 가 있다.
void swap(int *a, int *b)
{
    int temp=*a;
    *a = *b;
    *b = temp;
}

int main()
{
    int va1 = 5;
    int va2 = 10;
    
    swap(&va1, &va2);

    return 0;
}
  • C에서 포인터를 이용한 방법으로 va1, va2의 주소값을 swap함수의 포인터 변수로 넘겨주고 포인터 변수 *a, *b의 데이터를 swap 해주면 최종 데이터 va1과 va2의 데이터가 바뀌게 된다.
  • 이 방식에는 장점이자 단점이 있는데 주소값을 직접 접근하여 변형할 수 있다는 것이다.
void swap(int *a, int *b)
{
    int temp=*a;
    *a = *b;
    b++;
    *b = temp;
}
  • 위와 같이 하게 되면 b의 주소값 즉 va2의 주소값을 하나 증가 시켜 버리게 된다.(주소값 하나에 1byte 이므로 4byte int 변수로 선언된 주소 블럭을 깨뜨리기 때문에 위와 같은 코드는 메모리 에러를 발생 시킴)

  • C++에서는 이를 방지하기 위한 레퍼런스(Reference) 라는 것이 있다.

int &ref = val;
  • 위와 같은 방법이 레퍼런스를 선언하는 방법으로 C에서 변수의 주소값을 얻기 위한 연산자 & 위치와 다르게 변수를 선언하는 곳에서 연산자 &이 위치한다.
int main()
{
    int val = 5;
    int &ref = val;  // 레퍼런스 선언

    val++;  // val 변수와 ref 변수 모두 6의 값을 가지게 된다.
    ref++;  // val 변수와 ref 변수 모두 7의 값을 가지게 된다.

    return 0;
}
  • 레퍼런스는 선언하는 시점부터 변수와 동일하게 값이 변경된다. 마치 그 변수의 주소값을 넘겨 받은 포인터 변수처럼…

  • 레퍼런스는 먼저 선언된 변수의 주소 공간 값을 가르키는 변수가 된다.

  • 장점은 기존의 포인터 변수를 사용하지 않아도 된다는 것이고 단점은 레퍼런스가 정의된 함수를 사용할 때 이것이 Call-By-Value인지 Call-By-Reference 인지 알 수가 없다는 것이다.

.
.
    swap(va1, va2);
.
.
  • 위 함수 사용만 보고 레퍼런스 인지 아니면 Call-By-Value 인지 알 수가 없다.
  • 레퍼런스의 장점은 포인터와 같은데 Call-By-Value와 다르게 데이터 복사가 이루어지지 않는 다는 것이다. 이것은 메모리를 효과적으로 사용할 뿐만 아니라 속도 향상도 있다. 또한 메모리 주소를 직접 접근하지 않는다는 것이다.

도움이 되셨다면 더 좋은 정보 공유를 위해 광고 클릭 부탁 드립니다 :)

댓글 쓰기

0 댓글