C++의 타입 별칭(alias) 이해하기: typedef와 using의 차이점

이상문
4 min readMay 2, 2023

--

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는 여전히 기존 코드에서 널리 사용되고 있으며 이전 컴파일러와 더 잘 호환되는 등의 장점이 있다.

--

--

이상문
이상문

Written by 이상문

software developer working mainly in field of streaming, using C++, javascript

No responses yet