본문 바로가기
Game DevTip/C++

4. C++ Typedef(타입 별칭)에 대해서

by LIKE IT.라이킷 2024. 12. 5.

1. 타입 별칭이란?

  • 다른 타입과 동의어인 이름 -> 복잡한 정의를 더 간단하게 바꿔줌.
    자료형을 다른 이름으로 재정의 한다고 생각하면 된다.

* 전통적인 typedef 별칭 선언

typedef double wages;		// wages는 double과 동일어.
typedef wages base, *p		// base는 double, p는 double*이다.

 

위에 코드 예시를 보면 첫번쨰 줄에서는 동의어를 선언,
아래는 위에 만든 동의어를 이용해서 다시한번 동의어를 만들며
포인터를 만드는 방식으로 응용을 한 것이다.

 

즉, typedef로 동의어를 선언할 때 typedef가 맨 앞에,
그 뒤에 타입(int, double, char등등..) 마지막으로 동의어 이름을 지정하면 된다.

 

어떻게 보면 typedef 키워드는 선언에서 바탕타입의 일부분처럼 보일 수도 있지만,
typedef를 포함한 선언은 변수가 아니라 타입 별칭이다.

2. using 별칭 선언

using SI = Sales_item; 	// SI는 클래스인 Sales_item과 동의어이다.
using num = int;		// num은 기본타입인 int와 같은 동의어이다.
  • using을 사용한 별칭 선언은 using 키워드로 시작하고서 이후 이름과 '='가 온다.
wages hourly, weekly;		//double hourly, weekly;와 같다.
SI item;					//Sales_item item;과 같다.

 

보다시피 using과 typedef모두 타입별칭을 만들어 사용할 수 있지만,
여기에는 두 키워드의 차이점이 약간씩 존재한다.

 

차이점 정보 출처 : 

https://moony211.medium.com/c-의-타입-별칭-alias-이해하기-typedef와-using의-차이점-334f1722be95
 

C++의 타입 별칭(alias) 이해하기: typedef와 using의 차이점

C++를 사용한다면 타입 별칭(alias)을 만드는 데 사용되는 typedef와 using 키워드를 사용해 본 적이 있을 것이다. 타입 별칭은 기존 타입에 새 이름을 부여하는 방법으로 코드를 더 쉽게 읽고 유지 관

moony211.medium.com

 


 

둘의 주요 차이점 중 하나가 바로 using은 템플릿화된 타입별칭을 만들 수 있지만,
typedef는 그러지 못한다는게 가장 큰 차이점 중 하나이다.


즉, 클래스의 타입 별칭이 만들어졌으면 무조건 using을 사용해야 한다는 것이다.

두번쨰 차이점은 using이 typedef보다 조금 더 간결하다는 것.


특히 함수 포인터를 선언하는데 더 간결하게 문장을 만들어 사용할 수 있다는 것이다.

//typedef의 경우.

typedef int (*MyFuncPtr)(int, int);
MyFuncPtr func = someFunction;
  • typedef는 타입 별칭 선언 따로 정의따로 해야한다.
//using의 경우.

using MyFuncPtr = int (*)(int, int);
  • using의 경우는 타입 별칭을 선언함과 동시에 정의로 간결하게 동일한 결과를 얻을 수 있다.

뭐 그렇다고 해서 typedef가 잘 안쓰이는 것은 아니고,
호환성이나 대중성이 워낙 좋은탓에 using보다 더 자주 볼 수 있는 것이 typedef가 되겠다.

3. 포인터 constsr 타입 별칭

typedef char *pstring;
const pstring cstr = 0; //cstr은 char에 대한 const 포인터이다.(const *char cstr)
const pstring *ps; 	//ps는 char에 대한 상수포인터의 포인터이다.(const*char *ps;)

 

typedef에 포인터를 사용하여 이런식으로 사용도 가능하다.

주로 포인터를 typedef에다 쓰는 것은 함수포인터를 만들때 사용한다.

 

코드 예시 출처 : https://elecs.tistory.com/97 (너무 잘 정리 되어있습니다.)

#include<iostream> 
using namespace std;

typedef void (*ptrfunc)(int); //int는 인자 값 전달 목적.

void testprint(int n)
{    
	cout << "Number : " << n << endl;
} 

int main(){    

	testprint(100);    
	ptrfunc elecs;    
	elecs = testprint;    
	elecs(77);     
	
    return 0;

}

 

이렇게 빈번하게 반복되어 사용되는 소스코드가 복잡하고 길면
typedef를 사용하여 간결하게 사용이 가능하다.

ptrfunc elecs;
elecs = testprint;
elecs(77);

 

이 부분에서 보다시피 ptrfunc으로 정의된 typedef문의 함수포인터를 elecs이라는
이름의 함수포인터로 하나 만들었다고 보면 된다.
(함수포인터인 변수 하나가 생겼다고 보면 됨.)

 
반응형

'Game DevTip > C++' 카테고리의 다른 글

6. C++ string 타입에 대해서  (0) 2024.12.05
5. C++ auto & decltype에 대해서.  (0) 2024.12.05
3. C++ constexpr에 대해서  (1) 2024.12.05
2. C++ const에 대하여  (0) 2024.12.05
1. C++ 변수사용 Tip에 대해서.  (0) 2024.12.05

댓글