참조

 

참조란 C++에 있는 문법으로써 기능적으로 포인터와 동일한 역할을 한다.

 

1-0 코드
1-1 코드 결과

1-0 이미지와 같이 포인터는 변수의 주소 값을 저장하고 해당 주소 값을 이용해서

주소 값 안에 데이터를 수정하거나 주소 값 자체를 조작할 수 있다.

 

이와 동일한 역할을 하는 '참조'는 로우 레벨 언어 측면에서 보면 포인터와 동일하게

해당 주소값을 받아서 원본 데이터를 수정하는 역할을 한다. 

 

하이 레벨 언어 측면에서 보면 포인터는 주소를 직접 저장하는 반면 참조는 특정 변수에 

별칭을 지어주는 느낌으로 이해하면 된다. 

 

다른 예시를 통해 좀 더 살펴보자.

 

2-0 코드
2-1 코드 결과

 

구조체 Info를 선언하고 초기값을 설정해주었다.

그리고 매개변수를 포인터로 선언하는 함수와 참조로 선언하는 함수가 존재한다는 것을

미리 선언해주었다.

 

메인 함수에서 Info 구조체를 이용할 qqq 변수를 선언하고

각 함수를 호출하면서 동시에 해당 함수에 의해 변화되는 qqq의 값을 확인하기 위해 출력문을 중간중간 넣었다.

함수를 호출할 때 포인터 매개변수를 가지는 함수는 주소값을 전달해주기 위해 & 타입을 앞에 붙여줬지만

참조는 &를 붙여줄 필요가 없기 때문에 변수를 그냥 매개값으로 넣어주었다.

 

이제 미리 선언했던 각 함수를 상세 정의해야 한다.

먼저 포인터 함수를 먼저 정의했고 간접 멤버 연산자(->)를 이용해 원본 데이터의 값을 각각 수정해주었다.

 

두 번째 함수인 참조 함수는 포인터와 똑같은 기능적 역할을 한다. 로우 레벨 측면에서 보면 

동일하게 해당 주소를 가져와서 원본 데이터를 수정하는 방식이다. 하지만 우리 눈에는(하이 레벨 언어 측면) 포인터보다

훨씬 간단하고 편하게 사용할 수 있다는 장점이 있다. 

 


주의할 점

 

참조는 보는 바와 같이 포인터와 동일한 기능 및 역할을 하고 포인터보다 훨씬 간편하고 쉽게 사용할 수 있다는

장점이 있지만 조심할 점은 포인터와 완벽히 동일한 것은 아니다. 

 

포인터는 아무런 값도 가지지 않고 존재할 수 있지만, 즉 NULL 값을 가질 수 있지만

참조는 무조건 특정 값을 가지고 있어야 한다. 

 

또한 코드를 잘 모르는 다른 사람이 보기에 참조는 원본 데이터를 수정하는지 아닌지 헷갈릴 수가 있다.

원치 않게 원본 데이터가 훼손될 수도 있다는 것이다.

 

이것의 해결방법으로는 상수 화가 있는데 여기서도 포인터와 차이점이 있다. 

 

포인터는 상수화 const를 * 앞에 붙이냐 뒤에 붙이냐에 따라 상수화가 달라진다. 

* 앞에 const가 붙었을 경우 해당 주소에 있는 원본 데이터가 상수화된다. 

* 뒤에 const가 붙었을 경우 해당 주소 값이 상수화 된다.

 

반면 참조 같은 경우 & 앞에 붙이는 것 밖에 할 수 없으며 원본 데이터가 상수화 된다.

 

둘의 비슷한 기능을 하기 때문에 실제로 둘 다 많이 사용되는 문법이다.

상황에 따라 융통성 있게 사용하면 좋을 것 같다.

 

 

+ Recent posts