본문 바로가기
SWE/C++ OOP

[C++] typedef와 using의 차이점

by S나라라2 2023. 5. 7.
반응형

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에 있는 별칭을 가져와서 사용하는 것이 가능하다.

 

반응형