[Effective Modern C++] Chapter 2. auto [항목 5~6]

Chapter 2. auto

항목 5. 명시적 형식 선언보다는 auto를 선호하라.

진짜 auto는 상당히 좋다. 그 근거를 대자면 여러가지가 있다.
일단, 거의 반드시 auto를 사용해야만 하는 경우도 있다. (클로저의 형식같이 컴파일러만 알고있는 타입의 경우)
그리고 형식 불일치로 인한 효율적, 이식성문제가 발생하지 않는다.
std::size_t getSize() { ... }
int size = getSize();
간단한 예시로서 위 코드 같은 경우, 32bit system에서 컴파일했을 때는 문제가 없지만 64bit system에서 컴파일했을 때는 문제가 있을 수 있다. (예를 들어, windows 64bit의 경우 LLP64를 채택하기 때문에 문제가 생긴다.)
그 외에도 책의 다른 예제들에서 볼 수 있듯이 명시적 형식 선언은 이식성과 효율성 측면에서 문제가 생길 수 있는 여지가 많다.
그러나 auto를 사용하면 이런 문제들이 발생하지 않는다.
또 심미적(?)인 측면에서도 auto를 쓰는 게 기다랗고 복잡한 타입이름을 늘어놓는 것 보다 훨씬 좋다.
결론적으로, 굳이 명시적 형식 선언을 해야 할 필요성을 찾지 못한다면 auto를 사용하는 것이 옳다.
그러나 가독성 측면에서 auto를 사용하면 타입이 정확하게 드러나지 않기 때문에 코드를 읽기 힘들다는 반론도 존재한다. 하지만 내 생각에는 어차피 거의 항상 IDE의 도움을 받게 되기 때문에 큰 문제는 없다고 본다. 오히려 장황하게 늘어져 있는 명시적 타입이 괜시리 눈과 머리를 피로하게 만들어 가독성이 떨어진다.

[기억해 둘 사항들]
 - auto 변수는 반드시 초기화해야 하며, 이식성 또는 효율성 문제를 유발할 수 있는 형식 불일치가 발생하는 경우가 거의 없으며, 대체로 변수의 형식을 명시적으로 지정할 때보다 타자량도 더 적다.
 - auto로 형식을 지정한 변수는 항목 2와 항목 6에서 설명한 문제점들을 겪을 수 있다.

항목 6. auto가 원치 않은 형식으로 연역될 때에는 명시적 형식의 초기치를 사용하라.

자, 변수를 선언할 때 개발자의 의도를 살펴보자.
int a = (표현식);
과 같은 코드가 있을 때, 변수의 타입을 int로 선언한 의도는 다음 둘 중 하나일 것이다.
1. (표현식)의 결과가 int여서 a를 int로 선언했다.
2. (표현식)의 결과는 다른 타입이지만 이를 int형으로 암시적 캐스팅하기 위해 a를 int로 선언했다.
유감스럽게도, 코드를 읽는 사람은 개발자가 위 둘 중에 어떤 의도를 가지고 코드를 작성했는 지 판단하기 힘들다.
그러나, auto를 사용한다면 위 2가지 의도를 분명하게 코드에 반영할 수 있다.
1번 의도에 해당하는 경우,
auto a = (표현식);
과 같이 변수를 선언하면 된다.
2번 의도에 해당하는 경우,
auto a = static_cast<int>(표현식);
과 같이 변수를 선언하면 된다.
auto를 사용하면 개발자의 의도를 코드에 그대로 담을 수 있기 때문에 훨씬 좋다.
그리고 1번 의도의 경우, 향후 (표현식)의 결과의 타입이 바뀌더라도 그에 따라 파생되는 변수들의 타입을 변경하는 추가적인 리펙토링이 필요 없기 때문에 훨씬 편하고, 무엇보다 그에 따른 실수들을 할 여지가 없어지기 때문에 훨씬 좋다.
그러나 auto의 한 가지 단점은, 보이지 않는 대리자 타입 (예를 들면, std::vector<bool>::reference) 같은 것 때문에 실수를 범할 수 있다는 것이다. 다행히 이런 경우는 드물게 발생하긴 하지만, 여전히 꺼림칙한 부분임에는 틀림없다. 이 것은 마땅한 대비책이 없는 것 같고,,,, 단지 만약 어떤 문제의 원인이 보이지 않는 대리자 타입 때문임을 알게 된다면 static_cast를 이용해서 명시적으로 원하는 type으로 casting해서 사용하면 된다.

[기억해 둘 사항들]
 - "보이지 않는" 대리자 형식 때문에  auto가 초기화 표현식의 형식을 "잘못" 연역할 수 있다.
 - 형식 명시 초기치 관용구는 auto가 원하는 형식을 연역하도록 강제한다.



  결론을 내리자면 일단 일반적으로는 무조건 auto를 사용하는 것이 좋다. 물론, 그때 그때 상황에 따라 판단을 내려야겠지만 기본적인 방침을 auto를 사용하는 쪽으로 잡는 것이 옳다고 본다.

댓글