여기서 &
에 주목해야한다. 이것이 참조 변수이다. 즉 포인터처럼 사용하는 경우인데, 동작 방법이 정말 포인터와 다를게 없다. 실제로 user가 위의 코드를 입력하여 작성해보면 바로 알게 된다.
이를 출력해보면 포인터 변수의 주소값만 다르게 나오는 것을 볼 수 있다. 포인터는 말그대로 참조의 역할만 하므로 따로 메모리를 갖게 된다. 하지만 참조 변수인 &
는 그 자신도 똑같은 value
의 메모리를 사용하는 것에 focus를 해야 한다. 헷갈릴수 있지만 여러번 해보면 쉽게 이해가 갈 것이다.
const를 사용하면 당연하게도 compile error을 발생시킨다. 이는 ref를 이용하여 y값을 바꿀 수가 있기 때문이다. 포인터도 이처럼 사용할 수가 없다. 그 이유는 같은 메모리 값을 같기 때문이다. 메모리 값이 같으므로 바꿀 수 있게 되면 문제가 생기므로 compiler가 절대 안된다는 error를 표출하는 것이다.
이 코드도 충분히 예측할 수 있다. 마지막 n값이 5가 나오는 이유는 함수의 n과 main문의 n은 다른 n이기 때문이다. 또한 박박우겨서 같다고 해도 다른 scope이므로 함수의 값이 사라진다.
뭐 어떻게든 바꾸고 싶다고 하면 이처럼 바꾸면 된다. 왼쪽의 경우 return 값을 main문에 넣어 사용하는 방법이 있고 오른쪽의 경우는 우리가 지금 배웠던 참조 변수를 사용하여 같은 출력을 내는 방법이 있다.
오른쪽이 제대로 출력되는 이유는 무엇일까?
우선 우리가 이를 포인터로 바꿔 출력하면 다음과 같다. 동일한 결과를 출력하지만 좀더 번거로운 것을 볼 수 있다.
performace 측면으로 보면 포인터보다 참조변수가 훨 좋은 성능을 보여준다. 그 이유는 포인터를 사용하면 포인터 변수자체를 복사를 해야 하는데, 참조 변수 같은 경우에는 원래 있던 값 그 자체를 사용하기 때문에 computation performace에서 좋은 성능을 보여준다.
보통 우리가 Struct를 사용할 때 main문에서 사용하는 방식으로 element에 접근을 하는데, reference variable를 사용하면 더욱 편리하다. 이처럼 여러번 사용하게 될 경우 reference variable을 이용하여 만들면 되어 아주 편리하다.
결론은 참조 변수와 포인터 변수는 동일한 역할을 하는 것이다. 결과는 다르지 않다. 다만 함수의 매개변수로 사용할 때에는 확실히 참조변수가 더 뛰어난 성능을 보여준다고 생각하면 될듯 하다.
또한 저렇게 사용할 수 없다고 말을 했다. 이는 참조 변수가 다른 변수의 주소를 공유하기 때문이라고 초반에 설명하였는데, 이를 뒤짚는 것이 하나 있다. 바로 const를 붙이는 것이다.
그렇다면 이 둘의 차이점이 도대체 무엇이냐 라고 생각할 수도 있다. 이 또한 함수의 매개변수로 넣을 때 엄청난 차이를 알게 된다.
결국에는 performance 차이와 값에 의한 전달이냐, 참조에 의한 전달이냐의 문제이다.
매개변수가 const in x
라면 이는 값에 의한 전달로써, doSometing(x)
를 호출할때, 변수 x값을 복사하여 doSometing(x)
의 x에 넘기는 것이다. 뭐 위에서 다 설명하긴 했지만, 그 차이가 가장 클 것이다. 따라서 const int x
만 사용하게 되면 main문으로 온전한 값이 들어올 수 없다.