본문 바로가기
공부/C, C++

[C/C++] Class (3) - 레퍼런스 변수

by 김샤랑 2022. 3. 22.

[C/C++] Class (3) - 레퍼런스 변수


목차

1. struct 사용의 변화

2. 접근 제한자 (private, protected, public)

3. private vs public

4. class란

5. class 초기화 문법

6. 멤버 함수

7. 레퍼런스 변수


드디어 클래스 포스팅의 마지막 목차이다.

레퍼런스 변수에 대해서 잘 설명할 수 있을지 걱정이 되지만 내가 배운 것을 토대로 포스팅을 작성하였다.

아직 문법을 배우는 중이라 더 나은 설명을 모르겠는데 공부하다가 더 이해를 도울 수 있는 방법이 생각나면,

후에 포스팅을 수정하겠다.

 

모두 공부 힘냅시다! :) 


- 원하는 상황 가정

먼저 레퍼런스 변수를 배우기 앞서서 다음 상황을 가정해보자.

1. 나는 CMy라는 클래스를 만들었다.
2. 객체로는 CMy c1; CMy c2; 가 있다.
3. c1 = c2를 하고 싶다. (c2의 것들을 c1에 넣겠다는 것)

 

Q: 내가 만든 자료형에서 대입 연산자(=)로 하고 싶은 것을 컴파일러가 어떻게 이해할까??

A: 이 질문의 해답을 위한 것이 레퍼런스이다.

 

포스팅을 이어가며 질문의 답을 생각해보자.


사실 이 기능은 다음과 같이 작성할 수 있다.

//대입 연산자 (이건 내가 만들지 않아도 클래스 내에 자동으로 생성되긴 한다.)
CMy& operator = (const CMy& _Other)
    {
        m_i = _Other.m_i;
        m_f = _Other.m_f;

        //return *this; //생략
    }

 

이게 무엇이냐??

위 코드에 대해서 차근차근 알아보자.  


-코드 해석

1. CMy&

자료형 뒤에&을 쓰면 참조형이 된다.

반환 타입을 객체 본인을 참조해서 주겠다는 뜻이다.

 

2. operator = 

이 클래스에서 = 이 발생했을 때, 호출된다는 뜻이다. (c1 = c2 할 때 호출되겠죠?)


7. 레퍼런스 변수

참조형이라는 말을 썼는데 이것이 무엇이냐...

레퍼런스들이 *붙는 것도 있고 &가 붙는 것도 있는데 한번 정리를 해보자.

 

  • 자료형 *변수명;  -> 포인터 변수 선언
  • *포인터 변수;      -> 포인터로 주소 역참조
  • &변수;             -> 변수의 주소 값
  • 자료형& 변수명; -> 레퍼런스 변수 선언

우리는 기존에 포인터를 다음과 같이 사용해왔다.

int a = 10;

int* const p =&a; //주소를 받아와서 역참조 해서 수정
*p = 100;

 

이제 오늘 배운 레퍼런스 변수를 사용하면 위의 상황을 다음과 같이 바뀔 수 있다.

int& iRef = a; //iRef가 a를 참조해서 iRef를 수정하는 것이, 곧 a를 수정하는 것
iRef = 100;

 

컴파일러 입장에서는 레퍼런스와 포인터는 똑같은 기능이다.


Q: 그렇다면 레퍼런스 변수를 왜 쓰는 것일까?

A: 사용자는 더 편리하다. 호출 자체 방식의 변화.

 

장점

  • 주소 연산의 실수를 막을 수 있다. (잘못된 주소 접근 방지)
  • 레퍼런스는 역참조에 대한 연산을 안 해도 된다.

기능

  • 포인터와 유사
  • 원본을 참조한다
  • 참조 변수를 통해서 직접적으로 원본을 수정할 수 있다. (역참조 할 필요 x)

- 생각의 흐름 정리

마지막으로 흐름을 정리했다.

1. 내가 원하는 기능의 연산을 했을 때(위의 예시 같은), 함수를 호출해라.
2. 기본 자료형(int, float...) 들은 컴파일러가 알고 있지만, 내가 만든 자료형은 컴파일러가 연산자를 어떻게 받아들여야 할지 모른다.
3. 내가 직접 기능을 만들어준다!
4. 사실 코드에선 연산기호를 썼지만 함수를 호출하는 방식 -> 클래스 연산자 오버 로딩(내가 만든 클래스에 연산자가 호출됐을 때 다음 기능을 해달라)
5. 그 함수는 위에 작성!
6. 그때 필요한 레퍼런스 변수에 대해서 알아봤다.

 


- 추가적인 const 응용

// 1. 포인터
const int* const p2 = &a;
//*p2 = 10; //error const는 수정할 수 없음.

// 2. 레퍼런스
//수정도 못하고 다른 것도 참조를 못함.
const int& iRefConst = a;
//iRefConst = 10; //error const는 수정할 수 없음.

 

 

 

댓글