자료형으로 많은 수의 변수를 선언하고 사용할 때는 나열식 표현에 한계가 있다. 그래서 C언어는 데이터를 그룹으로 묶어서 표현하는 '배열'(Array) 문법을 사용한다.
배열은 자료형이 같은 변수들을 그룹으로 묶어서 관리할 때 사용
학생 20명의 성적을 저장하기 위해 위와 같이 배열을 선언.
배열을 선언하는 방법은 변수를 선언하는 방법과 비슷한데, [ ] 대괄호 기호를 사용하여 저장 공간을 몇 개 만들 것인지 명시해야 한다.
이 때 데이터를 저장할 요소 개수는 반드시 숫자 상수로 명시해야 한다.
위 배열의 메모리 구조는 다음과 같다.
student는 short형 변수 20개를 선언한 것과 같고, short형은 2바이트 이므로 student 변수는 총 40바이트 크기로 만들어진다.
배열에 값을 저장하려면 [ ] 기호를 사용해서 특정 요소의 위치를 명시해주어야 한다.
#include <stdio.h>
void main(){
short student[20];
studetn[1] = 10;
printf("%d\n", student[1]);
}
배열로 선언한 student 변수의 0번에서 4번 요소에 모두 5를 넣고 싶다면 아래와 같이 코드를 구성할 수 있다.
short student[20];
student[0] = 5;
student[1] = 5;
student[2] = 5;
student[3] = 5;
student[4] = 5;
short student[20], i;
for( i = 0 ; i < 5 ; i++ ) studetn[i] = 5;
배열 문법은 지역 변수를 그룹으로 묶은 것이기 때문에 배열 문법으로 선언한 변수도 지역 변수처럼 자동으로 초기화되지 않는다.
그래서 배열의 각 요소에 일정한 값을 대입해 초기화해서 사용해야 한다.
만약 배열로 선언한 변수의 각 요소를 직접 초기화하지 않을 경우,
#include <stdio.h>
void main(){
short student[20];
student[1] = 10;
printf("%d %d", student[1], student[2]);
}
10 -13108
위와 같이 student[2] 값은 이상한 숫자가 출력된다.
일반적으로 프로그래머들은 초깃값으로 0을 사용한다.
#include <stdio.h>
void main(){
short student[20], i;
for( i = 0 ; i < 20 ; i++) student[i] = 0;
student[1] = 10;
printf("%d %d", student[1], student[2]);
}
위와 같이 student 배열의 모든 요소를 0으로 초기화 해주어야 한다.
배열을 초기화 하는 데 매번 반복문을 사용하기 불편하니, 배열을 선언한 변수도 일반 변수처럼 초기화 하는 방법이 있다.
short student[20] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
이 초기화 방법은 배열의 요소가 많아지면 부담스러워 지기 때문에 아래와 같이 쓸 수도 있다.
short student [20] = {0,};
#include <stdio.h>
void main(){
short student[20] = {0,};
student[1] = 10;
printf("%d %d", student[1], student[2]);
}
* 주의할 점
short data[5] = {3,} 은 {3, 0, 0, 0, 0}과 같다.
바둑판에 놓인 돌의 좌표를 표현하고 싶다면 어떻게 해야 할까?
각 배열의 요소에 돌이 놓여있지 않느면 0, 검은돌이 놓여 있으면 1, 흰 돌이 놓여 있으면 2라고 저장하고 바둑판에 놓여 있는 돌의 정보를 저장하기 위해 1차원 배열을 선언해본다.
char data[361];
바둑판 정보는 가로와 세로가 있는 2차원 형태이기 때문에 1차원 배열에 저장하면 소스코드를 작성할 때 요소의 위치를 파악하기 어렵다.
차원은 공간에서 좌표를 구성하는 축의 개수를 의미.
2차원은 좌표를 적을 때 2개의 축을 사용한다. (X축, Y축)
좀 더 구체적으로 설명하기 위해 앞에서 말한 19x19 바둑판을 5x4 바둑판으로 바꾸고 몇 개의 바둑돌을 놓아 보자.
위 바둑판엔 최대 20개의 돌을 놓을 수 있는 지점이 있고, 0, 1, 2 라는 상황이 있다.
(각 배열의 요소에 돌이 놓여있지 않느면 0, 검은돌이 놓여 있으면 1, 흰 돌이 놓여 있으면 2라고 저장)
세 가지 상황 중 한가지를 저장하려면 char형이면 충분하다.
다음과 같이 변수를 선언하면 20바이트의 메모리를 사용할 수 있기에 위 바둑판의 상태를 모두 저장할 수 있다.
char data[20];
하지만 이렇게 2차원 형식의 데이터를 1차원 배열로 관리하면 data[7]에 저장된 돌의 상태가 바둑판에서 몇 행, 몇 열인지 판단하기 어렵다.
따라서 이런 경우에는 2차원 데이터와 표현 방식이 같은 2차원 배열을 사용해야 한다.
다음처럼 같은 형식의 1차원 배열 5개를 묶어보자.
char data1[4], data2[4], data3[4], data4[4], data5[4]
5개의 1차원 배열은 모두 char[4]형식으로 같기 때문에,
char data[5][4];
와 같이 묶을 수 있다.
data 변수의 2번째 행, 3번째 열에 10이라는 값을 넣으려면 아래와 같이 적으면 된다.
data[1][2] = 10;
char temp1[3] = {1, 2, 3};
char temp2[3] = {4, 5, 6};
위와 같이 선언한 두개의 1차원 배열을 아래와 같이 하나의 2차원 배열로 변경할 수 있다.
char temp[2][3];
2차원 배열을 이용하여 temp변수를 선언했으니 초기화도 해 준다.
2차원 배열은 그룹 안에 또 다른 그룹이 있는 형태이기 때문에 { }를 중복으로 사용해야 한다.
char temp[2][3] = {{1, 2, 3}, {4, 5, 6}};
1차원 배열
3x4 바둑판 형태로 축소시켜 놓고 돌이 놓여있는 상황을 1차원 배열로 표현
#include <stdio.h>
void main(){
char data[12] = {0, 0, 2, 0, 1, 1, 0, 0, 2, 1, 0, 2}
int i, x, y;
for(i = 0 ; i < 12 ; i++){
x = i % 4 + 1; /* 열 번호 */
y = i / 4 + 1; /* 행 번호 */
printf("%d행 %d열에", y, x);
if (data[i] == 1) printf(" 검은 돌이 놓여 있습니다.\n");
elsf if (data[i] == 2) printf(" 흰 돌이 놓여 있습니다. \n");
else printf("는 돌이 놓여 있지 않습니다.");
}
}
2차원 배열
#include <stdio.h>
void main(){
char data[3][4] = {{0, 0, 2, 0}, {1, 1, 0, 0}, {2, 1, 0, 2}};
int x, y;
for(y = 0 ; y < 3 ; y++){
for(x = 0 ; x < 4 ; x++){
printf("%d행 %d열에", y+1, x+1);
if (data[y][x] == 1) printf(" 검은 돌이 놓여 있습니다.\n");
else if (data[y][x] == 2) printf(" 흰 돌이 놓여 있습니다.\n");
else printf("는 돌이 놓여 있지 않습니다.\n");
}
}
}
삼차원 배열 : 이차원 배열 여러개가 모여서 이루는 배열.(도형에서의)입체_면들이 모여서 생김
사차원 배열 :삼차원 배열 여러개가 모여서 이루는 배열. 시공간_공간에 시간개념이 추가됨.
출처: https://sunrinnote.tistory.com/13 [chongin12:티스토리]
🔥 다음과 같은 내용을 도전해봅시다.
- 랜덤한 값을 가지는 10개의 배열 만들기
- 해당 배열의 최댓값 출력하기
- 해당 배열의 최솟값 출력하기
- 해당 배열을 오름차순으로 정렬하기
- 해당 배열을 내림차순으로 정렬하기
#include <stdio.h>
int main() {
int byl[10] = {2, 4, 8, 12, 48, 44, 48, 50, 80, 92};
for (int i = 0; i < 10; i++) {
printf("%d ", byl[i]);
}
return 0;
}
2. 해당 배열의 최댓값 출력하기
#include <stdio.h>
int main() {
int byl[10] = {2, 4, 8, 12, 48, 44, 48, 50, 80, 92};
/* 초기에 최댓값을 배열의 첫 번째 요소로 설정 */
int max_value = byl[0];
/* 배열을 순회하면서 최댓값 갱신 */
for (int i = 1; i < 10; i++) {
if (byl[i] > max_value) {
max_value = byl[i];
}
}
printf("최댓값: %d\n", max_value);
return 0;
}
3. 해당 배열의 최솟값 출력하기
#include <stdio.h>
int main() {
int byl[10] = {2, 4, 8, 12, 48, 44, 48, 50, 80, 92};
/* 초기에 최솟값을 배열의 첫 번째 요소로 설정 8?
int min_value = byl[0];
/* 배열을 순회하면서 최솟값 갱신 */
for (int i = 1; i < 10; i++) {
if (byl[i] < min_value) {
min_value = byl[i];
}
}
printf("최솟값: %d\n", min_value);
return 0;
}
4. 해당 배열을 오름차순으로 정리하기
#include <stdio.h>
int main() {
int byl[10] = {2, 4, 8, 12, 48, 44, 48, 50, 80, 92};
for (int i = 0; i < 10 - 1; i++) {
for (int j = 0; j < 10 - i - 1; j++) {
if (byl[j] > byl[j + 1]) {
int temp = byl[j];
byl[j] = byl[j + 1];
byl[j + 1] = temp;
}
}
}
printf("오름차순 배열: ");
for (int i = 0; i < 10; i++) {
printf("%d ", byl[i]);
}
return 0;
}
4. 해당 배열을 내림차순으로 정리하기
#include <stdio.h>
int main() {
int byl[10] = {2, 4, 8, 12, 48, 44, 48, 50, 80, 92};
for (int i = 0; i < 10 - 1; i++) {
for (int j = 0; j < 10 - i - 1; j++) {
if (byl[j] < byl[j + 1]) { /* 부등호 방향 변경 */
int temp = byl[j];
byl[j] = byl[j + 1];
byl[j + 1] = temp;
}
}
}
printf("내림차순 배열: ");
for (int i = 0; i < 10; i++) {
printf("%d ", byl[i]);
}
return 0;
}