우리는 구조체를 정의하고 구조체 타입의 변수를 선언할 때에도 항상 struct 선언을 같이 해주어야 했어요. typedef 선언자를 사용하면 이런 번거로운 작업을 줄일 수 있습니다. 먼저 typedef 선언은 간단히 말해서 자료형에 새로운 이름을 붙여주는거에요. 코드를 통해서 여러가지 케이스를 보며 알아보죠.

#include <stdio.h>

struct person
{
    char name[10];
    int age;
    char bltp;
};

typedef char INT1; //1byte 정수 자료형 char를 INT1로 명명
typedef unsigned char UINT1; // 1byte 부호없는 정수 자료형 unsigned char를 UINT1로 명명
typedef int INT4; // 4byte 정수 자료형 int를 INT4로 명명
typedef unsigned int UINT4; // 4byte 부호없는 정수 자료형 unsigned int를 UINT4로 명명
typedef long INT8; // 8byte 정수 자료형 long을 INT4로 명명
typedef unsigned long UINT8; // 8byte 부호없는 정수 자료형 unsigned long을 UINT8로 명명
typedef char * PTR_INT1; // char 포인터형을 PTR_INT1로 명명
typedef int * PTR_INT4; // int 포인터형를 PTR_INT4로 명명
typedef unsigned char * PTR_UINT1; // unsigned char 포인터형을 PTR_UINT1로 명명 
typedef unsigned int * PTR_UINT4; // unsigned int 포인터형을 PTR_UINT4로 명명
typedef struct person Person; //구조체 person 자료형을 PERSON로 명명

int main(void)
{
    INT4 num = 10;
    INT1 ch = ‘A’;
    Person per1 = {“John”, 20, ‘B’};
    PTR_INT4 ptr = #

    printf(“%d %c %#x %s %d %c\n”, num, ch, ptr, per1.name, per1.age, per1.bltp);

    return 0;
}

실행결과

10 A 0xaffc68 John 20 B

계속하려면 아무 키나 누르십시오 . . .

위에서 char, int, long, unsigned char, unsigned int, unsinged long를 각각 INT1, INT4, INT8, UINT1 UINT4, UINT8로 재명명 했습니다. 이렇게 함으로써 모두 정수(integer)이라는 것을 쉽게 알아볼 수 있고 얼마만큼의 메모리공간을 차지하는지 한눈에 알아볼 수 있어요. 그리고 구조체를 재명명 함으로써 우리는 struct person per1 대신 Person per1으로 구조체변수를 선언할 수 있게 됐습니다. 다만 위처럼 typedef로 자료형의 이름을 지을때는 대문자로 하는것이 관례입니다. 이는 기본자료형과 새로 정의된 자료형을 구분하기 위함입니다.

위의 코드에서는 person이라는 구조체를 먼저 정의하고 typedef struct person Person; 의 문장을 넣어서 구조체의 이름을 지었어요. 그런데 사실 구조체를 정의하는 동시에 새로운 이름을 부여할 수 있습니다. 그리고 이런식의 구조체 정의가 현업에서 훨씬 많이 사용됩니다. 어떻게 하는지 코드를 통해 봅시다.

#include <stdio.h>
typedef struct person
{
    char name[10];
    int age;
    char bltp;
}Person; //구조체를 정의함과 동시에 typedef 선언으로 새로운 자료형의 이름 명명

int main(void)
{
    Person per1 = {“John”, 20, ‘A’};
    Person per2 = {“Kelly”, 41, ‘B’};

    printf(“%s %d %c\n”, per1.name, per1.age, per1.bltp);
    printf(“%s %d %c\n”, per2.name, per2.age, per2.bltp);

    return 0;

}

실행결과

John 20 A

Kelly 41 B

계속하려면 아무 키나 누르십시오 . . .

위의 코드에서는 구조체를 정의함과 동시에 typedef선언을 사용해서 새로운 이름을 부여합니다. 그렇기때문에 사실상 person이라는 구조체의 이름이 필요가 없어집니다. 물론 위처럼 정의를 하고도 struct person per1; 처럼 변수를 선언할 수도 있지만 굳이 그러지 않는것이 보다 일반적이에요.

#include <stdio.h>

typedef struct //person 생략
{
    char name[10];
    int age;
    char bltp;
}Person; //구조체를 정의함과 동시에 typedef 선언으로 새로운 자료형의 이름 명명

int main(void)
{
    Person per1 = {“John”, 20, ‘A’};
    Person per2 = {“Kelly”, 41, ‘B’};

    printf(“%s %d %c\n”, per1.name, per1.age, per1.bltp);
    printf(“%s %d %c\n”, per2.name, per2.age, per2.bltp);

    return 0;
}

실행결과

John 20 A

Kelly 41 B

계속하려면 아무 키나 누르십시오 . . .

person이라는 원래의 구조체 이름을 생략하고 typedef를 통해서 새로이 명명할 이름만 남겨두어도 문제가 없습니다.

우리는 항상 새로운 변수를 알고나면 함수로 인자를 전달하는 방법에 대해서도 논했었습니다. 일반 자료형, 배열, 포인터변수, 포인터배열 등등을 함수의 인자로 전달하는 방버에 대해서 배웠어요. 구조체 변수 역시 당연히 함수의 인자로 전달이 가능한데 어떻게 하는지는 다음시간에 알아보겠습니다.

'프로그래밍 언어 > C' 카테고리의 다른 글

(C언어) 42 - 선행처리 - 매크로  (0) 2020.05.14
(C언어) 41 - 구조체의 함수 전달  (0) 2020.05.14
(C언어) 39 - 구조체(2)  (0) 2020.05.14
(C언어) 38 - 구조체(1)  (0) 2020.05.14
(C언어) 37 - 버퍼(Buffer)  (0) 2020.05.14

+ Recent posts