<개인공부>/[C++]

[C++] 레퍼런스, Reference, 참조자

사용자 BlockDMask 2017. 9. 23. 15:34
반응형

안녕하세요

BlockDMask 입니다.

오늘은 C++의  참조자(Reference)에 대해서 알아보도록 하겠습니다. 



0. 레퍼런스(Reference)란?

참조자(Reference)는 변수에 "별명"을 붙인다고 합니다.


"별명"을 통해서 변수의 메모리 공간에 접근이 가능니다.


참조자(Reference) 이름 앞에 "&" 를 붙여서 선언합니다.


참조자(Reference)는 변수에 대해서만 선언이 가능하고, 선언과 동시에 누군가를 참조 해야만 합니다.


참조자(Reference)는 참조의 대상을 바꾸는 것이 불가능 합니다.


참조자(Reference)는 NULL 로 초기화 하는것이 불가능 합니다.


int type 변수 a 를 가리키는 int type의 참조자 ref를 선언해 보겠습니다. 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>
 
using namespace std;
int main(void){
    
    int a = 10;
    int &ref = a;
 
 
    cout << a << endl;
    cout << ref << endl;
 
    return 0;
}
cs




오랜만에 손으로 그림을 그려보겠습니다. 


이런식으로 int형 변수 a를 가리키는 ref 라는 참조자가 생겨납니다.
이걸이제 언제 어떻게 사용하는지 아래에서 살펴 보겠습니다.

1. 레퍼런스(Reference) 사용법.


참조자, 레퍼런스와 변수

참조자(Reference)가 가지고 있는 값을 변경하면 원래 있던 변수의 값이 변경됩니다


참조자, 레퍼런스와 함수

참조자를 함수의 매개변수로도 사용이 가능합니다. (Call by reference)
제가 생각했을때는 이점이 참조자의 좋은점 인 듯 합니다.
C에서 포인터로 Call-by-Reference 처리를 했다면, C++에서는 참조자를 통해서 Call-by-Reference 처리를 합니다.



>> C언어의 Pointer 로 구현한 swap 예제



>> C++의 Reference 로 구현한 swap 예제






2. 참조자(Reference) 사용 예시



예시를 어떻게 들까 했는데 그래도 문제를 풀면서 실제로 써보는 게 좋을거 같아서,,,,,,,
"여기서 꼭 참조자(Reference)를 써야한다"는 아니지만 그래도 적용 할 수 있는 문제를 찾아서 풀어보았습니다.



백준 1427번 소트인사이드 입니다.

숫자가 주어지면 내림차순 으로 정렬 하는 간단한 문제입니다.

이 문제를 버블소트와 reference 문법(swap 할때)을 활용해서 풀어보겠습니다.

reference를 사용하는 것을 보여주고 싶어서, stl의 sort 함수를 사용하지 않았습니다. 

다른 풀이는 [여기] 있습니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
 
 
//reference를 이용한 call-by-reference
void Swap(int &num1, int &num2){ 
    int tmp;
    tmp = num1; //변수 사용하듯 사용하면 됩니다.
    num1 = num2;
    num2 = tmp;
}
 
//BubbleSort
//int *(&arr) : 배열을 reference를 통해서 call by reference 하는 법(= 포인터를 참조자로 참조하는법)
void BubbleSort(int *(&arr),int len){ 
    for(int i=0; i<len-1; i++){
        for(int j=1; j<len -i; j++){
            if(arr[j] > arr[j-1]){ //내림차순
                Swap(arr[j], arr[j-1]);
            }
        }
    }
}
 
void Solution(string & str){
    int len = (int)str.length();
    int * arr = new int[len];
 
    //string으로 받은 문자열의 인자를 int type의 배열에 하나씩 넣어줍니다
    for(int i=0; i<len; i++) {
        arr[i] = str[i] -'0';
    }
 
    BubbleSort(arr, len);
 
    for(int i=0; i<len; i++){
        cout << arr[i];
    }
 
    delete []arr;
}
 
 
int main(void){
 
    string str;
 
    cin>>str;
    Solution(str);
 
    return 0;
}
cs


반응형