상세 컨텐츠

본문 제목

typedef & using

C++ Basic

by 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

 

'C++ Basic' 카테고리의 다른 글

scanf vs cin and getline()  (1) 2024.12.13

관련글 더보기