집합체 형식 초기화Initializing Aggregate Types

"집합체" 형식은 구조체, 공용 구조체 또는 배열 형식입니다.An "aggregate" type is a structure, union, or array type. 집합체 형식은 집합체 형식 멤버를 포함하며 초기화 규칙이 재귀적으로 적용됩니다.If an aggregate type contains members of aggregate types, the initialization rules apply recursively.

구문Syntax

initializer:initializer:
{ initializer-list } /* 집합체 초기화용 */{ initializer-list } /* For aggregate initialization */

{ initializer-list , }{ initializer-list , }

initializer-list:initializer-list:
initializerinitializer

initializer-list , initializerinitializer-list , initializer

initializer-list는 쉼표로 구분된 이니셜라이저 목록입니다.The initializer-list is a list of initializers separated by commas. 목록에서 각 이니셜라이저는 상수 식이거나 이니셜라이저 목록입니다.Each initializer in the list is either a constant expression or an initializer list. 따라서 이니셜라이저 목록은 중첩될 수 있습니다.Therefore, initializer lists can be nested. 이 형식은 이 단원의 예제에서 나타난 것처럼 집합체 형식의 집합체 멤버를 초기화하는 데 유용합니다.This form is useful for initializing aggregate members of an aggregate type, as shown in the examples in this section. 그러나 자동 식별자에 대한 이니셜라이저가 단일 식인 경우 상수 식일 필요가 없으며 단지 식별자에 할당하기 위한 올바른 형식을 가져야 합니다.However, if the initializer for an automatic identifier is a single expression, it need not be a constant expression; it merely needs to have appropriate type for assignment to the identifier.

각 이니셜라이저 목록의 경우 상수 식의 값은 순서대로 집합체 변수의 해당 멤버에 할당됩니다.For each initializer list, the values of the constant expressions are assigned, in order, to the corresponding members of the aggregate variable.

initializer-list가 집합체 형식보다 적은 값을 갖는 경우 집합체 형식의 나머지 멤버 또는 요소는 0으로 초기화됩니다.If initializer-list has fewer values than an aggregate type, the remaining members or elements of the aggregate type are initialized to 0. 명시적으로 초기화되지 않은 자동 식별자의 초기값은 정의되지 않습니다.The initial value of an automatic identifier not explicitly initialized is undefined. initializer-list가 집합체 형식보다 많은 값을 갖는 경우 오류가 발생합니다.If initializer-list has more values than an aggregate type, an error results. 이러한 규칙은 각각 포함된 이니셜라이저 목록뿐 아니라 전체로써 집합체에도 적용됩니다.These rules apply to each embedded initializer list, as well as to the aggregate as a whole.

구조체의 이니셜라이저는 동일한 형식의 식이거나 중괄호({ })로 묶인 멤버에 대한 이니셜라이저의 목록입니다.A structure's initializer is either an expression of the same type, or a list of initializers for its members enclosed in curly braces ({ }). 명명되지 않은 비트 필드 멤버는 초기화되지 않습니다.Unnamed bit-field members are not initialized.

공용 구조체가 초기화될 때 initializer-list는 단일 상수 식이어야 합니다.When a union is initialized, initializer-list must be a single constant expression. 상수 식의 값은 공용 구조체의 첫 번째 멤버에 할당됩니다.The value of the constant expression is assigned to the first member of the union.

배열에 알 수 없는 크기가 있는 경우 이니셜라이저의 수는 배열의 크기를 결정하며 해당 형식은 완료됩니다.If an array has unknown size, the number of initializers determines the size of the array, and its type becomes complete. C에서 이니셜라이저의 반복을 지정하거나 모든 이전 값을 제공하지 않고 배열의 중간에서 요소를 초기화할 방법은 없습니다.There is no way to specify repetition of an initializer in C, or to initialize an element in the middle of an array without providing all preceding values as well. 프로그램에서 이 작업이 필요한 경우 어셈블리 언어에서 루틴을 작성합니다.If you need this operation in your program, write the routine in assembly language.

이니셜라이저의 수로 배열의 크기를 설정할 수 있습니다.Note that the number of initializers can set the size of the array:

int x[ ] = { 0, 1, 2 }  

그러나 크기를 지정하고 잘못된 이니셜라이저의 수를 지정한 경우에는 컴파일러에서 오류가 발생합니다.If you specify the size and give the wrong number of initializers, however, the compiler generates an error.

Microsoft 전용Microsoft Specific

