두번째 글이네요.
처음 제글을 읽으실 누군가가 궁금하네요.
오늘은 참조자 입니다.
C++을 편하게 만들어 주는 친구랄까요?
시작해보겠습니다.
참조자란 무엇일까요?
"변수에 별명을 붙여주는 것이 참조자 입니다"
별명은 뭘 뜻하죠? 말 그대로 다른 이름입니다.
int num = 10;
int &ref = num;
저번 시간에 했던 내용에 추가해 갈게요.
자 위의 두줄의 코드를 그림으로 표현해보았습니다.
두줄로 인해 그림과 같은 상황이 되는거죠. 공간은 두가지의 이름을 가지는데
num이 되기도 하고 ref가 되기도 합니다.
근데 참조자는 뭐라고 했죠??
"별명이요!"
그럼 별명을 지으려는데 대상이 없으면 될까요 안될까요? 당연히 안됩니다.
별명만 먼저 지어놨다가 나중에 붙이는 건 될까요? 안됩니다.
생각해 봅시다. 별명이라는것 자체가 대상을 보고 그 특징을 기반으로 붙여주는 건데
어떻게 먼저 별명을 지어놨다가 붙이겠어요?
즉, 참조자는 선언과 동시에 초기화 되어야합니다.
참조자는 변수인가요?
애매하네요. 변수란 메모리 공간과 그에대해 붙는 이름인데, 참조자는 나 홀로 공간을 갖을 수는 없거든요.
위에서 말한 대상이 있어야하는거죠. 대상의 또다른 이름이니까요?
여튼 계속해서 설명해봅시다.
num = 20; // 공간에 저장된 값을 num을 통해 20으로 바꿈
ref = 30; // 공간에 저장된 값을 ref를 통해 30으로 바꿈
이런 식으로 안에서 값을 바꿔줄 수 있습니다.
여기까지 보면 필요성이 안보입니다. 원래 값으로 가서 바꿔도 될것 같거든요.
별명이 왜 필요하고 왜 참조자가 필요한지 아직 감이 안옵니다.
끝까지 읽으시면 그 필요성을 알게 되실거라 믿습니다.
계속 설명하기 전에,
잠깐 대입연산자와 이름(num)에 대해 짚고 넘어가겠습니다.
저번 시간에 분명히, 'num이라는 공간에 10을 잠깐 불러와 복사해서 그 값을 대입한다' 라고 말씀드렸는데요.
int &ref = num; 은 무엇을 복사해서 대입하는 걸까요?
참조자에는 참조의 정보가 복사되어 저장됩니다. 참조의 정보( 참조 값 ) 이라고 표현하겠습니다.
ref 라는 참조자는 num의 참조의 정보( 참조 값 )가 복사되어 저장됩니다.
이해를 돕기 위해 즉, num은 주소를 가진 메모리 공간에 붙여진 이름이고, 그 메모리 공간에는 주소 말고도 안에 값에
접근할 수 있는 참조의 정보를 가지고 있습니다.
또한 컴퓨터가 알고있는 주소를 사람이 알아볼 수있도록 붙인 이름이 바로 num입니다.
즉 내부적으로는 num을 입력하면 그 컴퓨터가 인지할수 있는 주소를 반환하고 그 주소로 안에 값을 들여다 본다라고 생각하시면 되겠습니다.
마지막으로 공간에 값을 대입한다는 것은, 피연산자( 오른쪽에 있는 연산자 ex int num = 10; 일때 10) 10을 복사해서 공간에 int형으로 반환하여 저장한다고 생각하시면 됩니다. 이렇듯 = 연산은 기본적으로 피연산자의 값을 복사합니다.
이는 함수에 들어갈 때 역시 마찬가지입니다.
#include <iostream>
using namespace std;
void Swap(int num10, int num20)
{
int temp = num10;
num10 = num20;
num20 = temp;
}
int main(void)
{
num1 = 10;
num2 = 20;
Swap(num1,num2);
cout<<num1<<" "<<num2<<endl;
}
복잡해 보입니다. 나중에 다 알게 될 것이니 걱정하지 맙시다.
Swap을 통해 num1과 num2를 바꾸려 했습니다.
바로 Swap(num1,num2); 이 문장을 ( 함수의 호출 )을 통해서 말이죠.
저 문장을 통해 int num10 = num1, int num20 = num2 이라는 문장이 생깁니다.
위의 문장을 해석해볼까요?
" 내가 int형 자료형을 저장할 공간에 num10이라는 이름을 붙일 건데 그 안에 저장할 값은 num1에 들어있는 값이야. "
자 그럼 문제입니다.
1. num10 에 들어있는 값과 num1에 들어있는 값은 같을까요? ( num10 == num1 ? )
2. num1이라는 공간과 num10이라는 공간은 같은까요?( &num10 ==&num1 ? )
두 질문에 완벽하게 대답하셨다면, Swap함수를 통해 값이 바뀌지 않는다는 사실을 유추할 수 있습니다.
1번은 맞고 2번은 아닙니다.
즉 서로 다른 공간에 같은 값(여기서는 숫자)가 들어있다고 생각하면 되겠습니다.
다른건 모르겠고, Swap 함수가, num10 과 num20을 가지고 놀고 있으니, num1 과 num2는 바뀌지 않을 겁니다.
함수를 통해 값을 바꾸려고 했는데, 공간이 복사되고 값만 가져오는 바람에 원하는 의도의 함수가 작성되지 않았습니다.
이럴 때 편하게 사용하는 방법이 바로 참조 값을 이용하는 방법입니다.
함수를 통해 값을 바꾸는 방법에는 2가지가 있습니다.
1. 주소를 이용하는 방법
2. 참조자를 이용하는 방법
1번은 포인터를 활용하는 방법이고 2번은 오늘 배운 참조자를 활용하는 방법입니다.
그런데 포인터를 활용하게 되면, 실수할 가능성이 높아져 참조자를 활용하라고 C++에서는 권장합니다.
특히 잘못된 메모리 접근은 시스템을 날려먹을 수 있기 때문에 포인터 사용은 매우 주의를 요합니다.(물론 우리가 사용하는 컴퓨터에는 해당사항이 없습니다)
여튼 다시 한번 복습하겠습니다.
참조자는 무엇이라고 했죠?
" 메모리 공간의 참조 정보를 복사한 별칭이다. "
무엇을 참조하는 데요?
" 메모리에 저장된 값을 참조합니다. "
대입 연산자를 활용하면 어떻게 된다구요?
" 피연산자를 복사합니다. "
그렇다면 함수에 넣을 때 int &num10 = num1, int &num20 = num2로 바꿔주면 무엇이 복사될까요?
#include <iostream>
using namespace std;
void Swap(int &num10, int &num20)
{
int temp = num10;
num10 = num20;
num20 = temp;
}
int main(void)
{
num1 = 10;
num2 = 20;
Swap(num1,num2);
cout<<num1<<" "<<num2<<endl;
}
num1과 num2의 참조 정보가 복사되기 때문에 num10과 num20은 num1과 num2를 가지고 논다고 생각하면 되겠네요?
아하 그럼 이번에는 Swap함수를 통해 num1과 num2가 바뀌겠네요.
이번 글에서 매우 중요한 참조자의 역할이 나왔습니다.
즉 값을 기본적으로 복사하는 함수에 복사하는 값으로 참조의 정보를 줌으로써 외부에서 원하는 변수를 통제할 수 있다.
이게 참조자가 가진 기본 역할이자 매우 중요한 역할이라고 할 수 있겠습니다.
마무리 하며, 참조자는 포인터와 다릅니다. 포인터와 비교해가며 그 차이를 인지하는 것은 좋은 공부가 될 수 있겠지만, 참조자의 이해를 위해 포인터를 가져오진 맙시다. 자 그럼 오늘은 여기까지만 할게요.
혹여나 잘못된 부분이나, 추가적인 설명이 필요한 부분등에 대해 댓글로 남겨주시면 수정 혹은 추가 설명드리도록 할게요! 그럼 이만!
'함께 알아가는 C++' 카테고리의 다른 글
C++ 세 번째 이야기, 클래스 1 (0) | 2022.01.27 |
---|---|
C++ 첫번째 이야기, 자료형 (0) | 2021.12.19 |