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
활용팁
- 가독성: 복잡한 타입 선언을 단순화하여 코드의 가독성을 높입니다.
// 복잡한 함수 포인터 타입 using Callback = void(*)(int, const std::string&); // vs // typedef 버전 typedef void(*Callback)(int, const std::string&);
- 템플릿과의 호환성:
using
은 템플릿과 함께 사용할 때 더 유연합니다. // using을 사용한 alias template template <typename T> using MyAllocator = std::allocator<T>;
- 타입 특성:
std::enable_if
나std::conditional
같은 타입 특성과 함께 사용하면 더 강력한 메타프로그래밍이 가능합니다. - C++17 이후:
std::byte
타입을 사용하면 바이트 단위 데이터를 더 명확하게 표현할 수 있습니다. #include <cstddef> using ByteVector = std::vector<std::byte>;
- 가독성 vs 성능: 타입 별칭은 컴파일 타임에 처리되므로 런타임 성능에 영향을 주지 않습니다.
'개발 > C++ (98,03,11,14,17,20,23)' 카테고리의 다른 글
Modern C++ : Custom Iterator Utilities (98, 11, 17, 20) (0) | 2025.08.29 |
---|---|
Modern C++ : std::inserter (98, 11, 17) (1) | 2025.08.28 |
Modern C++ : iterators (98, 11, 17, 20) (0) | 2025.08.27 |
Modern C++ : std::map (98, 11, 17, 20) (0) | 2025.08.25 |
Modern C++ : std::pair, std::tuple (98, 11, 17) (0) | 2025.08.24 |
Modern C++ : std::span (20) (1) | 2025.08.23 |
Modern C++ : std::vector, emplace_back vs push_back (98, 11, 17) (0) | 2025.08.22 |
Modern C++ : std::vector (98, 11, 14, 17, 20) (0) | 2025.08.21 |