배열
변수를 선언할 때 몇 개 정도의 변수는 변수명과 자료형을 명시하면서 변수를 선언하여 사용할 수 있다.
하지만
비슷한 역할을 하는 변수를 수십 개, 수백 개 혹은 그 이상을 선언하여 사용하는 경우라면 어떨 것 같은가?
사용해야 하는 변수의 수만큼 자료형과 변수 이름을 지으면서 변수를 선언하게 되면
코드의 양이 많아질 뿐만 아니라 변수를 선언하는 것조차 번거로운 일이 된다.
배열은 바로 이런 상황에서 사용할 수 있는 것이다.
배열의 선언 방법은 아래의 사진과 같다.
-
-
위 사진은
정수형을 갖는 배열의 크기
즉
배열 요소의 개수가 10인 배열을 선언한 것이다.
위의 내용과 같이 배열을 선언하면 배열의 자료형은 정수형(int)이 되고
배열 이름은 array이고
배열 요소의 개수는 10, 즉 10개의 정수형 변수를 선언한 것과 같다.
메모리 공간은 다음 사진과 같이 각각 4바이트씩 10개로 총 40바이트가 연속적으로 할당된다.
-
-
이제 아래의 사진을 통해 예제를 한 번 봐보자.
-
-
위의 예제는 각각 배열 요소의 개수를 5개로 갖는 char, int, long, float, double 형의 배열을 선언한 뒤
각 배열이 사용하는 메모리의 크기를 출력한다.
실행 결과를 보면 출력되는 배열의 크기는 각 자료형의 크기에 5를 곱한 것과 같다는 것을 알 수 있다.
배열을 선언하면 배열의 크기만큼 연속적으로 한꺼번에 메모리 공간을 할당하기 때문에
배열을 선언하면서 반드시 그 배열의 크기가 지정되어야 한다.
단, 배열의 크기를 정하지 않는 경우는 배열을 선언하면서 동시에 배열을 초기화하는 경우이다.
하지만
이 경우에도 배열을 초기화하면서 배열의 개수를 계산할 수 있으므로
배열을 선언하면서 그 크기가 지정되어야 한다는 점은 변하지 않는다.
배열에 값을 저장하거나 배열에 저장된 값을 참조하기 위해서는
배열의 시작부터 몇 번째 위치라는 것을 의미하는 인덱스(index)라는 첨자를 사용하게 된다.
인덱스를 사용할 때 주의할 점이 있다.
인덱스의 값이 1부터 시작되는 게 아니라 0부터 시작한다는 점이다.
만약 배열 요소의 5인 배열을 선언하면 인덱스는 0부터 4까지만 참조할 수 있으며
인덱스의 범위를 초과하여 값을 참조하면 에러가 나거나 프로그램이 정상적으로 실행되지 않을 수도 있으므로
인덱스를 사용할 때는 주의하도록 하자.
인덱스가 배열의 시작부터 몇 번째 위치를 의미한다는 것은 아주 중요한 개념이다.
그러므로 아래의 예제를 통해 자세히 알아보자.
-
-
위 예제는 문자형 배열과 정수형 배열을 선언한 뒤에
각 배열을 구성하는 배열 요소 각각의 주소 값을 출력한 예제이다.
각각의 주소 값을 출력하기 위해서 '&' 연산을 사용했지만
이 연산은 나중에 포인터 연산자 글에서 더 자세히 설명할 것이기 때문에
현재는 단순히 변수의 주소 값을 추출한다는 것만을 기억하도록 하자.
문자형 변수 a[0]부터 a[4]까지의 주소 값을 보면
1byte씩 증가한다는 것을 알 수 있고
변수 b[0]부터 b[4]까지의 주소 값을 출력할 때는 주소 값의 크기가 4byte
즉
해당 배열의 자료형 크기만큼 증가한다는 사실을 알 수 있다.
이 점은 나중에 배울 포인터 연산에서 자세히 설명할 것이며
나중에 네트워크 프로그래밍을 하다보면
네트워크 헤더와 관련하여 주소 값을 계산할 때도 중요한 점이기 때문에 꼭 기억하도록 하자.
배열은 배열의 선언과 동시에 값을 초기화할 수 있는데
이때는 중괄호 '{'와 '}'를 이용하여 초기화하려는 값을 나열한다.
그렇다면 예제를 한 번 봐보자.
-
-
위 예제는 배열 초기화에 대한 예제를 보여준다.
-
-
위에서 6행의 내용인 위의 구문은 배열 요소의 개수가 5인 정수형 배열 a를 선언한 뒤
배열 요소를 순서대로 1부터 5까지의 값으로 초기화한다는 내용이다.
-
-
7행의 내용인 위의 구문은 배열 요소의 개수를 지정하지 않고
1개의 값만 이용하여 초기화하는 구문으로
초기화하는 값의 개수를 통해 컴파일 시점에서 배열의 크기
즉
배열이 사용하는 메모리의 양을 계산해 낼 수 있으므로 정상적으로 컴파일되어 실행된다.
결과는 배열 요소의 개수가 1인 배열이 된다.
13행에서 저장된 값을 출력하기 위해서 for 문이 사용됐는데
반복 회수를 정할 때는 전체 배열의 크기를 정수 자료형의 크기로 나누어 배열 요소의 개수를 계산한 뒤에
해당 배열 요소의 개수만큼 반복문을 실행한다.
-
-
8행의 내용인 위의 구문은 배열 요소의 개수가 5인 정수형 배열을 선언한 뒤에
기술된 두 개의 값만을 이용하여 순서대로 2개의 배열요소(c[0], c[1])만을 초기화한다.
나머지 c[2], c[3], c[4]의 값은 초기화하지 않았는데 위의 결과를 보면 초기화 자료를 생략할 때
즉
정수형 배열에서 초기화하지 않으면 자동으로 0으로 초기화된다는 사실을 확인할 수 있다.
이제까지는 하나의 자료형으로 n개를 연속적으로 할당하여 사용하는 배열에 대해서 학습했다.
만약에 n개를 연속적으로 할당하면서 이러한 배열이 m개 필요하다면 어떻게 선언하면 되느냐
이 경우를 C 언어에서는 2차원 배열이라고 하며 n x m의 메모리 공간을 연속적으로 할당하여 사용할 수 있다.
2차원 배열은 다음과 같이 선언할 수 있다.
-
-
예를 들어, 위와 같이 int array[2][2]를 선언하면 메모리에는 아래의 사진과 같이 할당되게 된다.
-
-
2차원 배열 또한 앞서 학습한 배열 특징을 그대로 갖고 있으며
인덱스 연산 및 배열의 크기 또한 기본 배열과 동일하게 사용할 수 있다.
다만, 주의할 점은
2차원 배열을 초기화할 때는 중괄호 '{'와 '}'를 이중으로 사용해야 한다는 점이다.
아래의 예제를 통해 2차원 배열을 초기화하는 것에 대해 봐 보자.
-
-
위의 예제는 2차원 배열의 선언과 초기화를 함께 사용 방법을 보여주고 있으며
2차원 이상의 3차원, 4차원 등의 배열도 위와 같은 방법으로 선언과 초기화를 하여 사용하면 된다.
'시작하지 말았어야 했던 것 > C언어 기본 문법' 카테고리의 다른 글
13. 함수 (0) | 2021.02.01 |
---|---|
12. 문자와 문자열 (0) | 2021.02.01 |
10. break문과 continue문 (0) | 2021.02.01 |
8. 반복문 (0) | 2021.02.01 |
7. 조건문 (0) | 2021.02.01 |