[C++] 참조 (Reference)

Taeil Nam·2022년 10월 18일
0

C++

목록 보기
1/13
post-thumbnail

개념

  • 변수의 별칭을 만들어줌. (변수의 두번 째 이름을 만들어준다고 생각하면 됨)
  • "[자료형]& [별칭] = [변수 이름];" 형식으로 선언.
  • 포인터와 동작 방식이 동일하며, 문법 형식만 다름. (내부적으로 컴파일러가 포인터와 동일하게 동작)

예시

#include <iostream>

using namespace std;

int main()
{
    /*--------일반 변수--------*/
    int num = 1;	// 일반적인 변수 선언.
    int& ref = num; // 변수 num에 ref 라는 별칭을 만들어줌.

    cout << "========일반 변수========" << endl;
    cout << "num : " << num << endl; // num 값 출력.
    cout << "ref : " << ref << endl; // ref 값 출력. (ref는 num의 별칭이므로, num의 값이 출력됨.)
    cout << endl;
    cout << "num memory address : " << &num << endl;    // 변수 num의 메모리 주소 출력.
    cout << "ref memory address : " << &ref << endl;    // 참조 ref의 메모리 주소 출력.
    cout << endl << endl;


    /*--------구조체--------*/
    struct s_num    // 구조체 s_num 정의.
    {
        int a = 1;
        int b = 2;
    };
    struct s_num sNum;  // 구조체 변수 sNum 선언.
    struct s_num& sNum_ref = sNum;  // 구조체 변수 sNum에 sNum_ref 라는 별칭을 만들어줌. 

    cout << "========구조체========" << endl;
    cout << "sNum a : " << sNum.a << endl; // 구조체 멤버 a 값 출력. (구조체 변수 sNum 사용)
    cout << "sNum b : " << sNum.b << endl; // 구조체 멤버 b 값 출력. (구조체 변수 sNum 사용)
    cout << "sNum_ref a : " << sNum_ref.a << endl; // 구조체 멤버 a 값 출력. (참조 sNum_ref 사용)
    cout << "sNum_ref b : " << sNum_ref.b << endl; // 구조체 멤버 b 값 출력. (참조 sNum_ref 사용)
    cout << endl;
    cout << "sNum\t memory address : " << &sNum << endl;  // 구조체 변수 sNum의 메모리 주소 출력.
    cout << "sNum_ref memory address : " << &sNum_ref << endl;  // 참조 sNum_ref의 메모리 주소 출력.


    return 0;
}

결과

  • 참조하는 변수와 값 동일.
  • 참조하는 변수와 메모리 주소 동일.

장점

  • 함수 매개 변수로 사용시 Call By Reference로 동작.
  • Call By Value의 단점 커버. (함수 호출시 쓸데없는 복사 과정 제거)
  • 일반 변수처럼 사용 가능하여 편의성이 좋음. (특정 연산자 사용 불필요)

특징

  • 참조 선언시 무조건 초기화 필요.
  • 선언 후 값 변경 불가능.
  • nullptr 값을 가질 수 없음.

주의 사항

  • 함수의 매개 변수가 참조인 경우, 매개 변수의 값이 바뀌지 않는다면 const 를 적어줄 것.
  • 참조에 상수 값을 넣을 경우 const 를 적어줄 것.
  • 함수의 반환 자료형이 참조인 경우, 지역 변수를 반환하는지 확인할 것.
    - 지역 변수는 함수가 끝나면 사용되지 않는 메모리 주소이므로 반환하면 안됨!!

0개의 댓글