Type Aliases
데이터형 대용 이름
- 복잡한 데이터형을 대용 이름으로 처리하여 코드 가독성을 제고한다.
- 포인터 데이터형 또한 대체가능하다.
Way I. Preprocessor "#define" 이용하기
#define BYTE char
// 소스코드 상에서 컴파일시에 BYTE를 char로 대체하게 한다.
- 소스코드상에서 "BYTE"라는 단어가 나타날 때마다 "char"로 대체한다.
- BYTE가 char의 대용이름이 된다.
Way II. Keyword \(\texttt{typedef}\) 이용하기
typedef char BYTE;
// BYTE를 char의 대용이름으로 한다.
// 일반형
typedef typeName aliasName;
- \(\texttt{typedef}\) 키워드를 응용해서 템플릿을 구현할 수 있다.
// Ex. typedef를 이용한 템플릿 구현
typedef unsigned long Item; // 스택 항목의 데이터형을 바꾸고자 한다면, 이 구문의 내용만 바꾸면 된다.
class Stack {
private:
enum {MAX = 10};
Item items{MAX};
int top;
public:
Stack();
bool push(const Item& item);
bool pop(Item& item);
bool isEmpty() const;
bool isFull() const;
};
※ 하지만, \(\texttt{typedef}\)는 \(\texttt{template}\) 에 비해 아래 두 가지 한계점을 지닌다.
1. \(\texttt{typedef}\)를 이용한 템플릿은 데이터형을 변경할 때마다 헤더파일을 수정해야 한다.
2. 프로그램당 한 종류의 스택만 생성 가능하다.
전처리기를 이용한 방법과 \(\texttt{typedef}\) 을 이용한 방법의 차이
- 전처리기 "#define"을 이용할 경우 아래의 코드와 같이 해석된다.
#define FLOAT_POINTER float *
FLOAT_POINTER pa, pb;
// 위 소스코드는 아래와 같이 해석할 수 있다.
float * pa, pb;
// pa는 float* 타입으로, pb는 float 타입으로 선언된다.
- \(\texttt{typedef}\)을 사용하면 이런 문제가 발생하지 않는다. 복잡한 데이터형을 대용이름으로 처리할 수 있기 때문에
\(\texttt{typedef}\) 키워드를 이용하는 것이 #define보다 좋은 선택이라 할 수 있다.