본문 바로가기
개념

[C++] 참조자 개념 (1) 참조자와 Call-by-reference

by 부먹짱 2022. 9. 20.
반응형

참조자(Reference)

변수란 할당된 메모리 공간에 붙여진 이름이다.

우리는 그 이름을 통해 해당 메모리 공간에 접근이 가능하다.

C++에서는 참조자를 통해 변수에 이름을 둘 이상 부여할수있다.

단순하게 말하자면 변수에 별칭을 붙여줄 수 있는 것이다.

 

참조자를 선언하기 위해서는 &연산자를 사용해야한다.

C에서의 &연산자는 변수의 주소 값을 반환하지만, C++에서는 조건에 따라 변수의 주소 값을 반환하기도 하고 참조자의 선언을 하기도 한다.

 

int num1 = 10;
int *ptr = &num1; // num1의 주소 값을 반환해 포인터에 저장
int &ref = num1; // num1에 대한 참조자 선언

 

참조자는 기존 변수와 같은 메모리 공간을 참조한다.

따라서 주소 값 또한 기존 변수와 동일하다.

 

int num1 = 10;
int &ref = num1;

cout << num1 << endl   // 10
cout << ref << endl    // 10 
cout << &num1 << endl  // 0012FF60
cout << &ref << endl   // 0012FF60

 

참조자는 변수를 대상으로만 선언이 가능하고 선언과 동시에 초기화 되어야한다.

참조자는 선언의 방식은 변수와 다르지만 선언이 된 이후로는 변수와 큰 차이가 없다.

그래서 함수 내 선언된 지역적 참조자는 지역 변수와 마찬가지로 함수를 빠져나가면 소멸되고

참조자를 대상으로 참조자를 선언할 수도 있다.

(참고로 배열이 아닌 배열의 요소는 변수로 간주되어 참조자를 선언할 수 있다.)

 

반응형

Call-by-reference

C에서의 Call-by-reference는 주소 값을 전달 받아 함수 외부의 변수에 접근하는 형태였다.

하지만 C++에서의 Call-by-reference는 주소 값을 이용하는 형태 외 참조자를 이용하는 형태 또한 존재한다.

 

주소 값을 이용한 Call-by-reference

주소 값을 매개변수로 두어 해당 주소 값이 참조하는 영역에 저장된 값을 직접 변경

 

// 주소 값을 이용한 Call-by-reference
void Swap(int* ptr1, int* ptr2)
{
    int temp = *ptr1;
    *ptr1 = *ptr2;
    *ptr2 = temp;
}

void main()
{
    int num1 = 1;
    int num2 = 2;
    Swap(&num1, &num2);

    cout << num1 << endl; // 2
    cout << num2 << endl; // 1
}

 

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

참조자를 매개변수로 두어 함수 외부의 변수에 접근

참조자는 선언과 동시에 초기화 되어야 하지만, 매개변수는 함수가 호출되어야 초기화가 진행되는 변수이기 때문에 가능하다. 즉, 함수 호출 시 전달되는 인자로 참조자를 초기화 하겠다는 의미인 것이다.

 

// 참조자를 이용한 Call-by-reference
void Swap(int &ref1, int &ref2)
{
    int temp = ref1;
    ref1 = ref2;
    ref2 = temp;
}

void main()
{
    int num1 = 1;
    int num2 = 2;
    Swap(num1, num2);

    cout << num1 << endl; // 2
    cout << num2 << endl; // 1
}

 

반응형

댓글