..

Search

38) 참조자

38) 참조자

참조자


참조자(reference)

C++에서는 특정 변수의 실제 이름 대신 사용할 수 있는 참조자(reference)라는 새로운 기능이 추가되었습니다.

이러한 참조자는 크기가 큰 구조체와 같은 데이터를 함수의 인수로 전달해야 할 경우에 사용할 수 있습니다.

또한, C++의 클래스(class)를 설계할 때에도 자주 사용됩니다.


참조자의 선언

C++에서 참조자는 다음과 같은 문법으로 선언합니다.

문법

int 변수이름;               // 변수의 선언

int& 참조자이름 = 변수이름; // 참조자 선언

 

이때 & 연산자는 주소 연산자가 아닌 타입을 식별하기 위해 사용하는 식별자로 사용된 것입니다.

즉, int&는 int형 변수에 대한 참조를 의미합니다.

이렇게 선언된 참조자는 대상 변수와 같은 메모리 위치를 참조하게 됩니다.

 

참조자를 선언할 때에는 다음과 같은 사항에 주의해야 합니다.

 

1. 참조자의 타입은 대상이 되는 변수의 타입과 일치해야 합니다.

2. 참조자는 선언과 동시에 초기화되어야 합니다.

3. 참조자는 한 번 초기화되면, 참조하는 대상을 변경할 수 없습니다.

 

다음 예제에서 참조자를 이용해 증가 연산을 수행하면, 참조 변수뿐만 아니라 대상 변수도 같이 변경됨을 알 수 있습니다.

예제

int x = 10; // 변수의 선언

int& y = x; // 참조자 선언

 

cout << "x : " << x << ", y : " << y << endl;

y++;        // 참조자를 이용한 증가 연산

cout << "x : " << x << ", y : " << y << endl;

cout << "x의 주소값 : " << &x << ", y의 주소값 : " << &y;

코딩연습 ▶

실행 결과

x : 10, y : 10

x : 11, y : 11

x의 주소값 : 0x7ffe6c0a1234, y의 주소값 : 0x7ffe6c0a1234


함수의 인수로서 전달

C++에서 참조자는 주로 함수에 인수를 전달할 때 사용됩니다.

함수가 참조자를 인수로 전달받으면, 참조자가 참조하고 있는 실제 변수의 값을 함수 내에서 조작할 수 있습니다.

 

다음 예제는 참조자를 사용하여 두 변수의 값을 서로 맞바꾸는 예제입니다.

예제

int main(void)

{

    int num1 = 3, num2 = 7;

    cout << "변경 전 num1의 값은 " << num1 << "이며, num2의 값은 " << num2 << "입니다." << endl;

    Swap(num1, num2);

    cout << "변경 후 num1의 값은 " << num1 << "이며, num2의 값은 " << num2 << "입니다." << endl;

    return 0;

}

 

void Swap(int& x, int& y)

{

    int temp;

 

    temp = x;

    x = y;

    y = temp;

}

코딩연습 ▶

실행 결과

변경 전 num1의 값은 3이며, num2의 값은 7입니다.

변경 후 num1의 값은 7이며, num2의 값은 3입니다.

 

위와 같은 참조에 의한 전달(call by reference)은 참조자뿐만 아니라 포인터를 사용해도 똑같은 결과를 얻을 수 있습니다.

포인터를 사용하는 방법과 참조자를 사용하는 방법 모두 결과는 같으며, 구문 형태상의 차이점만이 존재합니다.

 

C++에서 함수의 인수로 참조자를 사용하는 방법의 특징은 다음과 같습니다.

 

1. 함수 내에서 참조 연산자(*)를 사용하지 않으므로, 함수 내부의 코드가 깔끔하고 직관적이 됩니다.

2. 함수의 호출이 값에 의한 전달(call by value) 방법과 같은 형태가 되어, 코드를 읽기가 쉽지 않습니다.

 

따라서 간단한 함수에서는 굳이 참조에 의한 전달을 하지 말고 값에 의한 전달을 사용하는 것이 좋을 수 있습니다.

또한, 참조 호출이 꼭 필요할 때에는 참조자보다는 포인터를 사용하는 것이 더욱 직관적일 수 있습니다.

 

C++에서 참조자는 크기가 큰 구조체나 클래스를 다룰 때에만 사용하는 것이 좋습니다.


구조체의 참조

C++에서 참조자는 주로 구조체와 같은 사용자 정의 타입을 다룰 때 유용하게 사용됩니다.

구조체를 참조하는 방법은 변수를 참조하는 방법과 같습니다.

 

예제

struct Book

{

    string title;

    string author;

    int price;

};

 

void Display(const Book&);

 

int main(void)

{

    Book web_book = {"HTML과 CSS", "홍길동", 28000};

    Display(web_book);

    return 0;

}

 

void Display(const Book& bk)

{

    cout << "책의 제목은 " << bk.title << "이고, ";

    cout << "저자는 " << bk.author << "이며, ";

    cout << "가격은 " << bk.price << "원입니다.";

}

코딩연습 ▶

실행 결과

책의 제목은 HTML과 CSS이고, 저자는 홍길동이며, 가격은 28000원입니다.

 

위의 예제처럼 함수 내부에서 구조체를 직접 변경할 필요가 없을 때는 const 키워드를 사용하여 원본 구조체에 대한 변경을 허용하지 않는 것이 좋습니다.


연습문제