티스토리 뷰


기존의 소스 코드에 쓰고 있는 forward declaration을 그대로 사용했더니 코드리뷰에서 typedef를 쓰지 말라는 리뷰가 왔다. 그래서 찾아보니 모던C++에서는 이제 typedef를 사용하지 않고 using 키워드를 사용한다고 하였다. 따라서 각 키워드의 다른 점을 살펴보았다.



* typedef vs using 차이점

typedef std::shared_ptr<MyClass> MyClassPtr;
using MyClassPtr = std::shared_ptr<MyClass>;


위와 같이 보면 일단 문법이 다른 것을 알 수 있다. 기존의 typedef 키워드의 문법은 앞의 타입형을 뒤에 있는 이름으로 축소해서 사용하겠다는 것을 의미하고, using 키워드는 약간 변수 할당과 비슷한 느낌으로 MyClassPtr에 std::shared_ptr<MyClass>를 대입하는 것과 같은 느낌으로 사용하게 된다. 사실 용법의 차이는 있지만 이러한 사용법은 둘 사이의 차이가 없다.


하지만 이러한 용법이 아닌 함수형을 정의할 때에는 읽는데 조금 다르게 느껴질수도 있다. 아래는 함수형을 정의하는 각각의 예이다.


typedef std::shared_ptr<MyClass> my_make_shared(int, std::string);
using my_make_shared = std::shared_ptr<MyClass>(int, std::string);


위의 두 가지는 동일한 일을 수행하는 구문이지만, C++에 익숙하지 않은 다른 언어의 개발자가 보기에 더 직관적인 구문은 바로 using 키워드일 것이다. 왜냐하면 typedef에서 실제로 새로 정의되는 이름인 my_make_shared는 중간에 있어서 typedef에 대해서 조금 더 알아야 하지만, using은 그냥 바로 my_make_shared라는 이름에 뭔가가 할당된다는 것을 직관적으로 알 수 있기 때문이다.


그리고 기능적으로 100% 같은 것은 아니고 다른 점이 있다면 using 키워드는 template을 지원한다는 점이 다르다. 아래와 같이 using 키워드는 template을 사용할 수 있지만, typedef 키워드는 사용할 수 없다. 


template <typename T>
using my_make_shared = std::shared_ptr<T>(T*);

template <typename T>
using my_vector = std::vector<T>;

따라서 새로운 데이터형의 alias를 부여할 때 템플릿도 함께 사용하고 싶다면 using 키워드를 사용하면 된다. 이렇게 템플릿으로 활용 가능한 것만 using 키워드와 typedef 키워드의 기능적으로 있는 차이이고, 표준에서도 명시하기를 내부적으로 using 키워드와 typedef 키워드는 동일하다고 명시하고 있다. 따라서 템플릿을 사용하지 않을 것이라면 굳이 using 키워드를 강제할 필요는 없고 최근의 모던C++ 표준화 작업들은 기존의 소스 코드를 망가뜨리는 deprecation을 하지 않고 하위 호환을 지원해준다고하니 현재 작업하는 소스의 코딩 표준에 맞는 키워드를 사용하면 될 것이다.


하지만 앞서 이야기한 것처럼 코드리뷰에서 typedef가 아닌 using 키워드를 사용하라는 조언이 있었듯 현재 소스 코드가 모던C++을 사용하고 있다면 그냥 속편하게 using 키워드를 사용하는 것이 나중에 코드리뷰로 인해 마음 상할 일이 없는 방향이라고 생각한다.



* 읽을거리

http://stackoverflow.com/questions/10747810/what-is-the-difference-between-typedef-and-using-in-c11

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함