C++ Basic
typedef & using
geminanolja
2024. 12. 13. 09:55
1. typedef
설명
- C 스타일의 타입 별칭 방식.
- typedef를 통해 타입의 이름에 새로운 별칭을 지정해 주소 대신 사용할 수 있다.
- c++에서 이미 정의된 타입 또는 생성시 정의한 타입(struct또는 class)보다 더 짧거나 의미있는 이름을 지어 사용 가능하다.
- C++뿐만 아니라 C에서도 사용 가능
기본 사용법
typedef 원래타입 새이름;
예제
#include <iostream>
using namespace std;
typedef int i;//int를 i로 대신 쓰겠다
int main()
{
i a =1;
cout<< a <<endl;
return 0;
}
2. using
- C++11부터 새롭게 도입된 방식으로 typedef의 대안
- typedef보다 더 가독성 좋고 간결한 문법을 제공
- 템플릿(alias template)과 같은 복잡한 타입에 더 적합.
기본 사용법
using 새이름 = 원래타입;
예제
#include <iostream>
using namespace std;
//typedef int i;//int를 i로 대신 쓰겠다
using i = int;
int main()
{
i a =1;
cout<< a <<endl;
return 0;
}
using int8 = __int8;
using int16 = __int16;
using int32 = __int32;
using int64 = __int64;
int8 smallNumber = 127; // 8-bit 정수
int32 largeNumber = 1000; // 32-bit 정수
//C++11에서는 <cstdint> 헤더를 사용하여 표준 타입을 제공
//표준 라이브러리를 사용하는 것이 더 이식성이 좋고 권장
#include <cstdint>
using int8 = std::int8_t;
using int16 = std::int16_t;
using int32 = std::int32_t;
using int64 = std::int64_t;
C++11 이상을 사용하는 경우에는 <cstdint>에서 제공하는 표준 타입(int16_t, uint16_t 등)을 사용하는 것이 훨씬 더 좋다.
why?
1. 표준 타입 (int16_t, uint16_t)의 장점
1) 이식성
- **int16_t**와 같은 표준 타입은 C++ 표준 라이브러리에 정의되어 있으며, 모든 플랫폼과 컴파일러에서 동일하게 작동
- __int16은 MSVC 전용이라 GCC, Clang 등 다른 컴파일러에서 동작하지 않지만, int16_t는 어떤 컴파일러에서도 동작
2) 코드의 명확성
- int16_t와 같은 표준 타입은 크기(16비트, 32비트 등)가 이름에 명확히 드러나므로, 코드 읽기가 더 쉬움
- using으로 별칭을 만들어도 결국 원래 타입의 의미를 알아야 하므로, 표준 타입 이름 자체를 사용하는 것이 더 직관적
3) 유지보수성
- 프로젝트가 여러 컴파일러를 지원하거나 플랫폼 독립적으로 동작해야 할 경우, int16_t 같은 표준 타입을 사용하는 것이 유지보수에 유리
4) 가독성
- <cstdint>에서 제공하는 이름은 크기가 명확히 드러나므로, 의도한 바를 명확히 전달
using MyInt = int;
using ULL = unsigned long long;
// 사용
MyInt a = 10; // int 타입 변수
ULL bigNumber = 200000; // unsigned long long 타입 변수
포인터 타입 별칭
using IntPtr = int*;
IntPtr p1, p2; // p1과 p2는 int* 타입
3. typedef와 using의 차이점
특징 typedef using
문법 | 복잡한 타입일수록 읽기 어려움 | 더 간결하고 가독성 좋음 |
템플릿 지원 | 템플릿 타입 별칭을 지원하지 않음 | 템플릿 타입 별칭 지원 |
지원 버전 | C++98부터 사용 가능 | C++11 이상에서 사용 가능 |
가독성 | 복잡한 표현에 비효율적 | 복잡한 표현에서도 효율적 |
4. 템플릿에서의 차이
템플릿 별칭: using만 가능
typedef는 템플릿에서 별칭을 만들 때 사용할 수 없습니다. 그러나 using은 가능합니다.
// typedef는 템플릿에서 지원하지 않음
// typedef std::map<Key, Value> MyMap<Key, Value>; // 에러 발생
// using으로 템플릿 별칭 생성
template <typename Key, typename Value>
using MyMap = std::map<Key, Value>;
// 사용
MyMap<int, std::string> myMap;
5. 실제 사용 사례
1. 긴 타입의 별칭
typedef std::map<int, std::vector<std::string>> IntToVectorMap; // typedef
using IntToVectorMap = std::map<int, std::vector<std::string>>; // using
2. 플랫폼 종속적인 타입
#ifdef _WIN32
typedef unsigned long MySize;
#else
typedef unsigned int MySize;
#endif
3. 템플릿에서 사용
template <typename T>
using Vec = std::vector<T>;
Vec<int> v; // std::vector<int>와 동일
4. 함수 포인터
typedef void (*FuncPtr)(int, double); // typedef
using FuncPtr = void (*)(int, double); // using