방프리

17.10.23. Effective C++ 5. 구현 (항목26) 본문

C++/Effective C++

17.10.23. Effective C++ 5. 구현 (항목26)

방프리 2020. 1. 14. 21:09

항목 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 방법의 경우 생성자 및 소멸자 비용이 대입 비용보다 싸고, 수행성능에 크게 영향을 미치지 않는 곳에서 

사용하는 것이 좋습니다.

 

이것만은 잊지 말자!

 

* 변수 정의는 늦출 수 있을 때까지 늦춥시다. 프로그램이 더 깔끔해지며 효율도 좋아집니다.

Comments