방프리
17.10.23. Effective C++ 5. 구현 (항목26) 본문
항목 26 : 변수 정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자
- 하나의 변수를 호출하면 반드시 그 변수를 위한 생성자와 소멸자가 호출되기 마련입니다.
가끔 코딩을 하다보면 반드시 사용하진 않더라도 필요한 변수들을 볼 수 있습니다.
가령 일정 길이 이상의 비밀번호에 대해서만 암호화를 진행하는 코드를 짠다고 한다면 이렇게
작성하는 분들도 계실 것 입니다.
std::string encryptPassword(const std::string& password)
{
using namespace std;
string encrypted; //비밀번호가 길 때를 대비해 암호화 변수를 만듭니다.
if( password.length() < MinimumPasswordLength )
{
throw logic_error("Password is too short");
}
... // 주어진 비밀번호를 암호하하여 encrypted 변수에 넣는 작업을 합니다.
return encrypted;
}
이럴 경우 encrypted 변수를 사용하긴 하지만 반드시 사용한다는 보장은 없게 되어버립니다.
이번 항목에서는 이런 상황의 해결점을 알려줍니다.
즉, 어떤 변수를 사용해야 할 때가 오기 전까지 그 변수의 정의를 늦추는 것은 기본이고, 초기화 인자를
손에 넣기 전까지 정의를 늦출 수 있는지 둘러봐야 한다는 것입니다.
다음의 코드는 해결방법을 통해 최적화가 진행된 코드입니다.
std::string encryptPassword( const std::string& password )
{
... //길이 검사
std::string encrypted(password); // 매개인자를 통해 초기화
encrypt( encrypted ); // 암호화 하는 함수
return encrypted; // 암호화 된 변수 반환
}
만약 반복문의 경우엔 어떻게 작성해야 할까요??
두 가지 방법이 있습니다.
(1) A 방법 : 루프 바깥쪽 정의
Widget w;
for(int i = 0; i < n; i++)
{
w = i;
}
(2) B 방법 : 루프 안쪽에 정의
for(int i = 0; i < n; i++)
{
Widget w(i);
}
A 방법의 경우 대입의 비용이 쌀 경우 그리고 수행성능에 영향을 미치는 경우에 사용하는 것이 좋고
B 방법의 경우 생성자 및 소멸자 비용이 대입 비용보다 싸고, 수행성능에 크게 영향을 미치지 않는 곳에서
사용하는 것이 좋습니다.
이것만은 잊지 말자!
* 변수 정의는 늦출 수 있을 때까지 늦춥시다. 프로그램이 더 깔끔해지며 효율도 좋아집니다.
'C++ > Effective C++' 카테고리의 다른 글
17.10.23. Effective C++ 5. 구현 (항목28) (0) | 2020.01.15 |
---|---|
17.10.23. Effective C++ 5. 구현 (항목27) (0) | 2020.01.15 |
17.10.23. Effective C++ 4. 설계 및 선언 (항목25) (0) | 2020.01.14 |
17.08.22. Effective C++ 1. C++에 왔으면 C++의 법을 따릅시다. (항목24) (0) | 2020.01.14 |
17.08.21. Effective C++ 1. C++에 왔으면 C++의 법을 따릅시다. (항목23) (0) | 2020.01.14 |