C++ Type Inference

smsh0722·2일 전

기타 정리

목록 보기
4/7

C++ Type Inference — auto와 decltype

Type Inference (타입 추론)는 변수나 표현식의 타입을 프로그래머가 직접 적지 않고 컴파일러가 추론하도록 하는 기능이다. 코드가 짧아지고 복잡한 타입을 다루기 편해진다.

auto

auto는 Initializer (초기화 값)를 보고 변수 타입을 자동으로 결정한다.

auto x = 10;      // int
auto y = 3.14;    // double
auto z = 'A';     // char

즉,

auto 변수 = 값;

에서 컴파일러가 값의 타입을 분석해 변수 타입을 결정한다.

복잡한 타입에서 유용

특히 Iterator (반복자)처럼 타입 이름이 긴 경우 유용하다.

vector<int> v = {1, 2, 3};

for (auto it = v.begin(); it != v.end(); ++it) {
    cout << *it;
}

v.begin()의 반환 타입을 컴파일러가 자동으로 추론하므로 긴 타입을 직접 작성할 필요가 없다.


decltype

decltype (Declared Type, 선언 타입 추론)은 표현식 자체의 타입을 알아내는 기능이다.

int x = 10;

decltype(x) y = 20;   // y는 int

형식:

decltype(expression) variable;

중요한 점은 expression을 실제로 실행하지 않고 타입만 분석한다는 것이다.

int x = 10;
decltype(x) y;
x의 타입 = int
↓
decltype(x) = int
↓
y의 타입 = int

auto vs decltype

autodecltype
기준초기화 값표현식
목적변수 타입 자동 결정표현식의 타입 추출
표현식 실행초기화식 사용타입만 분석
대표 사용변수, IteratorGeneric/Template 코드

핵심 차이:

auto x = expression;

→ expression의 결과를 이용해 x의 타입을 추론

decltype(expression) x;

→ expression이 어떤 타입인지 알아내 그 타입을 사용


auto + decltype

둘을 함께 사용하면 Generic Programming (제네릭 프로그래밍)이나 Template (템플릿)에서 유용하다.

template <typename T, typename U>
auto add(T a, U b) -> decltype(a + b)
{
    return a + b;
}

여기서:

decltype(a + b)

가 a + b 결과의 타입을 결정한다.

예:

add(10, 5.5);
int + double
→ double

따라서 반환 타입도 double이 된다. 이를 Trailing Return Type (후행 반환 타입) 문법이라고 한다.


장점

Type Inference (타입 추론)를 사용하면:

  • 긴 타입 선언을 줄일 수 있음
  • Template / Generic 코드 작성이 편해짐
  • 타입이 변경되어도 코드가 자동으로 따라감
  • Iterator 등 복잡한 타입의 가독성이 좋아짐

주의점

auto를 너무 많이 사용하면 오히려 실제 타입을 알기 어려워질 수 있다.

auto result = getSomething();

getSomething()의 반환 타입을 모른다면 result의 타입도 코드만 보고 바로 알기 어렵다.

따라서 타입이 명확하거나 복잡한 타입을 단순화할 때 사용하는 것이 좋다. 잘못 추론한 타입을 가정하면 미묘한 버그로 이어질 수 있다.

핵심 정리

auto
→ 초기화 값을 보고 "변수의 타입"을 추론

decltype
→ 표현식을 실행하지 않고 "표현식의 타입"을 추출

auto + decltype
→ Template / Generic Programming에서 특히 유용

0개의 댓글