본문 바로가기
개발/C++ (98,03,11,14,17,20,23)

Modern C++ : type aliases (typedef and using) (98, 11)

by snowoods 2025. 8. 26.

Modern C++

C++ Type Aliases (typedef and using)

 

개요

타입 별칭(Type Alias)은 C++에서 기존 타입에 대한 대체 이름을 정의하는 방법입니다. 이를 통해 코드의 가독성을 높이고 복잡한 타입 선언을 단순화할 수 있습니다.

 

C++ 버전별 주요 키워드 도입 시기

  • typedef: C++98/03부터 사용 가능 (C 언어에서 상속)
  • using (type alias): C++11부터 도입
  • Alias templates: C++11부터 도입

 

내용 설명

1. typedef (C 스타일)

C 언어에서 물려받은 전통적인 타입 별칭 방식입니다.

typedef std::vector<std::int8_t> ByteVector1;

 

2. using (C++11 스타일)

C++11에서 도입된 더 직관적인 문법입니다.

using ByteVector2 = std::vector<std::int8_t>;

 

3. Alias Templates (C++11)

템플릿과 함께 사용할 수 있는 타입 별칭입니다.

template <typename T>
using VecOfIntegers = std::vector<T>;

 

예제 코드

#include <array>
#include <cstdint>
#include <iostream>
#include <span>
#include <vector>

// C 스타일
typedef std::vector<std::int8_t> ByteVector1;

// C++11 스타일
using ByteVector2 = std::vector<std::int8_t>;

// Alias Template
template <typename T>
using VecOfIntegers = std::vector<T>;

template <typename T>
void print_container(std::span<T> span)
{
    for (const auto val : span)
    {
        std::cout << static_cast<int>(val) << ' ';  // int8_t를 정상적으로 출력하기 위해 캐스팅
    }
    std::cout << '\n';
}

int main()
{
    auto my_bytes = ByteVector2{1, 0, 0, 1};
    auto my_vec = VecOfIntegers<std::int32_t>{1, 2, 3, 4, 5};
    auto my_arr = std::array<std::uint16_t, 5U>{1, 2, 3, 4, 5};
    std::uint64_t my_c_arr[] = {1, 2, 3, 4, 5};

    print_container<std::int8_t>(my_bytes);
    print_container<std::int32_t>(my_vec);
    print_container<std::uint16_t>(my_arr);
    print_container<std::uint64_t>(my_c_arr);

    return 0;
}

 

실행 결과

1 0 0 1 
1 2 3 4 5 
1 2 3 4 5 
1 2 3 4 5 

 

활용팁

  1. 가독성: 복잡한 타입 선언을 단순화하여 코드의 가독성을 높입니다.
  2. // 복잡한 함수 포인터 타입 using Callback = void(*)(int, const std::string&); // vs // typedef 버전 typedef void(*Callback)(int, const std::string&);
  3. 템플릿과의 호환성: using은 템플릿과 함께 사용할 때 더 유연합니다.
  4. // using을 사용한 alias template template <typename T> using MyAllocator = std::allocator<T>;
  5. 타입 특성: std::enable_ifstd::conditional 같은 타입 특성과 함께 사용하면 더 강력한 메타프로그래밍이 가능합니다.
  6. C++17 이후: std::byte 타입을 사용하면 바이트 단위 데이터를 더 명확하게 표현할 수 있습니다.
  7. #include <cstddef> using ByteVector = std::vector<std::byte>;
  8. 가독성 vs 성능: 타입 별칭은 컴파일 타임에 처리되므로 런타임 성능에 영향을 주지 않습니다.