본문으로 바로가기

[C++]참조자(reference) 2

category 프로그래밍/C++ 2017. 4. 9. 01:02
728x90
반응형

안녕하세요. 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 = &num;

  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++에서 새로 등장한 것이기 때문에 설명할 게 많습니다.


읽어주셔서 감사합니다.

728x90
반응형

'프로그래밍 > C++' 카테고리의 다른 글

[C++]new 와 delete, 그리고 C++의 헤더파일  (0) 2017.04.17
[C++]참조자(reference) 3  (0) 2017.04.11
[C++]참조자(reference) 1  (0) 2017.04.04
[C++]자료형 bool  (0) 2017.03.30
[C++]C++ 들어가기전에...  (0) 2017.03.28