참조자를 사용해 복사 피하기
함수의 인자 전달에서 크기가 큰 클래스타입이나 컨테이너 객체를 복사하는 것은 비효율적일 수 있다. 게다가 일부 클래스 타입은 복사할 수 없다. 복사할 수 없는 타입인 객체와 연산하려면 함수에서는 참조자 매개변수를 사용해야 한다.
bool isShorter(const string &s1, const string &s2)
{
return s1.size() < s2.size();
}
두 string
의 길이를 비교하는 함수를 만들 때, string
의 길이는 길 수 있기에 복사를 피하고 싶다면 매개변수를 참조자로 만든다.
가능하면 const에 대한 참조자를 사용한다.
함수에서 변경하지 않는 매개변수를 const
가 아닌 보통의 참조자로 정의하면 좋지 못하다. 함수를 호출하는 쪽에서는 그 함수에서 인자 값을 변경할 것으로 오해할 수 있다. 게다가 const
에 대한 참조자 대신 보통의 참조자를 사용하면 그 함수에 사용할 수 있는 인자의 타입을 심하게 제한하게 된다. 보통의 참조자 매개변수에는 const
객체나 상수, 변환을 해야 하는 객체를 전달할 수 없다.
bool isShorter(string &s1, string &s2)
{
return s1.size() < s2.size();
}
예를 들어, 위의 두 string
을 비교하는 함수에서 매개변수를 보통의 string&
로 정의했을 때를 보자.
isShorter("abcd", "abcdefg");
위 처럼 호출하면 컴파일을 실패한다. 보통의 참조자는 const
객체나 상수와 결합할 수 없기 때문이다.
또한, 매개변수를 const
에 대한 참조자로 정의한 다른 함수에서 이런 함수를 사용할 수 없다.
bool tempFunc(const string& str1)
{
string str2 = "abcd";
isShorter(str1, str2);
}
여기서도 isShorter
을 호출하면 컴파일을 실패한다. str1
은 const
string
에 대한 참조자이지만 isShorter
의 s1
은 보통의 string
에 대한 참조자이기 때문이다.
'C++ > 기억하고 싶은 거' 카테고리의 다른 글
[C++] const_cast (0) | 2023.05.27 |
---|---|
[C++] const에 대한 참조자와 포인터 (0) | 2023.05.17 |
[C++] namespace (0) | 2023.05.07 |