안녕하세요 넬다이입니다.
오늘의 정리는 레퍼런스에 대해서 정리를 해보도록 하겠습니다.
오늘도 이렇게 봐주시는 여러분들께 감사드리고 정리를 시작해보겠습니다
레퍼런스 변수
레퍼런스 변수는 이미 선언된 변수를 다른 이름으로 부르는 것을 말하며,
레퍼런스 변수를 선언할 때 반드시 어떠한 변수를 부를지를 명시를 해야만 한다.
int iA = 10;
int iB = 20;
int* p = &iA;
p = &iB;
이것은 포인터 변수이다.
포인터 변수는 주소 값의 변경이 가능하며 이 뜻은 가리키는 위치에 변경이 가능하다는 뜻입니다.
int iA = 10;
int iB = 20;
int* p = &iA;
p = &iB;
//레퍼런스 변수는 선언과 동시에 초기화를 해주어야 한다.
int& rTest = iA;
cout << rTest << endl;
위는 레퍼런스 변수의 선언과 초기화에 해당한다.
레퍼런스 변수는 선언과 동시에 초기화를 해주어야 하며 rTest를 cout를 하게 되면은 iA의 값이 나오게 된다.
포인터 변수는 간접 접근을 통해 공간을 참조하고, 레퍼런스 변수는 직접 접근을 통해 참조하는 것입니다.
int iTemp = 10;
int iTemp2 = 20;
//레퍼런스 변수
int& rTemp = iTemp;
//레퍼런스 변수로써 참조하고 있는 위치의 변경이 불가합니다.
//아래 문법은 단순 값이 대입하는 연산일 뿐입니다.
//iTemp = iTemp2 와 같은 의미입니다.
rTemp = iTemp2;
위에 코드를 보면은 레퍼런스 rTmp는 iTemp를 참조했는데 이 뜻은 iTemp에게 하나의 이름 rTemp를 정해준 거와 마찬가지로써 하단에 rTemp = iTemp2는 iTemp = iTemp2와 같습니다.
레퍼런스는 일반적으로 값이 넘어가는 상태에서 값이 명확하고 그 값을 사용만 하는 경우에 주로 사용한다.
가끔 코딩을 하다 보면 포인터 남발을 하다 보면은 값에 대한 신뢰도가 떨어지는 경우가 생기는데 이런 경우에 조심해서 코드를 작성해야 한다.
call by value,
call by pointer,
call by reference,
이 3가지는 속도가 다 다름
call by reference 가 일반적으로 가장 빠르다고 합니다.
#include <iostream>
using namespace std;
void plus(int iA);
void plus2(int* pA);
void plus3(int& rA);
void main()
{
int iValue = 0;
//Call By Value
plus(iValue);
//이 값은 0이 나오게 됩니다.
cout << iValue << endl;
//Call By Pointer
plus2(&iValue);
//이 값은 1이 나오게 됩니다.
cout << iValue << endl;
//Call By Reference
Plus3(iValue);
//이 값은 2가 나오게 됩니다.
cout << iValue << endl;
}
//Call By Value는 값 자체만 전달이 된 것이기 때문에 iA의 값이 커진다 해도
//위 iValue의 값은 변하지 않습니다.
void plus(int iA)
{
++iA;
}
//Call By Pointer은 주소를 넘겨주었기 때문에 pA는 iValue의 주소를 들고있는 변수이므로
//pA의 주소 iValue의 값을 직접 변경함으로써 iValue의 값은 변합니다.
void plus2(int* pA)
{
++*pA;
}
//Call By Reference는 rA가 iValue로 부르게 될것이라고 직접 명시를 해주었고
//레퍼런스 변수는 직접 접근을 통해 참조하기 때문에 rA는 iValue이므로 iValue의 값은 증가한다.
void plus3(int& rA)
{
//외부에 있는 값을 변경하기 위해서 레퍼런스 변수를 통한 직접참조
++rA;
}
위에 간단하게 주석으로 설명을 적어놓았습니다.
여기에 적으려니 설명을 잘 어떻게 해야 할지 애매해서 주석으로 남기게 되었는데 어려우시다면은 어려우신 부분을 댓글로 남겨주시면 답변드리겠습니다.~~~ 언제까지고~.
팁.
스캇 마이어스는 매개변수가 3개 이상일 경우 내부 구조상 stack 구조로 쌓인 다음에 동작을 하기 때문에
이런 케이스에 경우 구조체를 만들어서 레퍼런스로 인자를 전달할 것을 권장하고 있습니다.
자 오늘의 정리는 이것으로 마치겠습니다.
오늘은 바쁜 일이 있어서 이렇게 저녁 늦게 올리게 되었는데 여러분들이 보실 때는 몇 시 일지 궁금하네요~~ ㅎㅎㅎ
다들 제 글 하나하나 읽어주심에 감사하고 또 감사합니다 그럼 다음 글에서 찾아뵙겠습니다~~
'개발 > C&C++' 카테고리의 다른 글
(C/C++ 속성 정리) 24일 차 : 객체지향 프로그래밍이란? (0) | 2020.07.20 |
---|---|
(C/C++ 속성 정리) 23일 차 : 분활컴파일 및 (0) | 2020.07.14 |
(C/C++ 속성 정리) 22일 차 : 함수포인터를 이용한 사칙연산 계산기 만들기 (0) | 2020.07.13 |
(C/C++ 속성 정리) 21일 차 : 함수포인터 (0) | 2020.07.12 |
(C/C++ 속성 정리) 19일 차 : 재귀 함수 및 2차원 배열 (3) | 2020.07.10 |
(C/C++ 속성 정리) 18일 차 : 리스트를 이용해서 성적표 만들기 및 설계 (0) | 2020.07.08 |
(C/C++ 속성 정리) 17일 차 : 성적표 만들기 및 설계 (0) | 2020.07.07 |
(C/C++ 속성 정리) 16일 차 : 메모리 관련 함수 (0) | 2020.07.06 |