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에 대하여 알아보았는데요,
다음 포스팅에서는 지금까지 배운 것들을 토대로 여러 가지 문제들을 풀어보는 시간을 가져보도록 하겠습니다.
긴 글 읽어주신 독자분들께 진심으로 감사드립니다~
'c언어' 카테고리의 다른 글
c언어 이중 포인터에 대하여 알아보기 (0) | 2023.02.04 |
---|---|
c언어 구조체, typedef를 이용하여 여러가지 문제 풀어보기(2차원 공간 상의 점을 구조체로 표현하기, 사각형을 구조체로 나타내기, 벡터 연산하기, 2차원 공간 상의 점을 typedef를 이용해서 정의.. (0) | 2023.02.04 |
c언어 열거형에 대하여 알아보기 (0) | 2023.01.31 |
c언어 공용체에 대하여 알아보기 (0) | 2023.01.30 |
c언어 구조체와 함수와의 관계 알아보기 (0) | 2023.01.30 |
댓글