참조자
C++에서 참조자를 사용하면 하나의 변수에 여러 개의 이름을 부여하는 것이 가능하다.
int num1 = 2000;
int &num2 = num1;
위 코드를 보기만 해서는 이해가 잘 안될 수도 있다.
C언어에서 분명히 &연산자는 주소값을 나타내는 것이라고 하였는데 주소에 2000을 저장할 수가 있는것일까?
당연히 주소에 2000이라는 정수를 넣는 것은 말이 안되고 이때 &연산자가 다른 의미로 사용이 된 것이다.
&가 이미 선언된 변수 앞에 오면 주소를 반환하라는 뜻이지만
새로 선언되는 변수 앞에 올 때에는 참조자의 선언을 뜻하게 된다.
따라서 위의 코드가 실행되면 num2는 num1 의 참조자가 되며
2000이 저장되어 있는 num1의 메모리에는 num2라는 이름도 붙게 되는 것이다.
참조자의 선언
참조자의 수에는 제한이 없으며 참조자를 대상으로도 참조자의 선언이 가능하다.
따라서 아래와 같은 코드도 유효하다.
int num1 = 2500;
int &num2 = num1;
int &num3 = num1;
int &num4 = num3;
위 코드에서 num1, num2, num3, num4 는 모두 같은 곳을 가리키고 있는 것이다.
참조자를 선언할 때에는 변수에 대해서만 참조가 가능하고 반드시 선언과 동시에 참조를 진행해야한다.
참조자의 활용
그래서 도대체 변수에 이름을 여러 개 붙여주는 이유가 무엇일까?
우선 참조자를 활용하면 포인터를 사용할 때보다 편리하게 Call_By_Reference 방식의 함수호출이 가능하다
#include <iostream>
void swap(int &ref1, int &ref2)
{
int temp = ref1;
ref1 = ref2;
ref2 = temp;
}
int main()
{
int num1 = 10;
int num2 = 20;
swap(num1, num2);
std::cout << num1 << " " << num2 ;
return 0;
}
위 코드를 실행시켜 보면 두 변수의 값이 변경된 것을 확인할 수 있다.
참조자 반환
함수의 반환형으로 참조자를 선택할 수도 있다.
#include <iostream>
int &plus(int &ref)
{
ref++;
return ref;
}
int main()
{
int num1 = 1;
int &num2 = plus(num1);
num1++;
num2++;
std::cout << num1 << " " << num2 ;
return 0;
}
위 코드의 구조에 대해서 생각해보자.
우선 plus 함수가 호출될 때 num1이 가리키고 있는 메모리에 ref라는 또 하나의 이름이 붙는다.
그리고 참조자로 선언된 num2에 ref 가 전달되면서 num1에는 num2 라는 이름도 붙게 된다.
이후 plus 함수의 호출이 종료되면서 ref는 지역변수이므로 사라지게 되어 num1에 붙은 ref 라는 이름 또한 없어진다.
따라서 num1이 가리키고 있는 메모리에는 num1과 num2라는 두 개의 이름이 존재하게 된다.
위 내용을 이해 했다면 출력된 값에 대해서도 느낌이 올 것이다.
ref는 num1과 동일한 곳을 가리키고 있으므로 num1은 2가 되고 num1과 num2도 동일한 곳을 가리키고 있으므로
num1++ 과 num2++을 통해 4가 된다.
따라서 num1과 num2를 출력했을 때 모두 4가 출력되는 것이다.
const 참조자
const 지시자를 참조자에 사용하게 되면 참조자를 사용하여 값을 변경하는 것을 불가능하게 만들겠다는 의미이다.
#include <iostream>
int main()
{
int num = 1;
const int& ref = num;
ref++;
std::cout << num;
return 0;
}
따라서 위 코드는 컴파일 오류가 발생한다. 컴파일러에서 const 로 선언된 참조자를 통한 값의 변경을 막은것이다.
또한 const로 선언된 참조자는 상수를 참조하는 것이 가능하다.
const로 선언되었을 경우 참조자를 통한 값의 변경이 불가능하기 때문에 논리적으로 상수를 참조해도
문제가 없기때문이다.
따라서 이를 함수에 응용하여 다음과 같이 사용하는 것이 가능하다.
int GetPlus(const int &ref1, const int &ref2) {
return ref1+ref2; }
위 코드처럼 단순히 함수로의 값의 전달만을 요구할 때 const 참조자를 사용할 수 있다.
'C++ > C++ 문법' 카테고리의 다른 글
[C++] 구조체 (0) | 2024.03.10 |
---|---|
[C++] 배열, 동적 할당 (new와 delete) (0) | 2024.03.09 |
[C++] C++에서 C언어 헤더파일 호출 (0) | 2024.03.09 |
[C++] 인라인 함수 (inline function) (0) | 2024.03.01 |
[C++] 이름공간 (namespace) (0) | 2024.02.10 |