Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 타입 추론 완벽 정리: auto와 decltype의 차이와 활용법

C++11부터 도입된 타입 추론(Type Inference) 기능은 개발자가 변수 타입을 명시적으로 작성하지 않아도 컴파일러가 자동으로 판단하도록 해주는 강력한 기능입니다. 이 글에서는 대표적인 타입 추론 키워드인 autodecltype의 동작 원리와 차이점을 예제 코드를 통해 살펴보겠습니다.

auto란 무엇인가?

auto 키워드는 초기화 값(initializer)의 타입을 기반으로 변수의 타입이 결정됩니다. 즉, 변수 선언 시 오른쪽에 있는 초기화 식을 컴파일러가 분석하여 그에 맞는 타입을 자동으로 지정합니다.

auto 사용 예제

#include <bits/stdc++.h>
using namespace std;

int main(){
    auto x = 4;        // int 타입으로 추론
    auto y = 3.37;     // double 타입으로 추론
    auto ptr = &x;     // int* 타입으로 추론

    cout << typeid(x).name() << endl
         << typeid(y).name() << endl
         << typeid(ptr).name() << endl;

    return 0;
}

실행 결과

i
d
Pi

출력 결과를 해석하면 다음과 같습니다(GCC/Clang 기준 mangled name).

  • iint: 정수 리터럴 4로부터 int로 추론
  • ddouble: 실수 리터럴 3.37로부터 double로 추론
  • Pipointer to int(int*): x의 주소값으로부터 포인터 타입으로 추론

decltype이란 무엇인가?

decltype표현식(expression)이나 함수 호출의 반환 타입을 그대로 추출하여 변수 선언에 활용할 수 있게 해줍니다. 특히 함수의 반환 타입에 따라 변수 타입을 결정해야 할 때 유용합니다.

decltype 사용 예제

#include <bits/stdc++.h>
using namespace std;

int fun1() { return 10; }
char fun2() { return 'g'; }

int main(){
    decltype(fun1()) x;   // fun1()의 반환 타입인 int로 선언
    decltype(fun2()) y;   // fun2()의 반환 타입인 char로 선언

    cout << typeid(x).name() << endl;
    cout << typeid(y).name() << endl;

    return 0;
}

실행 결과

i
c
  • iint: fun1()이 int를 반환하므로 x는 int 타입
  • cchar: fun2()가 char를 반환하므로 y는 char 타입

auto와 decltype의 핵심 차이

구분autodecltype
타입 결정 기준초기화 값의 타입표현식 또는 함수 반환 타입
초기화 필수 여부반드시 초기화 필요초기화 없이 선언 가능
주요 용도반복자, 람다 등 복잡한 타입 간결화함수 반환 타입 기반 변수 선언, 템플릿 메타프로그래밍

정리

auto는 초기화 값을 통해 타입을 추론하므로 코드를 간결하게 만들어 주고, decltype은 이미 존재하는 표현식의 타입을 그대로 가져와 활용할 수 있습니다. 두 키워드를 적절히 조합하면 복잡한 템플릿 코드나 제네릭 프로그래밍에서 가독성과 생산성을 크게 높일 수 있습니다.