티스토리 뷰

 처음 C++ 에서 auto 라는 키워드를 알게 되었을 때, 'auto가 있어서 편하다' 라는 생각보다는 왜 필요한지 의문이 든 적이 있을 것이다. 타입을 알아서 지정해준다는 장점 하나만으로 쓰기에는 auto를 사용함으로써 타입을 알아내기 힘들다는 생각이 들게된다. 대표적으로 처음 javascript python 을 사용하게 되면 타입을 알지 못해 생기는 귀찮은 일들이 생긴다. 그러나 auto 는 이를 감수할 충분한 가치가 있다. 어떠한 장점들이 있는지 알아보자.

초기화를 빼먹는 실수

 종종 생길 수 있는 실수로 선언만하고 초기화를 하지 않는 경우가 생길 수 있다. 이런 실수 때문에 예상치 못한 문제들이 발생할 수 있어 항상 조심해야한다. 그런데 만약 auto를 사용했다면 컴파일러가 에러를 발생시켜 실수가 발생할 여지를 남기지 않는다.

int x1;

auto x2;   // compile error!

auto x3 = 0;

컴파일러만 알던 형식 지정 가능

 람다 표현식으로 선언된 변수의 경우에는 우리가 형식을 지정할 수 없다. 왜냐하면 컴파일러만 알고 있는 형식이기 때문이다. 그런데 auto 를 사용하면 우리는 형식을 지정할 수 있다.

auto derefUPLESS =
    [](const std::unique_ptr<Widget>& p1,
       const std::unique_ptr<Widget>& p2)
    { return *p1 < *p2; };

 std::function 객체를 사용하면 되지 않나 싶을수도 있다. 하지만 std::function 객체는 위와는 다르게 보다 많은 메모리를 사용해야하며 템플릿에 형식을 지정해야하기 때문에 아래와 같이 지저분하다.

std::function<bool(const std::unique_ptr<Widget>&,
                   const std::unique_ptr<Widget>&)>
    auto derefUPLESS =
        [](const std::unique_ptr<Widget>& p1,
           const std::unique_ptr<Widget>& p2)
        { return *p1 < *p2; };

형식 단축의 문제 회피

 std::vector 의 반환 형식은 사실 std::vector<int>::size_type 이다. 그런데 만약 unsigned 타입을 사용했다면 운영체제에 따라 32비트가 될수도 64비트가 될수도 있는 문제가 있다.

std::vector<int> v;

unsigned sz = v.size();  // 운영체제에 따라 문제 발생 가능

auto sz = v.size():   	 // 해결

 또 다른 예시를 보자.

std::unordered_map<std::string, int> m;

for (const std::pair<std::string, int>& p : m)
{
    ...
}

 위의 코드는 문제가 없어보이지만 std::unordered_map 에 담겨있는 형식은 pair<const std::string, int> 이기 때문에 의도치 않은 형변환이 일어난다. 하지만 auto 를 사용한다면 이런 실수를 할 여지가 없다.

고찰

 auto 를 사용했을때 생기는 장점은 아주 많다. 하지만 auto 의 형식 연역에 대해 알지 못하면 눈뜬 장님과 다를바가 없다. 꼭 항목 2의 내용을 숙지하도록 하자.

https://pppgod.tistory.com/15

 

[Effective Modern C++] 항목 2. auto의 형식 연역 규칙을 숙지하라

auto 의 형식 연역 규칙은 template 과 거의 모든 부분이 일치한다. 그러므로 항목 1을 먼저 보기를 추천한다. https://pppgod.tistory.com/14 불러오는 중입니다... template 과 차이가 생기는 부분은 바로 균일..

pppgod.tistory.com

 다음 포스트에서는 auto 에서 생길 수 있는 문제에 대해 알아보도록 하자.

https://pppgod.tistory.com/23

불러오는 중입니다...

 

참고 서적

스콧 마이어스, Effective Modern C++
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함