본문 바로가기
IT/C++(CPP)

CPP 초급 강좌 20. C++ const reference

by 신림83 2020. 10. 30.
반응형

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를 사용하면 됩니다.

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가 좋다.

 

위와 같이 알고 쓰시면 좋습니다.

 

 

배우는게 쉽지 않아요...

 

반응형

댓글