C++에서 typdef와 using 둘 다 별칭 생성 키워드이다.
그러면 차이점이 뭘까? 동일한 기능의 키워드가 왜 두 개 존재하게 되었을까?
typdef
- typedef란?
typdef는 C언어에서 사용되던 문법이다.
타입의 이름에 대한 별칭을 생성하는데 사용된다.
즉, struct나 class에 대해서만 사용 가능하다.
- Typedef 예제 코드
typedef double distance_t;
class Circle {
public:
distance_t radius;
};
// double 타입에 대한 별칭으로 distance_t를 생성하였다.
using
- Using이란?
C++11부터 추가된 문법.
Typedef와 다르게 타입뿐만 아니라 변수, 함수, 템플릿 등 모두 별칭 생성이 가능하다.
- using 예제 코드 1
using myInt = int;
myInt i = 4;
// int 타입에 대한 별칭으로 myInt를 생성하였다.
- using 예제 코드 2
using namespace std;
// std::cout (x)
// cout (o)
// namespace와 함께 사용하면, 해당 namespace의 모든 멤버들을 namespace없이 직접 사용할 수 있다.
예를 들면, std::cout 으로 사용하던 것을, 단순히 cout으로 사용할 수 있다.
typdef와 using 모두 별칭 생성 키워드이지만, 사용할 때 큰 차이점이 있다.
typdef는 해당 scope 내에서만 사용이 가능하다. 그러나 using은 다른 scope에 있는 것을 가져와 사용하는 것이 가능하다.
- 예제 코드
namespace ns {
typedef int* intptr;
using intptr2 = int*;
}
int main() {
// 예제1: typdef
/* ERROR 아래와 같이 사용 불가
typdef ns::intptr intptr3;
intptr3 y = new int;
std::cout << *y << std::endl;
*/
/* ERROR 아래와 같이 사용 불가
typdef ns::intptr2 intptr4;
intptr4 y = new int;
std::cout << *y << std::endl;
*/
// intptr 별칭 중복 정의
typedef int* intptr;
intptr x = new int;
std::cout << *x << std::endl;
delete x;
// 예제 2: using - 가져와서 사용 가능
using ns::intptr2;
intptr2 y = new int;
std::cout << *y << std::endl;
delete y;
return 0;
}
- ns 네임스페이스에 정수형 포인터 타입의 별칭으로 intptr, intptr2를 생성하였다. 각각 typedef와 using을 사용하였다.
- ns 네임스페이스 바깥에서 해당 별칭을 사용하려고 한다.
- typedef는 다른 scope에 있는 별칭을 가져와서 사용하는 것이 불가하다.
- 그러나 using 키워드는 다른 scope에 있는 별칭을 가져와서 사용하는 것이 가능하다.