happy coding

[c] 배열 본문

self study/언어의 기본부터

[c] 배열

yeoonii 2022. 11. 19. 23:47

배열(array)

배열이란 같은 타입의 변수들로 이루어진 유한 집합이다. 배열을 구성하는 각각의 값을 배열 요소(element)라고 하며, 배열에서의 위치를 가리키는 숫자는 인덱스(index)라고 한다. C언어에서 인덱스는 언제나 0부터 시작하며, 0을 포함한 양의 정수만을 가질 수 있다. 배열은 같은 종류의 데이터를 많이 다뤄야 하는 경우에 사용할 수 있는 가장 기본적인 자료 구조이다. 

1차원 배열

1차원 배열은 가장 기본적인 배열이다.

타입 배열이름 [배열길이];

타입은 배열 요소로 들어가는 변수의 타입을 명시하며, 배열 이름은 배열이 선언된 후에 배열로 접근하기 위해 사용된다. 배열의 길이는 해당 배열이 몇 개의 배열 요소를 가지게 되는지 명시한다. 여기서 배열을 선언만 하고 초기화하지 않으면, 각 배열 요소에 아무런 의미를 가지지 않은 쓰레기 값을 가지고 있게 되기에, 초기화되지 않은 배열은 사용하지 않도록 주의해야 한다. 그리고 언제나 배열의 이름은 배열의 첫 번째 요소와 같은 주소를 가리키고 있다.

배열의 선언과 동시에 초기화 하는 방법

타입 배열이름 [배열길이] = {배열요소1, 배열요소2, ...};

여기서 중괄호를 사용해 초깃값을 나열한 것을 초기화 리스트라고 한다. 단, 초기화 리스트의 타입과 배열의 타입은 반드시 일치해야 한다. 만약, 초기화 리스트의 개수가 배열의 총 길이보다 적다면, 배열의 앞에서부터 차례대로 초기화되고 이때 초기화되지 못한 나머지 배열 요소는 모두 0으로 자동 초기화된다.

배열의 길이 자동 설정

C언어에서는 초기화 리스트에 맞춰 자동으로 배열의 길이를 설정할 수 있는데, 배열의 길이를 따로 입력하지 않은 배열은 초기화 리스트의 배열 요소의 개수에 맞춰 자동으로 배열의 길이가 설정된다.

타입 배열이름[] = {배열요소1, 배열요소2, ...};

배열의 특징

배열의 특징에는 1. 배열의 길이를 선언할 때는 반드시 상수를 사용해야 한다. 2. 배열 요소의 인덱스는 언제나 0부터 시작한다. 3. C컴파일러는 배열의 길이를 전혀 신경 쓰지 않는다. 오류를 출력해 주지 않기 때문에 개발자가 직접 신경 써야 한다.

배열이 차지하는 메모리의 크기

C언어에서 배열을 복사하거나 배열 요소에 특정 작업을 하고 싶을 때는 해당 배열이 차지하는 메모리의 크기를 정확히 알고 있어야 하는데, 이는 수식으로 구할 수 있다. 아래 수식에서 배열이름[0]은 해당 배열의 타입을 표현하기 위해 사용하였다.

배열이 차지하는 메모리의 크기 = 배열의 크기 * sizeof(타입)
배열의 길이 = sizeof(배열 이름) / sizeof(배열이름[0])

다차원 배열(multi-dimensional array)

다차원 배열이란 2차원 이상의 배열을 의미하며, 배열 요소로 또 다른 배열을 가지는 배열을 의미한다. 2차원 배열은 배열 요소로 1차원 배열을 가지는 배열이고 3차원 배열은 배열 요소로 2차원 배열을 가지는 배열이다.

2차원 배열(two dimensional array)

C언어에서는 2차원 배열을 나타내는 타입을 따로 제공하지 않지만 1차원 배열의 배열 요소로 또 다른 1차원 배열을 사용하여 2차원 배열을 나타낼 수 있다.

타입 배열이름 [열의길이][행의길이];

타입은 배열 요소로 저장되는 변수의 타입을 설정한다. 배열 이름은 배열이 선언된 후에 배열이 접근하기 위해 사용된다. 

배열의 선언과 동시에 초기화하는 방법

2차원 배열은 1차원 배열과는 달리 여러 방식으로 초기화할 수 있는데 그 종류는 1. 1차원 배열의 초기화 형태를 따르는 방식 2. 배열의 모든 요소를 초기화하는 방식 3. 배열의 일부 요소만을 초기화하는 방식 이 있다.

1차원 배열의 초기화 형태를 따르는 방식

타입 배열이름 [열의길이][행의길이] = {배열요소[0][0], 배열요소[0][1], ..., 배열요소[1][0], 배열요소[1][1],..., ...};

이 방식으로는 2차원 배열의 배열 요소 [0][0]부터 차례대로 초기화되는데, 만약에 초기화하는 배열 요소의 개수가 배열의 총 길이보다 적으면, 나머지 배열 요소는 모두 0으로 초기화된다.

배열의 모든 요소를 초기화하는 방식

타입 배열이름 [열의길이][행의길이] =
{
    {배열요소[0][0], 배열요소[0][1], ...},
    {배열요소[1][0], 배열요소[1][1], ...},
    {배열요소[2][0], 배열요소[2][1], ...},
    ...
};

이 방식은 위의 1차원 배열의 초기화 형태를 따르는 방식과 결과는 같지만 직관적으로 2차원 배열의 모습을 알 수 있으므로 이 방식을 가장 많이 사용한다.

배열의 일부 요소 만을 초기화하는 방식

int arr[3][4] = 
{
	{1,2},
    {3,4,5,6},
    {0,0,7,8}
};

위의 예제에서 실행결과는 1 2 0 0, 3 4 5 6, 0 0 7 8 으로 나타나는데, 이러한 형태처럼 일부 요소만을 초기화하는 것이 가능하며 이때 초기화하지 않은 배열 요소는 모두 0으로 자동 초기화된다.

이 부분에서 2차원 배열 열의 길이를 구할 때 사용하는 수식은 아래와 같다.

2차원 배열 열의 길이 = sizeof(arr[0]) / sizeof(arr[0][0]);
2차원 배열 행의 길이 = (sizeof(arr) / 열의 길이) / sizeof(arr[0][0]);

열의 길이는 sizeof(arr[0])로 먼저 2차원 배열 한 행의 길이를 구한 후 그 값을 배열 타입의 크기로 나누어서 구한다. 그리고 행의 길이는 sizeof(arr) / 열의 길이 로 먼저 2차원 배열 한 열의 길이를 구한 후 그 값을 배열 타입의 크기로 나누어서 구한다.

배열의 길이 자동 설정

1차원 배열과 마찬가지로 2차원 배열도 배열의 길이를 명시하지 않고, 자동으로 배열의 길이를 설정할 수 있다. 열의 길이는 생략이 가능해도 행의 길이는 반드시 명시해야 한다.

 

'self study > 언어의 기본부터' 카테고리의 다른 글

[c] 포인터와 배열  (0) 2022.11.22
[c] 포인터  (0) 2022.11.21
[c] 재귀 호출  (0) 2022.11.19
[c] 변수의 유효 범위  (0) 2022.11.18
[c] C언어 함수  (0) 2022.11.18
Comments