[C++] 왜 typedef 가 아닌 using을 사용해야 할까?
사용자 정의 자료형 또는 STL 컨테이너들을 사용하다보면 자료형이 매우 길어지기도 한다.
std::unique_ptr<std::vector<std::string>> 처럼 말이다.
그런 경우 우리는 편의를 위해 typedef 를 사용한다.
그런데 typedef 자체는 C++98부터 전해져오던 방식으로 구식이 되었다
C++11에서 사용하는데 문제는 없지만 별칭 선언(alias declaration)을 제공하기 때문이다.
그렇다면 별칭 선언은 무엇인가?!
바로 using 을 사용하는 것이다.
위 처럼 사용한다.
using 과 typedef는 하는 일이 완전히 같다.
그렇다면 왜 using을 사용하는 것이 더 좋을까?
함수포인터를 보자.
아래의 두 함수포인터는 모두 같은 일을 수행한다.
위 두 함수포인터는 완전히 같다.
그렇지만 대입 연산을 사용하는 아래(using)가 더 보기 좋아보인다.
using을 사용하는 것이 더 좋은 다른 이유는 템플릿 때문이다.
typedef는 템플릿화 할 수 없지만 using은 템플릿화 할 수 있다
이렇게 템플릿화된 별칭 선언을 별칭 템플릿(alias template)이라 한다.
다음의 예시를 보자.
단순한 리스트를 템플릿으로 사용한 것이다.
그렇다면 이와 같은 것을 typedef를 이용하려면 어떻게 해야할까
이렇게 사용해야 한다.
딱 보아도 길어보이지 않는가
거기다 변수를 선언할 때에도 차이가 있다.
위에가 using을 사용한 것
아래가 typedef를 사용한 것이다.
또한 typedef를 사용한 것의 문제점은 typename을 사용해야 하는 경우가 있다는 것이다.
바로 템플릿 매개변수로 지정된 형식의 객체를 담는 리스트를 생성하기 위해 템플릿 안에서 typedef 된 변수를 선언하려면 typename을 사용해야 한다는 것이다.
이렇게 말이다.
왜냐하면 MyList<t>는 템플릿 자료형 매개변수인 T에 의존적인 형태를 띈다.
소위 의존적 자료형인데 C++에서는 이러한 의존적 자료형의 이름 앞에는 반드시 typename을 붙여야 한다.
그러나 별칭 템플릿을 사용하면 위와 같이 하지 않아도 된다.
이처럼 말이다.
위 예시 또한 MyList가 T에 의존하는 것 처럼 보이지만 컴파일러는 그렇게 여기지 않는다.
컴파일 도중 MyList<T> 부분에 도달했을 때 컴파일러는 이미 MyList<T>의 자료형을 알고 있다.
MyList가 형식템플릿이므로 MyList<T>는 반드시 형식의 이름이어야 하기 때문이다.
따라서 MyList<T>는 비의존적 자료형이고 typename을 붙이지 않아도 된다.
'[프로그래밍 공부] > C&C++' 카테고리의 다른 글
[C/C++]댕글링 포인터 정리 (0) | 2022.05.19 |
---|---|
[C++] decltype 이란? (0) | 2022.01.22 |
[C++] enum class 사용하기 (0) | 2022.01.22 |
[C++] 범위 기반 for 문 (0) | 2022.01.22 |
[C] while문 안에서 scanf 받기 (0) | 2022.01.13 |