본문 바로가기

BackEnd/C

자료형에 이름을 부여하는 typedef 키워드

반응형

1. typedef 키워드를 이용해서 자료형에 새이름을 부여




간단한 예제를 봐보자


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

#include <stdio.h>
 
typedef int INT;
typedef INT * PINT;
 
void SwapRef(PINT p1, PINT p2)
{
    INT tmp=*p1;
    *p1=*p2;
    *p2=tmp;
}
 
int main(void)
{
    INT val1=5;
    INT val2=7;
    printf("Swap 이전 [val1:%d, val2:%d] \n", val1, val2);
 
    SwapRef(&val1, &val2);
    printf("Swap 이후 [val1:%d, val2:%d] \n", val1, val2);
 
    return 0;
}
cs


3행에서 typedef  선언으로 인해서 8,15,16행과 같은 형태로 int형 변수의 선언이 가능하다.


4행에서 INT * 에 PINT라는 이름을 붙여준다. 


이처럼 3행에서 미리 만들어진 이름을 이용하여 typedef  선언을 하는 것도 얼마든지 가능하다. 


이 선언으로 인해 6행과 같은 형태의 매개변수 선언이 가능하다.



2. 배열 형에 typedef 선언하는 방법


double DBARR [5];


이는 길이가 5인 double형 배열의 선언이다. 


typedef double DBARR [5]; 


그런데 이 선언 앞에 typedef를 붙이면 의미가 완전히 달라진다.


여기서는 DBARR 이 자료형의 새로운 이름이다!


그리고 이것은 길이가 5인 double형 배열의 선언이다. 


따라서 다음과 같은 형태의 배열 선언이 가능하다.


DBARR arr;  //double DBARR [5]; 와 완전 동일


즉 배열 선언 앞에 typedef 를 붙여주면 배열의 이름이 typedef 에 의해 선언된 자료형의 이름으로 인식된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

#include <stdio.h>
typedef int IARR3[3];
typedef int I2ARR4[][4];
 
void Incre2Arr(I2ARR4 arr, int height);
void Print2Arr(I2ARR4 arr, int height);
 
int main(void)
{
    IARR3 arr1={123};
    I2ARR4 arr2={
        {1,  2,  3,  4},
        {5,  6,  7,  8},
        {9101112}
    };
 
    int i;
    for(i=0; i<3; i++)
        printf("%4d", arr1[i]);
 
    printf("\n\n");
 
    Print2Arr(arr2, 3);
    printf("\n");
 
    Incre2Arr(arr2, 3);
    Print2Arr(arr2, 3);
 
    return 0;
}
void Incre2Arr(I2ARR4 arr, int height)
{
    int i, j;
    for(i=0; i<height; i++)
        for(j=0; j<4; j++)
            arr[i][j]++;
}
 
void Print2Arr(I2ARR4 arr, int height)
{
    int i, j;
    for(i=0; i<height; i++)
    {
        for(j=0; j<4; j++)
        {
            printf("%4d", arr[i][j]);
        }
        printf("\n");
    }
}



cs


1
2
3
4
5
6
7
8
9
10
   1   2   3
 
   1   2   3   4
   5   6   7   8
   9  10  11  12
 
   2   3   4   5
   6   7   8   9
  10  11  12  13
 
cs



2행 : 길이가 3인 int형 배열의 형(type)에 IARR3라는 이름을 부여하고 있다. 이 선언으로 인하여 10


행과 같은 방식으로 길이가 3인 int형 1차원 배열을 선언할 수 있다.


3행 : 가로 길이가 4인 int형 2차원 배열의 형에 I2ARR4라는 이름을 부여하고 있다. 이 선언으로 인


하여, 11행과 같은 방식으로 가로 길이가 4인 int형 2차원 배열을 선언할 수 있다.


31, 39행 : 3행의 선언으로 만들어진 새로운 이름의 자료형 I2ARR4를 매개변수 선언에도 활용할 수

있음을 보이고 있다.


3. 다차원 배열 포인터의 typedef 선언


int (*I2ARR3) [3];


이는 가로 길이가 3인 int형 2차원 배열을 가리킬 수 있는 포인터 변수의 선언이다.


이 앞에 typedef 를 붙이면 


typedef int (*I2ARR3) [3];


I2ARR3은 포인터형의 이름이 된다.


4. typedef 선언의 이점


typedef 이용시 유지보수에 이점이 있다.


아래 두 코드를 비교해보자



만약 왼쪽 코드의 메인 함수의 반환값 을 제외한 모든 int를 double로 바꾼다고 해보자


그러면 총 4번의 변경이 필요하다. 


하지만 오른쪽 코드 같은 경우 typedef 에 선언된 int만 한번 바꿔주면 모든곳에 적용되는 이점이 있다!


반응형

'BackEnd > C' 카테고리의 다른 글

포인터의 const 선언  (0) 2019.03.14
메모리 공간의 동적 할당  (1) 2019.03.14
Call-By-Value vs Call-By-Reference  (0) 2019.03.14
다차원 배열 이름의 포인터형  (0) 2019.03.14
배열의 이름은 상수 형태의 포인터이다.  (0) 2019.03.13