Effective Modern C++ #5 명시적 형식 선언보다는 auto 를 선호하라.

2025. 6. 8. 12:20·dev/C++

auto

auto가 의도하지 않은 형식으로 추론할 때가 가끔 존재한다.

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

auto 변수의 형식은 초기값으로부터 추론 되므로, 반드시 초기값을 제공해야한다.

따라서 변수 선언 시 초기화를 빼먹는 실수는 애초에 안하게 된다.

error: declaration of variable 'a' with deduced type 'auto' requires an initializer

초기화 없이 auto 변수 선언 시, 위와 같은 컴파일 에러 발생한다.

 

auto의 다른 장점으로는, std::function과 비교함으로써 드러난다.

std::function 는 함수 포인터를 일반화한 wrapper이다.

std::function 방식으로 객체 생성 시, 지칭할 함수 형식 (반환값, 매개변수)을 지정해야한다.

 

auto를 사용함에 따라, std::function보다 반복적인 매개변수 등 형식적 내용을 덜 작성할 수 있다.

이런 번잡함 외에도, 메모리 및 속도에서 auto 접근법이 더 좋은 선택지이다.

std::function은 힙 메모리를 할당하며, 메모리 부족이 발생할 수도 있다.

또한 인라인 제한 및 간접 함수 호출 등 동작 원리 때문에 auto 사용하는 것보다 속도도 느리다.

#include <iostream>

int main() {
    std::function<bool(int, int)> fun1 = [] (int a, int b) {
        return a>b;
    };

    auto fun2 = [] (int a, int b) {
        return a>b;
    };

    std::cout << fun1(1,5) << " " << fun2(1,5) << std::endl;
}

위 fun1, fun2 는 동일한 기능을 하는 std::function, auto 의 예시이다.

 

또 다른 장점으로, 컨테이너 크기 등을 나타낼 때도 auto 가 더 유리하다.

std::vector<int>::size_type 형식은 개발자가 잘 모르므로, 임의로 unsigned 등으로 명시적으로 형식을 정의하다보면 자료형 크기로 인한 문제가 발생한다.

 

또한 auto는 개발자가 의도하지 않은 형식 불일치의 가능성을 차단할 수 있다.

#include <iostream>
#include <string>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m;
    m.emplace("a", 1);
    for (const std::pair<std::string, int> & p : m) {
        std::cout << p.first << " " << p.second << std::endl;
    }
}

 

unordered_map의 key는 const 이지만, 사용자가 그렇게 지정하지 않는 경우 비효율적인 변환 과정들이 추가로 발생한다.

 

전통적인 명시적 형식 선언 (int a = 10;) 과 비교했을 때, auto 사용 시 가독성이 문제가 된다는 말이 있다.

하지만 실제로 type inference 가 일상인 언어 (python, js 등) 인프라는 이미 방대하다.

따라서 형식을 명시적으로 작성하는 것 보다, auto 를 사용하는 것이 추천된다.

'dev > C++' 카테고리의 다른 글

Effective Modern C++ #7 객체 생성 시 괄호()와 중괄호{}를 구분하라.  (0) 2025.06.10
Effective Modern C++ #13 iterator 보다 const_iterator 를 선호하라  (0) 2025.06.10
Effective Modern C++ #1 템플릿 형식 연역 규칙을 숙지해라.  (0) 2025.06.04
스마트 포인터(smart pointer) 사용 예시  (0) 2025.05.23
스마트 포인터(smart pointer)  (0) 2025.05.23
'dev/C++' 카테고리의 다른 글
  • Effective Modern C++ #7 객체 생성 시 괄호()와 중괄호{}를 구분하라.
  • Effective Modern C++ #13 iterator 보다 const_iterator 를 선호하라
  • Effective Modern C++ #1 템플릿 형식 연역 규칙을 숙지해라.
  • 스마트 포인터(smart pointer) 사용 예시
dev_dev
dev_dev
C++, Python, ML, Vue
  • dev_dev
    develop about develop
    dev_dev
  • 전체
    오늘
    어제
    • 카테고리 (145) N
      • dev (144) N
        • C++ (44)
        • ML DL (1)
        • on-device AI (5) N
        • AIOT (9)
        • IOT (1)
        • 코딩테스트(백준) (49)
        • 코딩테스트(프로그래머스) (25)
        • 전자공학 (7)
        • 창업 (1)
        • 웹 (1)
        • 자격증 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    인공지능
    Template
    데이터 분석
    머신러닝
    경사하강법
    uniform initialization
    decltype
    COLAB
    auto
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
dev_dev
Effective Modern C++ #5 명시적 형식 선언보다는 auto 를 선호하라.
상단으로

티스토리툴바