방프리
17.08.03. Effective C++ 1. C++에 왔으면 C++의 법을 따릅시다. (항목20) 본문
항목 20 : '값에 의한 전달'보다는 '상수객체 참조자에 의한 전달' 방식을 택하는 편이 대개 낫다.
보통 함수의 매개변수값으로 값을 전달할 때 이런 방식으로 많이 사용합니다.
void CheckStudent( Student s )
{
... // 학생인지 아닌지 확인하는 소스
}
흔한 C++ 기본 서적에서도 많이 사용하고 있고, 실제로도 많이 사용하고 있습니다.
이번 항목은 이 흔한 코드를 좀 더 최적화를 할 수 있게 만드는데에 목적이 있습니다. 바로 값 복사입니다.
무슨 값 복사라는 사람들을 위해 매개변수로 전달되는 Student 타입의 변수 s가 호출되는 과정을 알아보겠습니다.
int main(void)
{
Student m_cStudent;
CheckStudent( m_cStudent );
}
다음은 작성자가 임의로 작성한 코드입니다. CheckStudent Func에서 m_cStudent라는 변수를 매개변수로 받으면
즉각 m_cStudent라는 변수를 컴파일러가 복사를 합니다. 즉, Student 클래스의 복사생성자를 호출하는 것이죠.
Student의 생성자와 소멸자 한 번씩만 호출한다면야 상관은 없겠지만... 이 클래스의 내부에 선언되어 있는 모든
변수들의 데이터 타입 생성자를 한 번씩 더 호출한다는 것에 큰 의미가 있습니다.
막대한 양의 생성자 및 소멸자를 호출한다는 뜻이죠.
이러한 연산을 줄여보자라는 취지에서 나온 것이 바로 "상수객체 참조자에 의한 전달" 입니다.
값 복사 때 일어나는 불필요한 생성자, 소멸자의 호출을 생략하자는 것이죠.
참조자 자체를 호출하기 때문에 일단 내부적으로는 생성자, 소멸자를 호출할 필요가 전혀 없습니다.
좀 더 쉽게 설명하자면 CheckStudent() 함수가 매개변수를 사용할 때 m_cStudent의 사본을 사용하는 것이 아닌,
m_cStudent 객체 자체를 들고가기 때문입니다. 그렇기 때문에 굳이 불필요한 연산 단계를 생략하고
들어갈 수 있다는 것이죠.
또한 slicing problem(복사 손실 문제)도 해결이 가능합니다. 단일 클래스의 경우에는 상관이 없으나,
자식 클래스 등을 사용할 때 가장 신경써야 하는 부분이 데이터 잘림 현상인데 이미 셋팅 되어 있는
객체 자체를 들고가는 것이기 때문에 신경 쓸 필요가 전혀 없는 것이죠.
물론 값에 의한 복사를 사용해도 무리가 없습니다.
여러 상황이 존재하고 프로그래머는 그 상황에 맞추어 적절한 방법을 사용하면 되기 때문입니다.
이 책의 필자는 두 가지 방식으로 분류했습니다.
값 복사의 경우엔 기본제공 타입(int, double, short 등...), STL, 반복자, 함수 객체 타입에서만 사용하고
그 이외의 나머지는 상수객체의 참조자 타입으로 전달할 것을 적극 권장하고 있습니다
(심지어 값 복사를 사용하라는 목록들도 유지보수를 생각한다면 값 복사의 사용을 상수
객체의 참조자 타입으로 바꿀 것을 권장합니다.)
이것만은 잊지 말자!
* '값에 의한 전달' 보다는 '상수 객체 참조자에 의한 전달'을 선호합시다. 대체적으로 효율적일 뿐만 아니라
복사손실 문제까지 막아줍니다.
* 이번 항목에서 다룬 법칙은 기본제공 타입 및 STL 반복자, 그리고 함숫 객체 타입에는 맞지 않습니다.
이들에 대해서는 '값에 의한 전달'이 더 적절합니다.
'C++ > Effective C++' 카테고리의 다른 글
17.08.14. Effective C++ 1. C++에 왔으면 C++의 법을 따릅시다. (항목22) (0) | 2020.01.13 |
---|---|
17.08.07. Effective C++ 1. C++에 왔으면 C++의 법을 따릅시다. (항목21) (0) | 2020.01.13 |
17.07.26. Effective C++ 1. C++에 왔으면 C++의 법을 따릅시다. (항목19) (0) | 2020.01.11 |
17.07.21. Effective C++ 1. C++에 왔으면 C++의 법을 따릅시다. (항목18) (0) | 2020.01.09 |
17.07.18. Effective C++ 1. C++에 왔으면 C++의 법을 따릅시다. (항목17) (0) | 2020.01.09 |