auto 키워드와 타입 추론
auto 키워드의 소개
C++ 11에서 도입된 auto
키워드는 변수의 타입을 컴파일러가 자동으로 추론하도록 해줍니다.
이는 코드의 가독성을 높이고, 리팩토링을 용이하게 만들며, 템플릿 프로그래밍을 더욱 쉽게 만들어줍니다.
기본 사용법
auto의 타입 추론 규칙
auto
의 타입 추론은 템플릿 타입 추론과 유사하지만, 완전히 동일하지는 않습니다.
주요 규칙은 다음과 같습니다.
- 초기화 표현식이 참조인 경우, 참조성은 무시됩니다.
const
와volatile
한정자는 보통 무시됩니다. (참조나 포인터가 아닌 경우)- 중괄호 초기화
{}
는std::initializer_list
로 추론됩니다.
auto와 함께 사용되는 수식어
auto
는 다양한 수식어와 함께 사용될 수 있습니다.
함수 반환 타입으로서의 auto
C++14부터는 함수의 반환 타입으로 auto
를 사용할 수 있습니다.
이는 특히 복잡한 반환 타입을 가진 함수나 템플릿 함수에서 유용합니다.
decltype과 auto
decltype
은 표현식의 타입을 추론합니다.
auto
와 decltype
을 함께 사용하면 더욱 강력한 타입 추론이 가능합니다.
이를 "후행 반환 타입 구문"이라고 합니다.
C++14부터는 대부분의 경우 다음과 같이 간단히 쓸 수 있습니다.
auto와 람다 표현식
auto
는 다음 절에서 다룰 람다 표현식의 타입을 캡처하는 데 매우 유용합니다.
C++ 14부터는 람다 매개변수에도 auto
를 사용할 수 있어 제네릭 람다를 만들 수 있습니다.
auto의 장단점
장점
- 코드의 간결성과 가독성 향상
- 타입 불일치 오류 감소
- 리팩토링 용이성
- 긴 타입 이름 작성 불필요
단점
- 코드만 봐서는 정확한 타입을 알기 어려울 수 있음
- 의도치 않은 타입 추론 가능성
- 초보자에게는 이해하기 어려울 수 있음
auto 사용 시 주의사항
- 초기화 리스트와 함께 사용 시 주의
- 프록시 클래스와의 상호작용
- 가독성 저하 방지
때로는 명시적 타입이 코드의 의도를 더 잘 전달할 수 있습니다.
auto
의 과도한 사용은 오히려 가독성을 해칠 수 있습니다.
auto와 코딩 스타일
auto
의 사용에 대한 일반적인 가이드라인
- 명확한 경우에만
auto
사용 - 복잡한 타입이나 템플릿 타입에 주로 사용
- 반복자나 람다 표현식에는 거의 항상
auto
사용 - 코드의 의도를 불분명하게 만들지 않도록 주의
실습 : auto를 활용한 코드 개선
다음은 auto
를 사용하여 코드를 개선하는 예제입니다.
연습 문제
- 다음 코드에서
auto
로 선언된 변수들의 실제 타입을 추론해보세요.
- 다음 함수 템플릿을
auto
와decltype
을 사용하여 개선해보세요.
참고자료
- "Effective Modern C++" by Scott Meyers (특히 Item 5 : Prefer auto to explicit type declarations)
- C++ Core Guidelines : ES.11 : Use auto to avoid redundant repetition of type names
- cppreference.com : auto specifier