배열의 최대 크기는 size_t에서 정의합니다.The maximum size for an array is defined by size_t. 헤더 파일 STDDEF.H에 정의된 size_t는 0x00000000~0x7CFFFFFF 범위의 unsigned int입니다.Defined in the header file STDDEF.H, size_t is an unsigned int with the range 0x00000000 to 0x7CFFFFFF.

Microsoft 전용 종료END Microsoft Specific

예제Examples

이 예제는 배열에 대한 이니셜라이저를 보여 줍니다.This example shows initializers for an array.

int P[4][3] =   
{  
    { 1, 1, 1 },  
    { 2, 2, 2 },  
    { 3, 3, 3,},  
    { 4, 4, 4,},  
};  

이 문은 P를 4-3 배열로 선언하고 첫 번째 행의 요소를 1로, 두 번째 행의 요소를 2로 초기화하는 방식으로 네 번째 행까지 초기화합니다.This statement declares P as a four-by-three array and initializes the elements of its first row to 1, the elements of its second row to 2, and so on through the fourth row. 세 번째와 네 번째 행에 대한 이니셜라이저 목록은 마지막 상수 식 다음에 쉼표를 포함합니다.Note that the initializer list for the third and fourth rows contains commas after the last constant expression. 마지막 이니셜라이저 목록({4, 4, 4,},) 다음에도 쉼표가 표시됩니다.The last initializer list ({4, 4, 4,},) is also followed by a comma. 이러한 추가 쉼표는 허용되지만 필수는 아닙니다. 상수 식을 서로 구분하는 쉼표와 이니셜라이저 목록을 구분하는 쉼표만 필요합니다.These extra commas are permitted but are not required; only commas that separate constant expressions from one another, and those that separate one initializer list from another, are required.

집합체 멤버에 포함된 이니셜라이저 목록이 없는 경우 값은 순서대로 하위 집합체의 각 멤버에 간단하게 할당됩니다.If an aggregate member has no embedded initializer list, values are simply assigned, in order, to each member of the subaggregate. 따라서 이전 예제의 초기화는 다음과 같습니다.Therefore, the initialization in the previous example is equivalent to the following:

int P[4][3] =   
{  
   1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4  
};  

또한 중괄호는 목록에서 개별 이니셜라이저 주변에 나타날 수 있으며 위 예제를 명확하게 해줍니다.Braces can also appear around individual initializers in the list and would help to clarify the example above.

집합체 변수를 초기화하는 경우 중괄호와 이니셜라이저 목록을 올바르게 사용하도록 주의해야 합니다.When you initialize an aggregate variable, you must be careful to use braces and initializer lists properly. 다음 예제에는 컴파일러의 중괄호 해석을 자세히 나타냅니다.The following example illustrates the compiler's interpretation of braces in more detail:

typedef struct   
{  
    int n1, n2, n3;  
} triplet;  

triplet nlist[2][3] =   
{  
    { {  1, 2, 3 }, {  4, 5, 6 }, {  7, 8, 9 } },  /* Row 1 */  
    { { 10,11,12 }, { 13,14,15 }, { 16,17,18 } }   /* Row 2 */  
};  

이 예제에서는 nlist가 구조체의 2-3 배열로 선언되며 각 구조체는 세 가지 멤버를 갖습니다.In this example, nlist is declared as a 2-by-3 array of structures, each structure having three members. 초기화의 1행은 다음과 같이 nlist의 첫 번째 행에 값을 할당합니다.Row 1 of the initialization assigns values to the first row of nlist, as follows:

  1. 1행의 첫 번째 왼쪽 중괄호는 nlist의 첫 집합체 멤버(즉, nlist[0])의 초기화를 시작하는 컴파일러로 신호를 보냅니다.The first left brace on row 1 signals the compiler that initialization of the first aggregate member of nlist (that is, nlist[0]) is beginning.

  2. 두 번째 왼쪽 중괄호는 nlist[0]의 첫 번째 집합체 멤버(즉, nlist[0][0]의 구조체) 초기화를 시작함을 나타냅니다.The second left brace indicates that initialization of the first aggregate member of nlist[0] (that is, the structure at nlist[0][0]) is beginning.

  3. 첫 번째 오른쪽 중괄호는 구조체 nlist[0][0]의 초기화를 종료하며 다음 왼쪽 중괄호는 nlist[0][1]의 초기화를 시작합니다.The first right brace ends initialization of the structure nlist[0][0]; the next left brace starts initialization of nlist[0][1].

  4. 프로세스는 닫는 오른쪽 중괄호가 nlist[0]의 초기화를 종료하는 줄의 끝까지 계속됩니다.The process continues until the end of the line, where the closing right brace ends initialization of nlist[0].

    2행은 비슷한 방법으로 값을 nlist의 두 번째 행으로 할당합니다.Row 2 assigns values to the second row of nlist in a similar way. 1행과 2행에서 초기화를 닫는 중괄호의 외부 집합이 필요합니다.Note that the outer sets of braces enclosing the initializers on rows 1 and 2 are required. 외부 중괄호를 생략하는 다음 생성에서는 오류가 발생합니다.The following construction, which omits the outer braces, would cause an error:

