Typedef 선언Typedef Declarations

typedef 선언은 typedef를 저장소 클래스로 사용하는 선언입니다.A typedef declaration is a declaration with typedef as the storage class. 선언자는 새 형식이 됩니다.The declarator becomes a new type. typedef 선언을 사용하여 C에서 이미 정의된 형식이나 사용자가 선언한 형식에 대한 보다 짧거나 의미 있는 이름을 생성할 수 있습니다.You can use typedef declarations to construct shorter or more meaningful names for types already defined by C or for types that you have declared. typedef 이름을 사용하면 변경될 수 있는 구현 정보를 캡슐화할 수 있습니다.Typedef names allow you to encapsulate implementation details that may change.

typedef 선언은 변수 또는 함수 선언과 같은 방식으로 해석되지만, 선언에 형식이 지정되었다고 가정하는 대신 식별자가 형식의 동의어가 됩니다.A typedef declaration is interpreted in the same way as a variable or function declaration, but the identifier, instead of assuming the type specified by the declaration, becomes a synonym for the type.

구문Syntax

declaration:declaration:
declaration-specifiers init-declarator-list opt;declaration-specifiers init-declarator-list opt;

declaration-specifiers:declaration-specifiers:
storage-class-specifier declaration-specifiers optstorage-class-specifier declaration-specifiers opt

type-specifier declaration-specifiers opttype-specifier declaration-specifiers opt

type-qualifier declaration-specifiers opttype-qualifier declaration-specifiers opt

storage-class-specifier:storage-class-specifier:
typedef

type-specifier:type-specifier:
voidvoid

charchar

shortshort

intint

longlong

floatfloat

doubledouble

signedsigned

unsignedunsigned

struct-or-union-specifierstruct-or-union-specifier

enum-specifierenum-specifier

typedef-nametypedef-name

typedef-name:typedef-name:
identifieridentifier

typedef 선언은 형식을 만드는 것이 아니라Note that a typedef declaration does not create types. 기존 형식의 동의어나 다른 방식으로 지정할 수 있는 형식의 이름을 만듭니다.It creates synonyms for existing types, or names for types that could be specified in other ways. typedef 이름을 형식 지정자로 사용하는 경우 특정 형식 지정자와 함께 사용할 수 있습니다.When a typedef name is used as a type specifier, it can be combined with certain type specifiers, but not others. 허용되는 한정자에는 constvolatile이 포함됩니다.Acceptable modifiers include const and volatile.

typedef 이름은 일반 식별자와 네임스페이스를 공유합니다(자세한 내용은 네임스페이스 참조).Typedef names share the name space with ordinary identifiers (see Name Spaces for more information). 따라서 프로그램에 동일한 이름의 typedef 이름과 로컬 범위 식별자가 있을 수 있습니다.Therefore, a program can have a typedef name and a local-scope identifier by the same name. 예:For example:

typedef char FlagType;  

int main()  
{  
}  

int myproc( int )  
{  
    int FlagType;  
}  

typedef와 동일한 이름의 로컬 범위 식별자를 선언하거나 같은 범위 또는 내부 범위에서 구조체 또는 공용 구조체의 멤버를 선언할 때 반드시 형식 지정자를 지정해야 합니다.When declaring a local-scope identifier by the same name as a typedef, or when declaring a member of a structure or union in the same scope or in an inner scope, the type specifier must be specified. 이 예제에서는 이 제약 조건을 보여 줍니다.This example illustrates this constraint:

typedef char FlagType;  
const FlagType x;  

식별자, 구조체 멤버 또는 공용 구조체 멤버에 FlagType 이름을 다시 사용하려면 형식을 제공해야 합니다.To reuse the FlagType name for an identifier, a structure member, or a union member, the type must be provided:

const int FlagType;  /* Type specifier required */  

다음과 같이 표현하면 충분하지 않습니다.It is not sufficient to say

const FlagType;      /* Incomplete specification */  

FlagType이 다시 선언되는 식별자가 아니라 형식의 일부로 간주되기 때문입니다.because the FlagType is taken to be part of the type, not an identifier that is being redeclared. 이 선언은 다음과 같이 잘못된 선언으로 간주됩니다.This declaration is taken to be an illegal declaration like

int;  /* Illegal declaration */  

포인터, 함수 및 배열 형식을 비롯한 모든 형식을 typedef를 사용하여 선언할 수 있습니다.You can declare any type with typedef, including pointer, function, and array types. 정의의 표시 유형이 선언의 표시 유형과 동일한 경우 구조체 또는 공용 구조체 형식을 정의하기 전에 구조체 또는 공용 구조체 형식에 대한 포인터의 typedef 이름을 선언할 수 있습니다.You can declare a typedef name for a pointer to a structure or union type before you define the structure or union type, as long as the definition has the same visibility as the declaration.

typedef 이름을 사용하면 코드 가독성을 높일 수 있습니다.Typedef names can be used to improve code readability. signal의 다음 세 가지 선언 모두 정확히 같은 형식을 지정하며, 첫 번째는 typedef 이름을 사용하지 않습니다.All three of the following declarations of signal specify exactly the same type, the first without making use of any typedef names.

typedef void fv( int ), (*pfv)( int );  /* typedef declarations */  

void ( *signal( int, void (*) (int)) ) ( int );  
fv *signal( int, fv * );   /* Uses typedef type */  
pfv signal( int, pfv );    /* Uses typedef type */  

예제Examples

다음 예제에서는 typedef 선언을 보여 줍니다.The following examples illustrate typedef declarations:

typedef int WHOLE; /* Declares WHOLE to be a synonym for int */  

WHOLE은 이제 WHOLE i; 또는 const WHOLE i;와 같은 변수 선언에서 사용할 수 있습니다.Note that WHOLE could now be used in a variable declaration such as WHOLE i; or const WHOLE i;. 하지만 long WHOLE i; 선언은 유효하지 않습니다.However, the declaration long WHOLE i; would be illegal.

typedef struct club   
{  
    char name[30];  
    int size, year;  
} GROUP;  

이 문은 GROUP을 세 멤버가 포함된 구조체 형식으로 선언합니다.This statement declares GROUP as a structure type with three members. 구조체 태그 club도 지정되어 있으므로 typedef 이름(GROUP) 또는 구조체 태그를 선언에서 사용할 수 있습니다.Since a structure tag, club, is also specified, either the typedef name (GROUP) or the structure tag can be used in declarations. 태그와 함께 구조체 키워드를 사용해야 하며, typedef 이름과 함께 구조체 키워드를 사용할 수는 없습니다.You must use the struct keyword with the tag, and you cannot use the struct keyword with the typedef name.

typedef GROUP *PG; /* Uses the previous typedef name   
                      to declare a pointer            */  

PG 형식은 GROUP 형식에 대한 포인터로 선언되며, 이는 다시 구조체 형식으로 정의됩니다.The type PG is declared as a pointer to the GROUP type, which in turn is defined as a structure type.

typedef void DRAWF( int, int );  

이 예제에서는 값을 반환하지 않고 두 개의 int 인수를 사용하는 함수에 대한 DRAWF 형식을 제공합니다.This example provides the type DRAWF for a function returning no value and taking two int arguments. 이는 예를 들어 다음 선언이This means, for example, that the declaration

DRAWF box;   

다음 선언과 같음을 의미합니다.is equivalent to the declaration

void box( int, int );  

참고 항목See Also