저의 velog에 작성된 글은 모두 저의 주관적인 생각 및 이해를 바탕으로 작성된 글이므로
정확하지 않은 내용을 있을 수 있음을 알립니다.
[교재] 윤성우 열혈 C++ 프로그래밍
오늘은 참조 변수가 변수가 아닌 숫자를 직접 참조할 수 있는지에 대해 이야기 해보려고 한다.일반적으로 우리는 참조를 배울 때 "참조변수는 변수를 참조해야한다."라고 배운다. 바로 아래와 같이 말이다.
int a = 10;
int& ref = a;
그 이유는 참조를 하기 위해서는 '메모리 주소'가 필요하기 때문이다. 참조를 한다는 것의 의미는 메모리 주소를 알고 있을 때 그 주소를 참조하여(찾아가) 저장되어 있는 값을 활용하는 것이다.
따라서 단순히
10
은 메모리에 저장되어 있는 수가 아니지만,
int a = 10;
이라고 하면 a라는 변수에 10이라는 값이 저장되고, 이는 메모리를 할당받기 때문에 참조가 가능한 것이다.
그렇다면 결론적으로 상수를 참조하는 것은 불가능한가??
결론을 이야기 하자면 아래와 같은 형식의 상수 참조는 불가능하다.
int& a = 10;
그 이유는 Intro
에서 설명한 바와 같다. 10은 메모리 공간에 저장되어 있지 않은 수이기 때문이다.
그렇다면 상수 참조는 불가능하다는 걸까?? 그것은 아니다. 다른 방식으로 상수 참조가 가능하다.
그 방법은 바로 const
keyword를 사용하는 것이다.
const int& a = 10;
위의 경우 상수의 직접 참조가 가능해진다. 그 이유는 뭘까??
질문에 대한 답은 비교적 간단하다. 그것은 바로 '임시변수'라는 것이 이를 가능하게 한다.
C++에서는 const
를 이용해 상수를 참조할 때는 '임시변수'라는 것을 만든다.
임시변수라는 것은 말 그대로 임시적으로 생성한 변수라는 의미이다. 위에서 "참조가 가능하려면 메모리 주소가 있어야한다"라고 언급했다.
임시변수는 임시적으로 메모리 공간을 할당하고 해당 메모리 주소에 상수를 저장하고선 참조가 가능하게 만든다!
그런데 이거는 언제 써먹는걸까..?
바로 아래처럼 쓰면 된다..!
int Adder(const int& a, const int& b){
return a+b;
}
int main(){
cout << Adder(10, 20) << endl;
return 9;
}
위의 함수는 문법적으로 에러가 발생하지 않는다.
Adder 함수를 호출할 때 Adder(10, 20)
으로 호출했다. 이렇게 호출된 함수를 들여다보면
int Adder(const int& a, const int& b){
return a+b;
}
각각 const 참조형 변수 a와 b에 10과 20이 들어가 더한값을 반환한다.
const 참조형 변수 a와 b에 10과 20이 들어간다는 것을 코드로 표현하면,
const int& a = 10, const int& b = 20;
의 이미이고 이것은 임시변수가 생성됨과 함께 참조가 가능하다는 것을 의미한다.
오늘은 참조자가 상수를 직접 참조할 수 있는가? 를 주제로 이야기해봤다. 매개변수를 참조자로 받는 함수를 만들고, 함수 호출시에는 변수가 아닌 상수로 호출하도록 만들려면 '임시변수'에 대한 개념이 필요하다는 것이 오늘의 결론이 될 것이다. 궁금증이 조금 해결되었기를 바란다!