[C] typedef: typedef의 사용법과 특징, 구조체 활용
typedef란?
typedef를 사용하면 새로운 자료형을 정의할 수 있다. 즉, typedef 키워드를 사용해 C의 기본 자료형을 확장할 수 있다.
사용하는 방법은 다음과 같다.
typedef unsigned char BYTE;
unsigned char은 기존의 자료형, BYTE는 새로운 자료형이다. 기존의 자료형 unsigned char을 새로운 자료형 BYTE로 정의하는 것이다.
unsigned char 형은 작은 정수를 저장하는 데에 사용할 수 있다. unsigned char만 보았을 때 정수를 저장하는 데 사용된다는 것을 알기 어렵기 때문에 BYTE라는 이름으로 새롭게 정의해준 셈이다.
이렇게 정의된 BYTE는 다음과 같이 사용할 수 있다.
BYTE index; // unsigned char index;와 같다.
구조체를 사용한 새로운 자료형
아래와 같은 구조체가 있다고 하자.
struct point {
int x;
int y;
};
위 구조체를 typedef를 사용해 새로운 타입으로 정의할 수 있다.
typedef struct point POINT;
struct point는 기존의 자료형, POINT는 새로운 자료형이다. 이제 POINT라는 새로운 자료형이 생성됐기 때문에 struct point 대신 POINT를 사용할 수 있게 되었다.
struct point a, b;
POINT a, b;
둘 중 아래가 훨씬 간결하고 편리한 것을 볼 수 있다.
구조체를 선언할 때 typedef를 같이 사용할 수도 있다.
typedef struct point {
int x;
int y;
} POINT;
typedef의 장점
이식성을 높여준다.
가장 큰 장점은 자신의 코드를 컴퓨터 하드웨어에 독립적으로 만들 수 있다는 점이다. 컴퓨터 시스템에 따라서 int형은 2바이트이기도 하고 4바이트이기도 하다. 만약 int형 대신에 typedef를 사용한 INT32나 INT16을 사용하게 되면 확실하게 2바이트인지 4바이트인지를 지정할 수 있다. 만약 컴퓨터 시스템이 달라지면 typedef 정의만 변경하면 된다.
C 컴파일러가 size_t나 time_t와 같은 자료형을 만들어서 사용하는 이유도 이러한 이유 때문이다. 이 값은 컴퓨터 시스템에 다라서 달라질 수 있기 때문에 자료형을 고정시키지 않고 헤더 파일에서 정의한 size_t, time_t를 사용하는 것이다.
실제로 Visual C++에서는 다음과 같이 stdio.h에 size_t가 정의되어 있다.
typedef unsigned int size_t;
#define과의 차이점
#define UINT32 unsigned int
#define을 사용해서 이렇게 정의할 수도 있다. 이렇게 정의하면 전처리기가 UINT32를 unsigned int로 대치하게 된다. 따라서 결과는 비슷하다.
그러나 #define 보다는 typedef가 훨씬 좋은 방법이다. typedef는 컴파일러가 직접 처리한다. 따라서 typedef는 단순하게 문자열을 다른 문자열로 대치하는 #define과 완전히 다르다.
아래와 같은 자료형의 정의는 #define으로 절대 정의할 수 없다.
typedef float VECTOR[2]; // 실수 2개로 이루어진 1차원 배열
문서화의 역할
typedef를 사용하게 되면 주석을 붙이는 것과 같은 효과가 있다. 즉, 구조체가 무엇을 표현하는 것인지를 보다 확실하게 알 수 있다.