triplet nlist[2][3] =  /* THIS CAUSES AN ERROR */  
{  
     {  1, 2, 3 },{  4, 5, 6 },{  7, 8, 9 },   /* Line 1 */  
     { 10,11,12 },{ 13,14,15 },{ 16,17,18 }    /* Line 2 */  
};  

이 생성에서 첫 번째 줄의 첫 번째 왼쪽 중괄호는 세 가지 구조체의 배열인 nlist[0]의 초기화를 시작합니다.In this construction, the first left brace on line 1 starts the initialization of nlist[0], which is an array of three structures. 값 1, 2, 3은 첫 번째 구조체의 멤버 3개에 할당됩니다.The values 1, 2, and 3 are assigned to the three members of the first structure. 다음 오른쪽 중괄호가 값 3 다음에 발견되는 경우 nlist[0]의 초기화가 완료되며 세 가지 구조체 배열에서 나머지 두 구조체는 자동으로 0으로 초기화됩니다.When the next right brace is encountered (after the value 3), initialization of nlist[0] is complete, and the two remaining structures in the three-structure array are automatically initialized to 0. 마찬가지로 { 4,5,6 }nlist의 두 번째 행에서 첫 번째 구조체를 초기화합니다.Similarly, { 4,5,6 } initializes the first structure in the second row of nlist. nlist[1]의 나머지 두 구조체는 0으로 설정됩니다.The remaining two structures of nlist[1] are set to 0. 컴파일러가 다음 이니셜라이저 목록({ 7,8,9 })을 발견하는 경우 nlist[2] 초기화를 시도합니다.When the compiler encounters the next initializer list ( { 7,8,9 } ), it tries to initialize nlist[2]. nlist에는 두 행만 있으므로 이 시도는 오류가 발생합니다.Since nlist has only two rows, this attempt causes an error.

다음 예제에서 int의 세 가지 x 멤버는 각각 1, 2, 3으로 초기화됩니다.In this next example, the three int members of x are initialized to 1, 2, and 3, respectively.

struct list   
{  
    int i, j, k;  
    float m[2][3];  
} x = {  
        1,  
        2,  
        3,  
       {4.0, 4.0, 4.0}  
      };  

위의 list 구조체에서 m의 첫 번째 행에 있는 세 가지 요소는 4.0으로 초기화되며 m의 나머지 행에 있는 요소는 기본적으로 0.0으로 초기화됩니다.In the list structure above, the three elements in the first row of m are initialized to 4.0; the elements of the remaining row of m are initialized to 0.0 by default.

union  
{  
    char x[2][3];  
    int i, j, k;  
} y = { {  
            {'1'},  
            {'4'}   
        }  
      };  

이 예제에서는 공용 구조체 변수 y가 초기화됩니다.The union variable y, in this example, is initialized. 공용 구조체의 첫 번째 요소는 배열이므로 이니셜라이저는 집합체 이니셜라이저입니다.The first element of the union is an array, so the initializer is an aggregate initializer. 이니셜라이저 목록 {'1'}은 값을 배열의 첫 번째 행에 할당합니다.The initializer list {'1'} assigns values to the first row of the array. 하나의 값만 목록에 나타나므로 첫 번째 열의 요소는 문자 1로 초기화되며 행의 나머지 두 요소는 기본적으로 값 0으로 초기화됩니다.Since only one value appears in the list, the element in the first column is initialized to the character 1, and the remaining two elements in the row are initialized to the value 0 by default. 마찬가지로 x의 두 번째 행에 있는 첫 번째 요소는 문자 4로 초기화되며 행의 나머지 두 요소는 값 0으로 초기화됩니다.Similarly, the first element of the second row of x is initialized to the character 4, and the remaining two elements in the row are initialized to the value 0.

참고 항목See Also

초기화Initialization