안녕하세요. letitkang입니다.
포스팅 시작해보겟씁니다!
벌써 주말중 하루가 지나갔네요 ㅠㅠ
'윤성우의 C++ 열혈강의' 를 보고 있습니다.
이전 강의에 이어서 참조자 2탄 준비했습니다.
1. 배열, 포인터 참조자
참조자를 배열에도 쓸수 있습니다. 아래의 소스로 한번 살펴보겠습니다.
===============================================================================================
참조자에 배열의 변수(배열요소)를 넣은 소스 코드 예제
==============================================================================================
1 #include <iostream>
2
3 using namespace std;
4
5 int main(void)
6 {
7 int arr[3] = {1, 3, 5};
8 int &ref1 = arr[0];
9 int &ref2 = arr[1];
10 int &ref3 = arr[2];
11
12 cout<<ref1<<endl;
13 cout<<ref2<<endl;
14 cout<<ref3<<endl;
15 return 0;
16 }
===============================================================================================
결과
===============================================================================================
1
3
5
===============================================================================================
위의 소스를 보면 배열 요소는 변수로 간주되어 참조자의 값으로 선언이 가능합니다.
넘어가겠습니다.
물론 배열이 된다면 포인터도 되겠죠?
포인터도 한번 살펴봅시다.
===============================================================================================
참조자에 포인터를 적용한 소스 코드 예제
==============================================================================================
1 #include <iostream>
2
3 using namespace std;
4
5 int main()
6 {
7 int num = 2;
8 int *ptr = #
9 int **dptr = &ptr;
10
11 int &ref = num;
12 int *(&pref) = ptr;
13 int **(&dpref) = dptr;
14
15 cout<<ref<<endl;
16 cout<<*pref<<endl;
17 cout<<**dpref<<endl;
18 return 0;
19 }
==============================================================================================
결과
==============================================================================================
2
2
2
==============================================================================================
포인터도 위와같이 쓰시면됩니다. 어려운 건 없습니다. 어렵나요? 조금만 살펴 보시면됩니다.
2. 참조자와 함수
이번에는 참조자와 함수에 대해서 이야기해보겠습니다.
그전에 Call-by-value와 Call-by-reference의 차이를 살펴보겠습니다.
아마 포인터할때 많이 들어보셨을거에요.
Call-by-value 값을 인자로 전달하는 함수의 호출방식.
->함수를 통하여도 인자의 값은 변하지 않는 방식입니다.
Call-by-reference 주소값을 인자로 전달하는 함수의 호출방식.
->함수를 통하면 인자의 값을 바뀔 수 있는 방식입니다.
이정도로 알아두시면 됩니다.
잘 모르신다면 아래에 제가 쓴 포스팅을 참고하시기 바랍니다.
http://letitkang.tistory.com/19
그러면 참조자가 갑자기 왜나왔나?
아래에서는 참조자를 이용한 Call-by-reference를 사용해보려고합니다.
===============================================================================================
참조자를 이용한 Call by refence 소스 코드 예제
==============================================================================================
1 #include <iostream>
2
3 using namespace std;
4
5 void SwapByRef(int &ref1, int &ref2)
6 {
7 int temp = ref1;
8 ref1 = ref2;
9 ref2 = temp;
10 }
11
12 int main()
13 {
14 int val1 = 10;
15 int val2 = 20;
16
17 SwapByRef(val1, val2);
18 cout<<"val1 : "<<val1<<endl;
19 cout<<"val2 : "<<val2<<endl;
20 return 0;
21 }
==============================================================================================
결과
==============================================================================================
val1 : 20
val2 : 10
==============================================================================================
인자를 참조자로 받기 때문에 함수 안에서도 인자들은 참조자의 변수를 나타내고 있습니다.
그러므로 함수안에서 값을 바꿀 수 있습니다.
결과값을 보면 값이 바꼈다는 것을 알 수 있습니다.
C++에서는 call-by-reference에서 주소값을 이용하는 방법과, 참조자를 이용한 방법이 존재합니다.
4. 참조자를 이용한 Call by reference와 Const 참조자
주소값, 즉 포인터를 사용한 Call by reference보다 참조자를 사용한 Call by reference가 실수나, 사용적인 면에서는 편리합니다.
그러나 소스 코드 분석 적인 측면에서 본다면 이야기가 달라집니다.
==============================================================================================
int num = 10;
Func(num);
cout<<num<<endl;
==============================================================================================
함수를 호출하는 부분을 보게되면 보통 함수의 특성을 알 수 있습니다.
그러나 위의 함수를 보면 이게 일반 변수를 인자로 한것인지, 참조자로 한 것인지 알 수 없습니다.
num값을 예측할 수도 없습니다.
이것이 단점 아닌 단점입니다.
이것을 해결하는 방법 중 하나가 Const 참조자입니다.
const 참조자를 쓰게되면, 인자의 값이 변경되지 않는다는 것을 알 수 있기 때문에, 값이 안 변한다는 것을 알 수 있습니다.
오늘의 포스팅은 여기까지 하겠습니다.
다음 포스팅에서 참조자에 대한 것들을 마무리하겟습니다.
아무래도 C++에서 새로 등장한 것이기 때문에 설명할 게 많습니다.
읽어주셔서 감사합니다.