F.R.I.D.A.Y.

Designated Initializer 본문

DEV/C C++

Designated Initializer

F.R.I.D.A.Y. 2020. 1. 21. 22:52
반응형

 변수의 초기화 방법은 각 문법에서 설명했습니다. 다른 언어에서는 잘 사용하고 있었는데 C언어에서는 그 문법을 찾을 수가 없었습니다. 최근에 문법 지원이 이루어지고 있음을 알게 되어, 초기화 문법을 추가로 설명하고자 따로 포스트를 작성합니다.


배열 초기화

 우리가 배열을 초기화할 때는 아래와 같이 이용했습니다.

int arr1[10] = {0};
int arr2[10] = {1,2,3};
int arr3[10] = {};

 처음이 아닌 중간의 특정 인덱스의 값을 초기화하기 위해서는 일일이 대입하거나, 혹은 그 이전 인덱스에도 초기화 값을 넣어주어야 했습니다.

// 4번 째 요소에 값 4를 넣는 초기화
// style 1
int arr1[10] = {0,0,0,4};

// style 2
int arr2[10];
arr2[3] = 4;

style 1은 앞선 요소에도 초기화 값을 넣어주어야 하고, style 2의 경우 네 번째 요소[# 인덱스: 3]을 제외한 다른 요소는 초기화가 되어있지 않습니다.

 

 지금 소개하는 방법을 이용하면 굳이 위와 같이 작성하지 않더라도 특정 요소를 초기화할 수 있습니다.

int arr1[10] = {[3] = 4};

 요소들의 초기화 값을 담고 있는 중괄호 안에 [인덱스] = 초기화 값을 넣어주게 되면 해당 인덱스를 가진 요소가 특정 값으로 초기화됩니다.

 

 이 방식을 Designated Initializer라고 부릅니다.


구조체 초기화

 구조체 또한 이 방식을 이용할 수 있습니다.

struct t{
    int a;
    int b;
    char c;
    char d;
    short e;
};

 위와 같은 구조체가 존재한다고 생각해봅시다. 그렇다면 구조체 멤버 연산자[#.]를 이용해 접근했던 것과 마찬가지로 중괄호 안에 아래처럼 명시해주면 초기화가 가능합니다.

struct t test = {.a = 10, .b = 154, .c = 65, .d = 97, .e=3};
printf("%d %d %c %c %d", test.a, test.b, test.c, test.d, test.e);

 

유니온 초기화

 동일한 메모리를 공유하는 유니온 문법에서도 초기화가 가능합니다. 다만, 유니온 문법의 특성상 코드 줄 수를 줄이는 목적이 아니라면 굳이 사용할 필요가 있을까 싶은 생각이 드네요.

union t{
    int a;
    char b;
    short c;
};

union t test = {.a = 10};

 이렇게 되면 test라는 union t라는 자료형의 변수에 10이 들어가게 됩니다.


단점

 이 방식의 단점도 분명 존재할 거라 생각합니다. 특히 배열에서 그 단점을 생각하게 됩니다. 구조체나 유니온의 경우 멤버에 접근하는 방식이 배열과 달리 숫자가 아닌 문자인지라 각 멤버 요소에 대해 순서를 크게 생각하지 않아도 되지만[# 생각을 아예 안 해도 되는 것은 아닙니다. 자세한 내용은 이 문서를 참고하세요.], 배열은 조금 다릅니다.

 

 배열은 각 요소가 선형으로 이루어져 있으며[# 물론 모든 메모리는 선형으로 관리됩니다. 여기에서는 우리가 배열을 연상할 때 어떻게 이미지를 그리는지를 말하는 내용입니다.], 순서를 중요하게 생각합니다.

 이 Designated Initializer를 사용하게 되면 아래와 같이 순서를 생각하지 않고 초기화를 할 수 있습니다.

int arr1[10] = {[3] = 4, [2] = 3};

for(int i = 0; i < 10; ++i){
    printf("%d ", arr1[i]);
}

 적은 값들은 몰라도 많은 값들이 이렇게 뒤죽박죽 섞여서 초기화가 이루어진다면 어느 정도 위치에 어떤 값이 들어가 있는지 쉽게 유추할 수가 없습니다. 이 단점은 이 방식의 확실한 맹점이 될 것입니다.


Reference.

 

IBM Knowledge Center

Please note that DISQUS operates this forum. When you sign in to comment, IBM will provide your email, first name and last name to DISQUS. That information, along with your comments, will be governed by DISQUS’ privacy policy. By commenting, you are accept

www.ibm.com

 

읽어보기.

 초기화를 해야 하는 시점

 

변수 초기화

변수를 사용하는 것만큼, 중요한 것이 변수 초기화 과정입니다. 이 포스트에서는 변수 초기화는 무엇이고 언제 초기화를 해야 하는지 알아봅니다. 초기화란? 먼저 시작에 앞서 초기화는 무엇인지 알아봅니다. 네..

pang2h.tistory.com

Thanks.

 Greems

 

CodeUP

 

codeup.tistory.com

# index

728x90
반응형

'DEV > C C++' 카테고리의 다른 글

다차원 배열의 요소 값 교환하기  (0) 2020.01.25
포인터와 배열  (0) 2020.01.24
배열(array) part2. 다차원 배열  (0) 2020.01.20
배열(array) part1. default  (1) 2020.01.19
포인터(pointer) part2. 다차원 포인터  (0) 2020.01.17
Comments