티스토리 뷰
[Effective Modern C++] 항목 5. 명시적 형식 선언보다는 auto를 선호하라
pppgod 2019. 9. 8. 00:44처음 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의 내용을 숙지하도록 하자.
다음 포스트에서는 auto 에서 생길 수 있는 문제에 대해 알아보도록 하자.
참고 서적
스콧 마이어스, Effective Modern C++
'C++ > Effective Modern C++' 카테고리의 다른 글
[Effective Modern C++] 항목 7. 객체 생성 시 괄호(())와 중괄호({})를 구분하라 (0) | 2019.09.21 |
---|---|
[Effective Modern C++] 항목 6. auto가 원치 않은 형식으로 연역될 때에는 명시적 형식의 초기치를 사용하라 (0) | 2019.09.08 |
[Effective Modern C++] 항목 4. 연역된 형식을 파악하는 방법을 알아두라 (0) | 2019.09.02 |
[Effective Modern C++] 항목 3. decltype의 작동 방식을 숙지하라 (0) | 2019.09.02 |
[Effective Modern C++] 항목 2. auto의 형식 연역 규칙을 숙지하라 (0) | 2019.08.25 |
- Total
- Today
- Yesterday
- Forwarding
- 람다
- 다이소
- MOVE
- Effective
- Modern
- C++11
- 포인터
- auto
- Join
- C
- 보편 참조
- thread
- Override
- std::move
- forward
- Effective Modern C++
- detach
- 발아시기
- Unreal
- 보편참조
- C++
- C++14
- Overloading
- std::forward
- Future
- Perfect
- CPP
- async
- const
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |