Study/Programming Language

[C] typedef: typedef의 사용법과 특징, 구조체 활용

찬 주 2024. 3. 23. 00:53

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를 사용하게 되면 주석을 붙이는 것과 같은 효과가 있다. 즉, 구조체가 무엇을 표현하는 것인지를 보다 확실하게 알 수 있다.