본문 바로가기
c언어

c언어 typedef에 대하여 알아보기

by 개발자 L 2023. 2. 3.
반응형

c언어 typedef에 대하여 알아보기

네 안녕하세요, 이번 포스팅에서는 'typedef'에 대하여 알아보도록 하겠습니다.

typedef는 c언어로 프로그램을 개발을 한다면 실전에서 정말 많이 쓰이게 될 녀석입니다.

그래서 그만큼 중요하기 때문에 그냥 넘기면 안 되는 부분입니다.

그럼 지금부터 시작하도록 하겠습니다.

 

1. typedef란?

typedef는 개발자가 자신이 필요한 자료형을 자체적으로 정의해서 쓰는 것입니다.

그래서 typedef는 새로운 자료형을 정의할 때 쓰는 함수입니다.

쓰는 방법은 이렇습니다.

typedef unsigned char BYTE; // 기존에 있던 자료형인 unsigned char을 새로운 자료형 이름인 BYTE로 정의함.

이런 식으로 써서 정의를 합니다.

이제 이렇게 되면 이런 식으로 쓸 수 있습니다.

BYTE index; // unsigned char index와 같음.

이렇게 기존에 존재했던 자료형 대신 새로운 이름을 지어줬으므로, 이렇게 쓸 수 있습니다.

제가 몇 가지 예시를 더 들어보도록 하겠습니다.

typedef int INT32;
typedef short INT16;

INT32 i; // = int i;
INT16 j; // = short j;

 

2. 구조체로 새로운 자료형 만들기

typedef는 이런 간단한 자료형을 정의하는 것 뿐만 아니라,

구조체와 같이 복잡한 구조의 형식을 가진 것도 새로운 자료형으로 정의를 할 수 있습니다.

제가 하나의 예를 들어보도록 하겠습니다.

struct point
{
    int x;
    int y;
};

이러한 구조체를 만들었다고 가정을 합시다.

이걸 typedef로 재구성을 하여 선언을 하게 되면 이런 일이 벌어집니다.

typedef struct point POINT; // struct point를 POINT로 재정의 함.

POINT a, b; // struct point a; , struct point b;와 같음.

이렇게 문장 자체가 간결해집니다.

그리고 구조체의 틀을 만들 때 동시 선언도 가능합니다.

typedef struct point
{
    int x;
    int y;
}POINT;

이런 식으로 말이죠.

그리고 주로 많이 쓰이는 것들이 있는데,

예를 들면 복소수와 같은 복잡한 수가 들어가는 구조체, 불 자료형(참 또는 거짓이 들어가는 자료형),

문자열 자료형 포인터 등에 두루두루 쓰입니다.

이런 식으로 말이죠.

// 복소수 자료형
typedef struct complex
{
    double real;
    double imag;
} COMPLEX;

COMPLEX x, y;

// 불 자료형
typedef enum {TRUE, FALSE} BOOL;

BOOL condition;

// 문자열 자료형 포인터
typedef char * STRING_PTR;

STRING_PTR p; // char *p;
반응형

 

3. typedef의 장점

typedef를 썼을 경우 이러한 장점이 있습니다.

 

3 - 1. 이식성을 높여준다.

자신만의 코드를 만들기 때문에 가독성이 높아질 뿐더러,

하드웨어에 독립적으로 만들 수 있기 때문에 이식성이 높아집니다.

하나의 예로, 컴퓨터는 시스템 체계에 따라서 int형이 2바이트인 경우가 있고, 4바이트인 경우가 있는데,

typedef를 쓸 경우에는 확실하게 바이트 수를 지정할 수 있어서 시스템 상황에 따라 유동적으로 변경이 가능합니다.

그래서 실제로 c언어 컴파일러가 'size_t', 'time_t'와 같은 자료형을 만들어 쓰는 이유도 컴퓨터 시스템에 따라서

유동적으로 값을 변경하여 연산하기 위해 자료형을 고정하지 않겠다는 의미이기도 합니다.

그리고 c언어를 베이스로 만들어진 c++의 경우에는 'stdio.h' 헤더 파일에 size_t가 저의가 되어있습니다.

 

3 - 2. #define으로 정의하거나 처리 불가능한 자료도 정의 가능하다.

typedef 대신에 #define을 이용해도 비슷한 효과를 줄 수 있습니다.

이런 식으로 말이죠.

#define UNIT32 unsigned int

이렇게 하면 전처리기가 UNIT32를 unsigned int형으로 처리하게 됩니다.

하지만 결론을 먼저 말씀드리자면,

typedef가 #define의 상위 호환이라고 볼 수 있습니다.

그 이유는 typedef는 컴파일러가 직접 처리를 하기 때문에 #define처럼

단순히 선언을 한 문자열을 다른 문자열로 대체하는 것과 완전히 다르기 때문입니다.

예를 들어서 행렬 같은 것에서 쓰이는 벡터값을 나타내는 'VECTOR' 같은 자료형은 #define으로 정의가 불가능한데,

typedef를 이용하면 가능합니다.

 

3 - 3. 문서화의 역할도 한다.

typedef를 사용하게 되면 주석을 붙이는 것과 같은 효과가 있습니다.

이를테면 좌표를 나타낼 때 주로 정의하는 자료형인 POINT,

행렬을 나타낼 때 주로 정의하는 자료형인 MATRIX 등과 같은 이름을 쓰게 되면 구조체 등과 같이

복잡한 자료형들이 무엇을 나타내는지 금방 알 수 있습니다.

 

여기까지 typedef에 대하여 알아보았는데요,

다음 포스팅에서는 지금까지 배운 것들을 토대로 여러 가지 문제들을 풀어보는 시간을 가져보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사드립니다~

반응형

댓글