본문 바로가기
언어/C++

[C++ 기본 공부정리] 12. 참조 변수(reference variable)

by 민-Zero 2019. 12. 23.

공부 내용을 정리하는 목적 이므로 참고용으로만 읽어 주시기 바랍니다.

틀린 부분에 대한 지적은 감사합니다.

일반 변수 : 값을 저장하기 위해 메모리에 공간을 할당받아 직접 저장하는 변수

포인터 변수 : 다른 변수의 주소 값을 저장하는 변수

두 변수에 이어 C++에서 제공하는 세 번째 변수 타입인 참조(reference) 변수는 한 객체가 다른 객체를 연결하는 수단이다. 즉, 다른 객체나 값에 대한 별명으로 사용한다고 생각하면 된다. 크기가 큰 객체를 함수에 인수로 전달할 때 주로 사용한다.

 

1. 참조 변수 선언

문법) 자료형& 참조 변수명 = 변수명;

여기서 사용되는 &(앰퍼샌드) 기호는 포인터에서 사용하던 변수의 주소값을 저장할 때 사용하던 주소 연산자로 쓰인 것이 아니라 타입을 식별하기 위한 식별자로 사용된다. 즉, 주소가 아닌 참조를 뜻한다. 따라서 참조 변수는 저장하는 변수와 같은 메모리를 참조하게 된다.

 

참조 변수를 사용하면 대상 객체와 동일한 곳을 참조하는 별명과도 같은 역할이기 때문에 참조 변수는 참조 대상과 동일한 값을 가진다.

 

참조 변수의 값을 변경하면 일반 변수또한 같이 변경되고 일반 변수의 값을 변경하면 참조 변수의 값 또한 변경되는 것을 확인할 수 있다.

주소 연산자를 이용하여 주소값을 확인해보면 동일한 메모리를 참조하는 것을 확인할 수 있다.

 

참조 변수를 사용할때 주의할 사항이 있다.

 

① 참조 변수는 선언과 동시에 초기화하여야 한다.

② null 값을 저장할 수 있는 포인터와 다르게 null을 참조할 수 없다.

③ 참조하려는 변수와의 데이터 타입을 일치시켜야 한다. 또한 const로 선언된 변수는 const로 non-const는 non-const로만 참조할 수 있다.

④ 한번 참조한 변수는 재참조 불가능하다.

 

2. 함수의 매개변수로 활용

참조 변수를 매개변수로 사용하면 인수의 별명으로 이용된다. 그렇게 되면 동일한 메모리를 참조하기 때문에 값의 복사가 이루어지지 않아 크기가 큰 객체를 함수의 인수로 전달할 때 사용하면 복사하는데 드는 비용을 줄여 성능을 향상할 수 있어 자주 사용한다. 또한 포인터를 매개변수로 사용하여 역참조를 통해 원본 데이터를 수정할 수 있는것 처럼 참조 변수를 매개변수로 사용하면 값의 복사가 아닌 인수로 전달된 원본 데이터와 동일한 메모리를 참조하므로 원본데이터 수정이 가능하다.

 

두 값을 교환하는 함수에 참조 변수를 매개변수로 사용하여 제작하였다. 인수에 x, y가 전달되면 매개변수 a, b가 x, y에 대한 참조로 선언되어 직접 x, y의 값의 교환이 가능해진다.

 

함수 매개변수에 구조체와 같은 사용자 정의형을 사용한다면 참조를 통해 쉽게 접근할 수 있다.

3. 포인터와 참조 변수

참조형 변수는 접근할 때 역참조 포인터와 같은 역할이다. 내부적으로도 참조 변수를 사용할 때 컴파일러는 포인터를 이용하여 접근한다.

따라서 *ptr과 ref는 동일하게 취급된다. 또한 참조형 변수는 선언과 동시에 초기화되어야 하고 null로 초기화하거나 참조를 변경할 수 없으므로 포인터보다 안전하게 취급받는다.

댓글