C++를 사용한다면 타입 별칭(alias)을 만드는 데 사용되는 typedef와 using 키워드를 사용해 본 적이 있을 것이다. 타입 별칭은 기존 타입에 새 이름을 부여하는 방법으로 코드를 더 쉽게 읽고 유지 관리할 수 있다. 그러나 typedef와 using은 완전히 동일하지 않으므로 이 두 기능의 차이점을 이해하는 것이 도움이 될 수 있다.
타입 별칭 만들기
typedef와 using 모두 타입 별칭을 만드는 데 사용할 수 있다. 예를 들어 int 유형에 대한 새 이름을 만들고 싶을 경우, typedef를 사용하면 다음과 같이 작성할 수 있다.
typedef int MyInt;
이렇게 하면 int 타입에 해당하는 새 타입 별칭 MyInt가 생성된다. 다음과 같이 int 대신 MyInt를 사용할 수 있습니다:
MyInt x = 42;
using을 사용한 구문을 사용하여 동일한 타입 별칭을 만들 수 있다.
using MyInt = int;
이렇게 하면 int 유형과 동일한 새 유형 별칭 MyInt가 생성된다. typedef 버전과 동일한 방식으로 사용할 수 있다.
지금까지는 typedef와 사용법이 동일해 보인다. 하지만 주의할 몇 가지 차이점이 있다.
템플릿화된 타입 별칭
typedef와 using의 주요 차이점 중 하나는 using은 템플릿화된 타입 별칭을 만드는 데 사용할 수 있지만 typedef는 사용할 수 없다는 점이다. 템플릿화된 타입 별칭은 하나 이상의 템플릿 매개변수에 의존하는 타입에 대한 별칭입니다.
예를 들어, 템플릿화된 클래스 MyClass가 있다고 하자.
template<typename T>
class MyClass {
// ...
};
다음과 같이 사용하여 이 클래스의 타입 별칭을 만들 수 있다.
template<typename T>
using MyAlias = MyClass<T>;
이렇게 하면 MyClass<T>에 해당하는 새 타입 별칭 MyAlias가 생성된다. 다음과 같이 사용할 수 있다.
MyAlias<int> myObj;
이것은 typedef로는 불가능하다.
함수 포인터
typedef와 using의 또 다른 차이점은 using은 typedef보다 더 간결한 구문으로 함수 포인터를 선언하는 데 사용할 수 있다는 것이다. 예를 들어 두 개의 int 인수를 받아 int를 반환하는 함수에 대한 타입 별칭을 만들고 싶은 경우를 생각해보자.
typedef int (*MyFuncPtr)(int, int);
이것은 지정된 프로토타입을 가진 함수 포인터에 대한 유형 별칭 MyFuncPtr을 선언한다. 다음과 같이 사용할 수 있다.
MyFuncPtr func = someFunction;
using을 사용하면 보다 간결한 구문을 사용하여 동일한 결과를 얻을 수 있다.
using MyFuncPtr = int (*)(int, int);
이렇게 하면 이전과 동일한 타입 별칭인 MyFuncPtr이 생성되지만 코드가 줄어든다.
표현식 및 상수에 대한 별칭 만들기
C++에서 상수, 열거형 및 기타 유형의 표현식에 대한 별칭을 만드는 데 보다 범용적인 키워드로 사용할 수 있다는 점에서 강력한 기능이라고 할 수 있다.
#include <iostream>
int main() {
using Distance = double;
using Time = double;
using Velocity = Distance / Time; // Create an alias for the expression Distance / Time
return 0;
}
using을 사용하여 Distance 및 Time에 대한 별칭을 만든 다음 Distance / Time 표현식에 대한 별칭 Velocity를 만든다. 이 코드는 올바르게 컴파일되며 Velocity 별칭을 사용하여 표현식의 결과를 나타낼 수 있다. typedef 의 경우에는 Velocity로 별칭되는 표현식에는 사용할 수 없다.
마무리
typedef와 using은 모두 C++에서 타입 별칭을 만드는 데 사용되지만, 이 두 키워드 사이에는 몇 가지 차이점이 있다. using은 템플릿화된 타입 별칭을 만드는 데 사용할 수 있지만, typedef는 그렇지 못하다. 함수 포인터 타입을 표현하는데 좀 더 간결하게 나타낼 수 있다. 표현식과 상수에 대해 범용적인 형태로 타입을 정의할 수 있다. 일반적으로 using을 사용하는 것이 더 유연한 키워드로 더 다양한 상황에서 사용할 수 있다. 그러나 typedef는 여전히 기존 코드에서 널리 사용되고 있으며 이전 컴파일러와 더 잘 호환되는 등의 장점이 있다.