소프트웨어 공부/프로그래밍

간접적인 타입 변환을 피하기 위해 오버로딩을 활용하라

야곰야곰+책벌레 2021. 4. 20. 14:53
728x90
반응형

  간접적인 타입 변환은 코딩의 편리함에는 도움을 줄는지 몰라도 임시 개체가 만들어진다는 점에서 그다지 효율적이지는 못하다. 이러한 추가적인 개체의 생성을 피하고 최적화를 이루기 위해서는 변환이 일어나지 않는 범위 내에서 일반적인 인자 타입을 사용한 오버로딩 함수를 사용하면 된다.

  사무실에서 일하던 중 종이가 다 떨어졌다면 어떻게 할 것인가? 복사를 담당하는 동료에게 가서 몇 장을 얻어오면 잠시나마 문제는 해결될 것이지만 그렇게 오래 가지는 못할 것이다. 간접 변환이 하는 일이 바로 이것이다. 임시적인 개체를 만들어 잠지 문제를 해결하는 것을 말한다.

 

class string {
    string(const char* text); // 간접 변환을 가능하도록 함
};

bool operator==(const string&, const string&);
// .. 코드의 다른 부분 ..
if(somestring == "Hello") { ... }

 

정의 부분을 보면 컴파일러는 s == string("Hello") 부분을 검사하게 됨을 알 수 있다.

하지만 이러한 작업은 자원의 낭비로, 문자를 그냥 읽으면 될 일을 굳이 복사까지 하고 있는 것이다. 해결은 간단하다.

 

bool operator==(const string& lhs, const string& rhs);
bool operator==(const string& lhs, const char* rhs);
bool operator==(const char* lhs, const string& rhs);

 

코드가 많이 중복된 것처럼 보이지만 세 라인 모두 같은 후미 함수를 사용하고 있으므로 불필요한 중복이라 보기 힘들다. 물론 이러한 방식의 오버로딩은 너무 이른 최적화라는 측면이 없지는 않으며, 성능에 민감한 코드에 쓰이기에는 적절하지 않지만, 간접 변환을 피하는 한 가지 방법이라는 점만 알아두자.

728x90
반응형