typedef 문법
구조체를 배우기 전에 먼저 알아야 할 문법이 있다. 바로 typedef 문법이다. typedef는 타입을 정의한다는 의미의 'type define'의 줄임 표현이며, 기존의 자료형 중에 자료형 이름의 길이가 긴 경우 프로그래머가 짧고 간결하게 자료형을 재정의하는 문법이다. #define과 기능이 비슷해 보이지만 #define은 치환 작업을 수행하는 전처리기이고 typedef는 기존 자료형을 다른이름으로 새롭게 정의하는 기능이다.
기존 자료형을 단순한 형태의 새 자료형으로 바꾸기
typedef 문법이 가장 흔하게 사용되는 경우는 기존 자료형의 이름이 너무 길어서 새로운 자료형으로 재정의해야 할 때 이다. 예를 들어 프로그램에서 unsigned short int 형을 많이 사용하는데 자료형의 이름이 너무 길면 쓸때마다 번거롭다. 그래서 US라는 이름으로 줄여서 사용하고 싶다면, 다음과 같이 typedef 키워드를 사용하면 된다는 것이다.
typedef unsigned short int US; /*unsigned short int형을 US라는 새로운 이름으로 정의함*/
US temp; /*unsigned short int temp; 라고 쓴것과 같음*/
typedef의 장점1 : 복잡해 보이는 문법을 쉽게 표현할 수 있다
typedef는 일반 변수 형식뿐만 아니라 배열, 포인터와 같은 형식도 재정의할 수 있다. 예를 들어 다음과 같이 특정 배열을 하나의 자료형처럼 재정의할 수 있다는 뜻이다.
typedef int MY_DATA[5];
MY_DATA temp; /*int temp 5;라고 선언한 것과 같음*/
사실 앞의 예제처럼 배열을 치환하는 형태는 특별한 이점이 없어 보인다. 배열을 더 쉽게 표현했다고 보기도 어렵다. 하지만 다음 코드를 보면 생각이 달라진다.
int (*p)[5]; /*4바이트의 int형 포인터를 5개 선언하여 20바이트의 사용범위를 가짐*/
위와 같이 포인터를 선언하면 20바이트의 사용범위를 가지는 포인터 변수가 만들어진다. 즉 포인터 변수 p의 크기는 4바이트이며 자신이 가리킬 대상의 크기는 int[5]라는 뜻이다. 이 선언이 복잡해 보이는 이유는 우선순위 때문에 괄호까지 사용해서 그렇다. 다시 선언해보자
typedef int MY_DATA[5];
MY_DATA *p; /* int (*P)[5]라고 선언한것과 같음*/
앞에서 본 코드와 다른 게 무엇인지 알아차렸는가? MY_DATA *p;라고 적은 코드에서 p변수는 누가 봐도 포인터 변수이다. 그리고 포인터 변수 p가 가리키는 대상의 크기는 MY_DATA, 즉 int [5]입니다. 이렇듯 문법을 이해하기 힘들거나 자료형이 너무 복잡하게 적용되었을때 typedef를 사용하면 좀 더 보기 편한 형태로 사용할 수 있다.
typedef의 장점2 : 자료형의 크기를 쉽게 바꿀 수 있다.
우리가 기존에 사용하던 char, int 와 같은 기본 자료형은 운영체제에 따라 크기가 1바이트, 4바이트로 고정되어 있다.
따라서 다음과 같이 char로 선언한 age 변수의 크기는 1바이트이기 때문에 이 변수의 크기를 2바이트로 변경하려면 자료형을 short int로 변경해야 한다.
/* age 변수의 크기를 1바이트에서 2바이트로 변경해야 하는 경우*/
char age; -> short int age;
그런데 이 변수가 한 번만 사용된 것이 아니라 소스 코드 전체에서 여러 번 사용되었다면 어떨까?
프로그래밍을 하다 보면 동일한 데이터를 처리하기 위해 같은 자료형과 이름을 가진 변수를 여러 번 사용하는 경우가 있다. 예를 들어 다음처럼 '나이'값을 다루는 프로그램이 있다면 함수의 지열 변수로 char age;와 같은 변수를 여러 번 중복해서 사용할 수도 있다. 만약 age 변수의 자료형을 short int로 변경해야 한다면, 프로그램 코드 전체에서 age 변수를 찾아 다니며 일일이 수정해야 하는 불편함이 생긴다.
typedef 문법을 사용하지 않았을 때 | typedef 문법을 사용했을 때 |
#include <stdio.h> /*나이를 출력하는 함수*/ void ShowAge(char age){ } /*해당 나이인 사람의 수를 반환하는 함수*/ int FindAge(char age) { } void main() { char age; ShowAge(age); FindAge(10); } |
#include <stdio.h> /*typedef 문법으로 char 자료형 재정의 함*/ typedef char AGE; /*나이를 출력하는 함수*/ void ShowAge(AGE age){ } /*해당 나이인 사람의 수를 반환하는 함수*/ int FindAge(AGE age) { } void main() { AGEage; ShowAge(age); FindAge(10); } |
그렇다면 오른쪽과 같이 typedef 문법으로 AGE자료형을 새로 정의하고 변수를 선언했다면 어떨까? 이렇게 typedef를 사용하면 age 변수 선언은 그대로 두고 typedef 정의를 변경해서 AGE자료형의 크기를 변경할 수 있다.
typedef 문법으로 자료형을 재정의한 부분만 수정해서 자료형의 크기를 2바이트로 변경할 수 있기 때문에 AGE로 선언한 모든 변수를 한꺼번에 2바이트로 변경한 것과 마찬가지 결과를 보여준다.
typedef char AGE; > typedef short int AGE;
AGE age; /* short int age;라고 선언한 것과 같음 */
결론적으로 typedef를 사용하면 데이터의 크기에 변화가 생겼을 때 쉽게 대처할 수 있다.
'C언어' 카테고리의 다른 글
15-1) 배열과 구조체 (1) | 2021.09.27 |
---|---|
15) 데이터를 그룹으로 묶는 구조체 (0) | 2021.09.06 |
13-2) 2차원 포인터와 2차원 배열 (1) | 2021.06.29 |
13) 다차원 포인터 (0) | 2021.06.01 |
12-1) 동적 메모리 할당 및 해제 (0) | 2021.05.01 |