일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Win32
- Direct2D
- Visual Studio
- tipssoft
- c#
- 티스토리
- 프로그래밍
- CS
- Kotlin
- 리뷰
- Windows
- 연산자
- 함수
- c++
- doit코틀린프로그래밍
- c
- 백준
- 포인터
- 배열
- 이지스퍼블리싱
- VS ERROR
- Javascript
- Programming
- 문법
- 알고리즘
- Desktop
- Tips강좌
- Tips프로그래밍강좌
- 지식나눔강좌
- 김성엽
- Yesterday
- Today
- Total
F.R.I.D.A.Y.
Designated Initializer 본문
변수의 초기화 방법은 각 문법에서 설명했습니다. 다른 언어에서는 잘 사용하고 있었는데 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.
읽어보기.
초기화를 해야 하는 시점
Thanks.
Greems
# index
'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 |