본문 바로가기
컴퓨터/C++_STL

포인터, 참조, 값 형식에 관한 개인적 관례

by adnoctum 2014. 5. 9.




   함수를 만들 때 사용하는 매개변수의 형태를 포인터, 참조, 값 형식 중 어느 것을 사용할 것인가, 에 관한 개인적인 관례(convention) 를 설명하면 다음과 같다. 삶의 다른 많은 것이 그렇듯, 이 관례 역시 이러함을 지양하는 것일 뿐 반드시 이래야 하는 것은 아니다. 


   우선 두드러지는 특징은 포인터로 호출할 경우 함수 내부에서 그 값을 변경시킨다는 암묵적인 가정이 있고, 참조로 호출할 경우에는 함수 내부에서 그 값을 변경시키지 않는다는 가정이 존재한다. 따라서 참조를 이용하여 호출할 경우 const 지시자가 붙는 경우가 많다. 물론 포인터 역시 동일한 목적으로 사용할 수 있지만(const type const * ) 문법이 살짝 번거로워 이런 식으로 사용하지는 않는다. 이런 식의 구분을 이용하면 함수 호출 당시 넘겨 주는 매개 변수가 변경이 될 것인지 아닌지를 어느 정도 추정할 수 있기 때문에 기억해야 할 것이 적어지는 장점이 있다. 결과적으로 두 경우 모두 포인터로 넘기는 것이기 때문에 효율성은 말할 것도 없이. 


   값으로 넘기는 경우는 작은 크기의 변수나 함수 내부에서 어차피 복사본을 만들어 사용해야 하는 경우이다. 값을 넘기면 대개는 별다른 고민 없이 사용하게 되고, 따라서, 만약 함수 내부에서 여전히 값을 변경하지 않는다면 아무리 작은 변수라도 const & 형태로 넘기곤 한다. 


   포인터로 넘기는 것은 커다란 객체가 복사가 이뤄지지 않고 메모리만 넘어 가기 때문에 효율적인 반면 무효한 포인터가 넘어갈 수 있다는 위험이 존재한다. 참조로 넘길 경우 무효한 포인터가 넘어 갈 위험이 없는 동시에 포인터가 넘어 가는 것이기 때문에 포인터보다는 좀 안전하다. 값으로 넘길 경우 값의 복사가 이뤄지므로 커다란 객체인 경우 약간의 추가작업이 수행된다는 단점이 있다. 따라서 이들을 적절히 혼합하여 사용하는 것이다. 



   또다른 것 중 하나는 const 지시자는 될 수 있으면 자주 사용한다는 것이다. 매개변수로 넘길 때도 사용하고, 멤버 함수도 const 로 할 수 있으면 const 로 한다 - 이 경우 구조가 꼬이면 const 를 죄다 풀어줘야 하는 경우도 발생, >.<""


'컴퓨터 > C++_STL' 카테고리의 다른 글

bind1st 와 bind2nd  (2) 2014.12.17
포인터에 대한 짤막한 이야기  (2) 2014.04.02
파일 읽기 편하게 하기  (0) 2013.05.01
const pointer  (0) 2011.11.23
isnan과 isinf  (0) 2010.12.06