。공부 。

<C++> 레퍼런스

kyoe 2007. 11. 25. 18:03
레퍼런스를 이용해 메모리공간을 좀더 효율적으로 사용할수 있다.
레퍼런스를 간단히 설명하자면 할당된 메모리 공간에 또하나의 다른이름을 붙인다고 생각하면 쉽다 만들어진 레퍼런스 변수는 일반변수와 똑같이 사용된다.
레퍼런스 선언방법과 사용방법을 알아보자

* 레퍼런스 선언 *
int main(void){    
    int val=10;
    int &ref=val;    //변수 val에 또다른 이름을 붙인다.(레퍼런스선언)

    val++;
    cout<<val<<endl;
    cout<<ref<<endl;

    ref++;            //ref를 증가시키면 val의 값도 변한다.val=ref
    cout<<val<<endl;
    cout<<ref<<endl;
    return 0;
}
레퍼런스 변수를 만들기 위해선 만들고자하는 변수앞에 '&'을 붙여주기만 하면된다.
만들어지고 난뒤엔 일반변수와 사용방법이 같다.

* 레퍼런스를 이용한 Call-By-Reference *
void swap(int &x,int &z){    //값을 레퍼런스로 받아 'a'란변수에 'z'란이름을 더붙인다.
    int temp;
    temp = x;
    x = z;
    z = temp;
}

int main(void){
    int a,b;
    a = 10;
    b = 20;

    swap(a,b);    //a,b의 값을 넘긴다.
    cout<<a<<':'<<b<<endl;
    return 0;
}
레퍼런스를 이용해 변수 a와b의 값을 서로 바꾸는 예제이다. 포인터로도 예제를 구현할수있지만 레퍼런스로 구현하는것이 좀더 깔끔해보인다. 하지만 메인함수의 swap(a,b); 이부분말 봐선 이함수가  Call-By-Reference 방식인지 Call-By-Value방식인지 구분할수가 없다. 포인터로 처리를 했다면 swap(&a,&b); 이렇게 변수앞에 '&'을 붙여줘서 어떤방식인지 확인 가능하지만 레퍼런스를 그렇지 못하다. 그렇다고 레퍼런스가 나쁘다는건 아니다.^^;

* 레퍼런스 리턴 *
int& reference(int &a){
    a++;
    return a;
}

int main(void){
    int kyoe1 = 10;
    int &kyoe2 = reference(kyoe1);
    cout << kyoe2<<endl;
    return 0;
}
reference()함수에서 값을 리턴할때 레퍼런스를 리턴하를것을 볼수있다. 레퍼런스를 리턴할때 리턴데이터를 받아주는 곳에선 반드시 레퍼런스로 받아줘야 한다. 만약 메인함수에선 레퍼런스변수 선언을 하는데 reference()함수에서 데이터를 리턴할때 'int&'로 리턴하지않고 일반'int'로 리턴을하면 에러가 발생한다. 'int'형으로 리턴을 하게 되면 int &kyoe2 = 11; 이렇게 선언이되는것과 같기때문이다 레퍼런스를 상수로 초기화할수없기때문에 에러가 발생하게 되는것이다.