본문 바로가기

Programming/C/C++

reference와 pointer의 차이

레퍼런스와 포인터가 값을 복사하여 사용하는 call-by-value 방식이 아닌, 직접 해당 변수에 접근하여 값을 사용하는 call-by- reference 방식이라는 점에서 비슷하다.

이 둘이 서로 어떻게 다른가 하면 포인터는 해당 변수의 주소값을 저장하여 해당 주소값에 있는 변수의 값에 접근하는 방식이고, 레퍼런스는 해당변수에게 새로운 이름을 부여한다고 생각하면 된다.


위 그림을 보게되면 a라는 정수형 변수와 rA라는 레퍼런스의 주소값이 서로 같다는 것을 알수가 있다.

이 것은 0x00bdfa38이라는 주소에 정수형의 변수 a가 0으로 초기화 되었고, rA라는 다른 이름을 받았다고 해석 할 수 있는 것이다.

포인터를 사용하는 경우 잘못된 사용을 통해서 잘못된 주소를 가리켜 에러를 발생 시키는 경우가 종종 있는데  레퍼런스의 사용을 통해 사용하고자 하는 변수 이외의 값에 접근 하는 것을 방지 할 수있다.

또 하나의 포인터형 변수를 선언하는데 4byte(64bit 컴퓨터에서는 8byte)의 메모리 공간을 필요로 하지만, 레퍼런스의 경우 해당 주소에 또다른 이름을 주는 것이기 때문에 메모리 부분에서도 장점이 있다.

함수에서 레퍼런스를 사용하는 경우 포인터를 사용하는 것과 유사하게 사용하면 되는데, 인수를 입력할 때 주소값이 아닌 변수를 넣어주면 된다.


다음과 같이 레퍼런스를 리턴하는 함수 또한 사용할 수 있는데 정수형 변수 a에 tA라는 이름을 붙여주고 증가연산을 한 후 함수가 종료 되면 tA라는 이름은 소멸이 된다고 보면 된다.

레퍼런스를 리턴하는 함수의 경우 함수 내부의 변수를 레퍼런스로 리턴하는 경우 함수의 호출이 끝나면서 변수가 소멸되기 때문에 원하는 값을 얻을 수가 없다.

레퍼런스를 리턴하는 함수를 사용할때에는 주의가 필요하다.

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

클래스와 static  (0) 2015.01.15
클래스와 const  (0) 2015.01.15
복사생성자와 얕은복사  (0) 2015.01.15
friend 선언  (0) 2015.01.14
class의 정보은닉과 캡슐화  (0) 2015.01.13