본문 바로가기
프로그래밍 언어/cpp

[C++] 레퍼런스(reference)와 클래스 연산자(operator)

by TyT. 2023. 2. 10.
반응형

레퍼런스(reference)

레퍼런스는 포인터와 비슷한 개념이다. 자바에서는 포인터가 없는 대신 레퍼런스 개념만 존재하는데 c++에서 레퍼런스도 자바의 레퍼런스랑 비슷한 개념이다.

레퍼런스는 단어 뜻 그대로 참조라고 생각하면 되는데, 포인터의 역참조를 기호없이 사용한다고 봐도 된다.

int a = 1;
int& r = a;
r = 2; // a: 2, r: 2

위와 같은 코드를 포인터로 변경하면 다음과 비슷하다고 볼 수 있다.

int a = 1;
int* const p = &a;
*p = 2 ; // a: 2, *p: 2

레퍼런스는 윈도우의 '바로가기'개념과 비슷하다고도 생각 할 수 있겠다.

레퍼런스 r은 처음에 초기화할때 a를 레퍼런스타입으로 받고, 이후에 r은 호출될때마다 직접적으로 a로 연결이 된다고 생각하면 된다.

포인터로 변환한 코드에서는 const를 사용하여 포인터변수를 상수화 하였는데, 레퍼런스가 처음에 초기화할때 이외에 참조하는 변수를 바꿀수 없기 때문에 const를 사용하였다. 또, 포인터는 역참조를 위해 *p를 사용하지만 레퍼런스는 별다른 기호없이 r로 호출하면 된다는 점이 다르다.

클래스 연산자와 레퍼런스

c++에선 클래스에 연산자를 만들 수 있다.

MyClass &operator=(const MyClass &_Other)
    {
        this->a = _Other.a;

        return *this;
    }

위와 같이 반환타입 operator 연산자(파라미터){}형식으로 작성하면 된다.

  • 클래스 연산자와 레퍼런스 예제
#include <stdio.h>

class MyClass
{
public:
    int a;

public:
    MyClass()
        : a(1)
    {
    }
    MyClass &operator=(const MyClass &_Other)
    {
        this->a = _Other.a;

        return *this;
    }
};

int main()
{
    MyClass a, b, c;
    b.a = 10;
    a = b = c;

    printf("a.a: %d\nb.a: %d\nc.a: %d\n", a.a, b.a, c.a);

    return 0;
}

클래스 연산자'='에 리턴값이 있는 이유는 'a = b = c'와 같이 연속적으로 연산이 가능하게 하기 위해서 이다. 리턴값을 지우고 코드를 실행해 보면 컴파일 오류가 생기는 것을 알 수 있다.

위 코드를 읽어보고, 레퍼런스와 클래스 연산자의 개념에 유의해서 결과값을 예상해 보자.

반응형

'프로그래밍 언어 > cpp' 카테고리의 다른 글

[C++] namespace와 입출력(cin, cout)  (0) 2023.02.12
[C++] 클래스 템플릿  (0) 2023.02.11
[C++] 클래스 기초와 생성자, 소멸자  (0) 2023.02.08
[C++] 함수 포인터  (0) 2023.02.08
[C++] void* 보이드 포인터  (0) 2023.02.08