본문 바로가기

[C++] 왜 typedef 가 아닌 using을 사용해야 할까?

Kwonriver 2022. 1. 22.
728x90

사용자 정의 자료형 또는 STL 컨테이너들을 사용하다보면 자료형이 매우 길어지기도 한다.

std::unique_ptr<std::vector<std::string>> 처럼 말이다.

그런 경우 우리는 편의를 위해 typedef 를 사용한다.

그런데 typedef 자체는 C++98부터 전해져오던 방식으로 구식이 되었다

C++11에서 사용하는데 문제는 없지만 별칭 선언(alias declaration)을 제공하기 때문이다.

 

그렇다면 별칭 선언은 무엇인가?!

바로 using 을 사용하는 것이다.

위 처럼 사용한다.

 

using 과 typedef는 하는 일이 완전히 같다.

그렇다면 왜 using을 사용하는 것이 더 좋을까?

 

함수포인터를 보자.

아래의 두 함수포인터는 모두 같은 일을 수행한다.

같은 동작을 수행하는 typedef 로 정의된 함수 포인터와 using 정의된 함수 포인터

 

위 두 함수포인터는 완전히 같다.

그렇지만 대입 연산을 사용하는 아래(using)가 더 보기 좋아보인다.

 

using을 사용하는 것이 더 좋은 다른 이유는 템플릿 때문이다.

typedef는 템플릿화 할 수 없지만 using은 템플릿화 할 수 있다

이렇게 템플릿화된 별칭 선언을 별칭 템플릿(alias template)이라 한다.

 

다음의 예시를 보자.

 

단순한 리스트를 템플릿으로 사용한 것이다.

그렇다면 이와 같은 것을 typedef를 이용하려면 어떻게 해야할까

이렇게 사용해야 한다.

딱 보아도 길어보이지 않는가

거기다 변수를 선언할 때에도 차이가 있다.

typedef 를 사용한 코드가 더 길다

위에가 using을 사용한 것

아래가 typedef를 사용한 것이다.

 

또한 typedef를 사용한 것의 문제점은 typename을 사용해야 하는 경우가 있다는 것이다.

바로 템플릿 매개변수로 지정된 형식의 객체를 담는 리스트를 생성하기 위해 템플릿 안에서 typedef 된 변수를 선언하려면 typename을 사용해야 한다는 것이다.

이렇게 말이다.

왜냐하면 MyList<t>는 템플릿 자료형 매개변수인 T에 의존적인 형태를 띈다.

소위 의존적 자료형인데 C++에서는 이러한 의존적 자료형의 이름 앞에는 반드시 typename을 붙여야 한다.

 

그러나 별칭 템플릿을 사용하면 위와 같이 하지 않아도 된다.

이처럼 말이다.

위 예시 또한 MyList가 T에 의존하는 것 처럼 보이지만 컴파일러는 그렇게 여기지 않는다.

컴파일 도중 MyList<T> 부분에 도달했을 때 컴파일러는 이미 MyList<T>의 자료형을 알고 있다.

MyList가 형식템플릿이므로 MyList<T>는 반드시 형식의 이름이어야 하기 때문이다.

따라서 MyList<T>는 비의존적 자료형이고 typename을 붙이지 않아도 된다.

728x90

'[프로그래밍 공부] > 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