관리할 데이터가 서너개 정도면 변수를 a, b, c, d 식으로 써도 되겠다.
그렇지만 수백개, 아니 수십개만 되어도 당연히 이런 방식에는 한계가 있다. 배보다 배꼽이 더 커진다.
그럴때 우리가 '배열'(Array)을 사용할 수 있다.
변수 하나가 단독주택이라면, 배열은 아파트라고 할수 있겠다.
1 | int score[10]; | cs |
배열은 위처럼 선언한다. int형 변수 10개를 가지는 배열이며, 이름은 score이다.
그 결과, 메모리에 int형 변수 10개만큼의 공간이 연속적으로 할당되고, 그 공간의 첫번째 위치의 이름이 score가 된다.
배열은 선언한 이후에는 배열의 각 요소에 접근하기 위해 인덱스를 사용한다. 이것은 배열 내의 몇번째 변수인지 표시해 주는 도구라고 할 수 있겠다. C에서 인덱스는 0부터 시작한다.(매우 헷갈린다!)
즉 배열의 첫번째 값과 두번째 값을 더해 세번째 값에 넣으려면?
이렇게 되는것이다.
또한 배열을 선언하면서 값을 넣기 위해서는 아래와 같이 하면 된다.
1 2 | int data[3] = { 0, 0, 0 }; int data[] = { 0, 0, 0 }; | cs |
밑의 코드의 경우에는 컴파일러가 알아서 데이터 갯수를 세어서 메모리를 할당해준다.
또한 이런식으로
1 | int data[10] = { 1, 1, 1, 1, 1 }; | cs |
배열의 선언한 크기보다 작은 갯수의 값을 넣었으면, 나머지 5개는 0으로 초기화된다.
또한 다차원 배열이라는 개념이 있다.
1 | int score[10][30]; | cs |
한 학년에 10반, 30명씩 학생들이 있다면 이렇게 배열을 선언해서 성적을 기록해볼 수 있겠다.
이건 2차원 배열이라고 한다. [행][열]으로 생각하면 되겠다.
고등학교라서 3학년까지 있다면?
1 | int score[3][10][30]; | cs |
3차원 배열이라고 한다. 이론적으로는 무한차원 배열도 가능하겠지만, 보통 3차원 배열정도로 제한하며, 사실 3차원 배열도 잘 안쓴다.
그런데 다차원 배열이란 결국 배열의 배열이다.
|
|
|
|
|
|
|
|
|
우리 머리에는 [3][3]의 2차원 배열이 이렇게 생각된다만.
|
|
|
|
|
|
|
|
|
메모리에서 할당되는건 이렇다! 결국 하드웨어적으로 1차원 배열 arr[9]와 2차원 배열 arr[3][3]의 메모리 형태는 차이가 없다. 다루는 방법만 다르다. 또한 이렇게 생각하면 3차원 배열은 2차원 배열의 배열이고, 우리 머릿속에는 입체로 생각될 것이다.
다차원 배열은 다음과 같이 초기화할수 있다.
1 2 3 4 5 6 | int arr[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; | cs |
물론 한줄로 해도 되지만, 가독성이란게 중요하니까.
물론 2차원 배열은 1차원 배열의 배열이고, 배열은 같은 자료형의 나열이므로 1차원 배열처럼 초기화해도 된다.
1 | int arr[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; | cs |
또한 마찬가지로 명시적으로 초기화하지 않은 부분은 0으로 초기화된다.
문자 배열은 앞에서 특별히 다뤘으니까...
그리고 배열의 입력/출력은 반복문을 통해서 하면 간편하다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | int arr[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { printf("%d ", arr[i][j]); } printf("\n"); } | cs |
1 2 3
4 5 6
7 8 9
식으로 출력될 것이다.
'Programming > C' 카테고리의 다른 글
[C언어] 포인터 (0) | 2015.01.23 |
---|---|
[C언어] 함수 (0) | 2015.01.17 |
[C언어] 반복문(for, while) (0) | 2015.01.17 |
[C언어] 분기문(if, switch) (0) | 2015.01.17 |
[C언어] 연산자와 연산자 우선순위 (0) | 2015.01.17 |