Ch 08. 참조 - 01. 참조(Reference)

2025. 4. 16. 19:16Programming Language/C++

반응형

1. 참조 (Reference)

C++에서 참조(reference)란 변수에 별명을 붙이는것, 즉 다른이름으로 같은 메모리를 가리키는 방법이다

 

2. 사용법

참조, 레퍼런스를 사용하는 방법은

int num = 10;

이라는 변수가 존재할때 

int& rfnum = num;

과 같이 타입과 변수명 사이에 &연산자를 붙여주면 선언이 가능하다.

 

포인터와는 달리 우항의 변수에는 &를 붙이지 않고 변수명 그대로 사용하고 * 대신 &를 붙여서 선언을 하면 된다.

이렇게 코드를 작성해서 출력해보면

이렇게 결과를 출력하는 것을 볼 수 있다.

 

이때 레퍼런스를 사용해서 값을 변경하면

이렇게 바라보던 변수 num의 값도 변경되는 것을 볼 수 있다.

 

1) 레퍼런스는 초기화할때 넣은 변수 외에는 다른 변수를 바라보게 할 수 없다

레퍼런스는 초기화한 변수외에 다른 변수를 바라보게 만들수 없다.

이렇게 사용하더라도 num1의 값을 초기화할때 바라보면 num에 넣어주게 되지 바라보는 대상이 변경되지 않는다.

 

그렇기 때문에 레퍼런스를 선언할때에는 무조건 초기화를 하면서 선언이 되어야한다.

이런 사용은 불가능하다.

 

2) 레퍼런스에 const를 붙이는 경우 레퍼런스를 통해서 값의 변경이 불가능 하다

레퍼런스에 const를 붙여서 선언하는 경우

바라보는 변수인 num의 값은 num을 통해 변경이 가능하나

레퍼런스를 통해서 num의 값을 변경하는 것은 불가능해진다.

 

 

*예외적으로 레퍼런스는 상수를 초기화할 수 없으나

const를 붙이면 가능하게 된다.

 

3) 대부분 타입에 대해서 레퍼런스가 가능하다.

이렇게 vector에 대해서로 레퍼런스가 가능하다

물론 포인터도 가능하다

레퍼런스의 경우는 내부 멤버의 사용에 대해서는 기본 포인터와 동일한 방법을 사용하면 되나

포인터의 경우는 객체의 멤버에 접근하기 위해선 -> 표기법을 사용해서 접근해야 한다(주소값이라서).

아니면

이렇게 접근하는 방법도 있다.

 

4) 포인터 처럼 주의해야할 점 : 뎅글링 레퍼런스

레퍼런스 또한 해제된 대상에 대해서 레퍼런싱하고 있다면 뎅글링 레퍼런스가 될 수 있기 때문에 

해제 이후에 레퍼런스를 사용하지 않도록 유의해야한다.

 

5) 레퍼런스와 완전 흡사한 포인터

레퍼런스의 경우는 처음 초기화한 변수 외에 다른 변수를 바라보도록 변경할 수 없다.

 

반면 포인터의 경우는 바라보는 대상을 원하는 시점에 아무때나 변경이 가능하다.

이 포인터와 레퍼런스를 비슷한 느낌으로 만들어주려면 포인터에 const를 * 연산자와 변수명 사이에 넣어주면 

이렇게 바라보는 대상을 변경하지 못하게 되기 때문에 레퍼런스와 동일하게 대상은 변경할 수 없으나 바라보는 대상의 값은 바꿀 수 있게 된다.

 

이런 방식을 어셈블리어로 변경해보면

아예 레퍼런스랑 * 와 변수명 사이에 const가 들어간 포인터와 결과가 아예 동일한것을 볼 수 있는데 이는 결국 레퍼런스가 내부적으로는 포인터로 구성된다는것을 알 수 있다.

 

그냥 조금 쓰기 편하게 만들어놓은 포인터가 레퍼런스라고 생각해주고 넘어가면 될듯 싶다

반응형

'Programming Language > C++' 카테고리의 다른 글

Ch 09. 함수 - 02. 재귀 함수  (0) 2025.04.16
Ch 09. 함수 - 01. 함수의 기본  (0) 2025.04.16
Ch 07. 포인터 - 07. std::vector  (0) 2025.04.15
Ch 07. 포인터 - 06. void pointer  (0) 2025.04.15
Ch 07. 포인터 - 05. nullptr  (0) 2025.04.15