CPP 초급 강좌 20. C++ const reference
아래 코드를 먼저 봅시다.
class Point
{
public:
float x = 0.0f;
float y = 0.0f;
};
void f(Point p)
{
}
int main()
{
Point p;
f(p);
}
Point 란 클래스를 정의하고 생성하고 f 함수에 인자로 넘기는 코드입니다.
f(p) 에서 인자로 넘어가는 순간에 대한 이야기 입니다.
f(point p) 함수 안에서 p는 call by value에 의한 호출입니다. 즉 객체는 복사되어 존재합니다. 내부에서 p의 맴버들에 대한 x,y에 대한 수정이 가능하지만 이 x,y 값은 main 함수에서 인자로 넣었던 p값에 영향이 없습니다.
코드를 보죠.
void f(Point p)
{
p.x = 100.0f;
p.y = 100.0f;
}
int main()
{
Point p;
f(p);
cout << p.x << " " << p.y << endl;
}
레퍼런스 타입으로 변경
p가 전달될 때 객체가 복사가 되어 사용되는 것은 의도에 따라 맞는 경우가 있겠지만, 복사된 값을 사용할 필요가 없는 경우도 있습니다.(더 많을 거라 생각합니다.) 레퍼런스를 이용하여 수정해보겠습니다.
void f(Point& p)
{
p.x = 100.0f;
p.y = 100.0f;
}
int main()
{
Point p;
f(p);
cout << p.x << " " << p.y << endl;
}
void f(Point& p) 해당 코드만 수정되었습니다. 래퍼런스 타입을 통한 인자전달을 하면 해당 값은 해당 객체에 대한 이름이 하나 더 생겼을 뿐 추가적으로 객체가 복사 생성되지 않습니다. 성능상 분명 좋아 보입니다. 하지만 문제점은 이름을 하나 더 준 것이기에 내부에서 값 수정이 가능하다는 것입니다. 이걸 바랄 수 도 있겠지만, 순수하게 인자로만 바라봤으면 하는 사용용도 또한 원할수 있습니다. 이럴 경우에는 const를 사용하면 됩니다.
void f(const Point& p)라고 f 함수를 수정하였습니다. 컴파일단계에서 값 수정에 대한 접근에 대한 방지가 됩니다. 해당과 같은 인자전달 용도는 분명 사용하실 곳이 많을 것입니다.
정리해보면
call by value 의 인자전달은
복사된 객체가 생성된다. 복사본이라 변경해도 원본에 영향이 없다. 하지만 복사를 통한 오버해드가 존재한다.
call by reference 를 통한 인자 전달은
복사본을 만들지 않는다. 원본처럼 사용이 가능하고, 원본의 값 변경이 된다.
call by reference const(const reference) 를 통한 인자 전달은
복사본을 만들지 않는다. 내부에서 해당 인자의 값 수정을 할수 없다.
로 정리할수 있겠내요, 용도에 맛게 사용하시면 됩니다.
인자 전달 시, 내부에서 값 변경이 없다면 그럼 항상 const reference를 사용하면 되는 걸까요?
꼭 그렇지마는 안습니다. 아쉽게도...
여러 가지 이슈가 있습니다. 좀 쉽게 정리하자면,
primitive type : int,float,double 등 시스템이서 정의한 타입은
call by value 가 성능이 더 좋습니다.
user define type : 사용자가 정의한 객체, 클래스, 스트럭쳐 등은
const reference가 좋다.
위와 같이 알고 쓰시면 좋습니다.
'IT > C++(CPP)' 카테고리의 다른 글
CPP 초급 강좌 22. C++ Explict type conversion(casting) (6) | 2020.11.01 |
---|---|
CPP 초급 강좌 21. C++ reference return, rvalue reference && (0) | 2020.10.31 |
CPP 초급 강좌 19. C++ 레퍼런스 reference (6) | 2020.10.29 |
CPP 초급 강좌 18. C++ if init, if constexpr, rang for (4) | 2020.10.28 |
CPP 초급 강좌 17. C++ 람다표현식 lambda expression (22) | 2020.10.27 |
댓글