Array 배열
같은 데이터 타입을 가진 다수의 변수들을 하나의 변수만으로 저장할 수 있게 도와주는 자료구조다.
배열 선언, 요소 접근
배열은 변수 이름 뒤에 [ ] 대괄호를 붙인 뒤 크기를 설정한다.
그리고 배열을 선언하면서 값을 초기화 할 때는 { } 중괄호를 사용한다.
- 자료형 배열이름[크기];
- 자료형 배열이름[크기] = {값, 값, 값};
int main() {
int studentScoreArray[5] = {80, 90, 100, 40, 50}; // 배열을 생성하고 값 할당
printf("%d\n", studentScoreArray[0]); // 80: 배열의 첫 번째(인덱스 0) 출력
printf("%d\n", studentScoreArray[2]); // 100: 배열의 세 번째(인덱스 2) 출력
printf("%d\n", studentScoreArray[3]); // 40: 배열의 네 번째(인덱스 3) 출력
return 0;
}
실행 결과
80
100
40
배열의 인덱스
배열의 인덱스는 항상 0부터 시작한다. 따라서 배열 studentScoreArray의 첫 번째 값은 studentScoreArray[0]이 된다.
배열을 선언할 때나 배열의 각 요소에 접근할 때에도 대괄호[ ]를 사용한다.
배열을 선언할 때의 대괄호[ ] 는 이 변수가 배열이고 크기는 얼마라는 것을 알려주는 역할,
배열을 사용할 때의 대괄호[ ] 는 배열의 해당 요소에 접근 하겠다는 뜻이다.
배열을 선언할 때에는 항상 1이상부터이며, 배열을 접근할 때에는 항상 인덱스가 0부터 시작한다.
int studentScoreArray[0]; // 컴파일 에러, 크기가 0인 배열은 선언할 수 없다.
int studentScoreArray[2]; // 크기가 2인 배열, 값은 2개가 들어간다.
studentScoreArray[0]; // 배열의 첫 번째 값이다. 인덱스 0으로 접근한다.
배열의 인덱스가 0부터 시작하는 이유는 메모리 주소가 0부터 시작하기 때문이다. 배열도 포인터이므로 인덱스가 0부터 시작하면 요소 접근과 포인터 연산이 일치하게 된다.
배열을 선언할 때 크기를 생략할 수 있다.
배열을 선언할 때 값을 초기화한다면 배열의 크기를 생략할 수 있다. (초기화를 하지 않을 때는 생략 불가능)
int studentScoreArray[5] = {80, 90, 100, 40, 50}; // 배열을 생성하고 값 할당
int studentScoreArray[]; // 컴파일 에러
배열을 0으로 초기화
- 자료형 배열이름[크기] = {0};
int main() {
int studentScoreArray[5] = {0}; // 배열을 생성하고 값 할당
printf("%d\n", studentScoreArray[0]); // 80: 배열의 첫 번째(인덱스 0) 출력
printf("%d\n", studentScoreArray[2]); // 100: 배열의 세 번째(인덱스 2) 출력
printf("%d\n", studentScoreArray[3]); // 40: 배열의 네 번째(인덱스 3) 출력
return 0;
}
실행 결과
0
0
0
배열을 선언할 때 {0}을 할당하여 배열의 요소를 모두 0으로 초기화했다. 이렇게 하면 초기화 할 때 일일이 0을 나열하지 않아도 된다. ({1}으로 입력하여 1로 모든 값을 초기화 할 수 없다. 오직 0만)
배열의 요소에 값 할당하기
배열은 대괄호[ ]로 요소에 접근한 뒤 값을 할당하는데
- 배열[인덱스] = 값;
int main() {
int studentScoreArray[5];
studentScoreArray[0] = 10;
studentScoreArray[1] = 50;
studentScoreArray[2] = 100;
return 0;
}
이렇게 일일이 할당한다면 배열을 쓸 이유가 없다.
할당하는 법을 알았다면 배열과 거의 항상 함께 하는 반복문을 통해 할당하자.
int main() {
int studentScoreArray[5]; // 배열을 생성하고 값 할당
// studentScoreArray배열에 1 - 5의 값을 넣기
for (int index = 0; index < 5; index++) {
studentScoreArray[index] = index + 1;
}
// Array 값 출력
for (int index = 0; index < 5; index++) {
printf("studentScoreArray[%d] = %d\n", index, studentScoreArray[index]);
}
return 0;
}
실행 결과
studentScoreArray[0] = 1
studentScoreArray[1] = 2
studentScoreArray[2] = 3
studentScoreArray[3] = 4
studentScoreArray[4] = 5
주의할 점은 배열의 요소에 접근할 때 인덱스로 음수를 지정하거나, 배열의 크기를 벗어난 인덱스를 지정할 경우 컴파일 에러가 발생하지는 않는다. 문제는 실행해보면 콘솔 창에서 쓰레기 값이 출력된다. 즉 배열의 범위를 벗어난 인덱스에 접근하면 배열이 아닌 다른 메모리 공간에 접근하게 된다.
반복문으로 배열의 모든 요소 출력하기
int main() {
int studentScoreArray[5]; // 배열을 생성하고 값 할당
// studentScoreArray배열에 입력 값을 넣기
for (int index = 0; index < 5; index++) {
scanf("%d", &studentScoreArray[index]);
}
// 입력한 값에 대한 모든 Array 값 출력
for (int indexTwo = 0; indexTwo < sizeof(studentScoreArray) / sizeof(int); indexTwo++) {
printf("studentScoreArray[%d] = %d\n", indexTwo, studentScoreArray[indexTwo]);
}
return 0;
}
입력
10
20
30
40
50
실행결과
studentScoreArray[0] = 10
studentScoreArray[1] = 20
studentScoreArray[2] = 30
studentScoreArray[3] = 40
studentScoreArray[4] = 50
반복문에서 for (int index = 0; index < sizeof(ArrayName) / sizeof(int); index++) 처럼 조건식에 sizeof를 사용하여 배열의 요소 개수를 구한 뒤 반복하였다.
배열을 이용한 간단한 성적 프로그램
1. 5명의 학생의 영어 점수를 입력으로 처리
2. 과목 합계와 평균을 출력
#include <stdio.h>
int main() {
int student[5]; // 5명의 학생
int rank[5]; // 석차를 저장할 배열
int sum;
float average;
// 5명의 학생의 영어 점수 입력
for (int index = 0; index < 5; index++) {
printf("[%d]학생의 영어점수 : ", index + 1);
scanf("%d", &student[index]);
rank[index] = 1; // 모든 학생의 석차를 1로 초기화
sum += student[index];
}
average = sum / 5;
// 석차 계산
for (int index = 0; index < 5; index++) {
for (int indexTwo = 0; indexTwo < 5; indexTwo++) {
if (rank[index] < rank[indexTwo]) {
rank[index]++;
}
}
}
printf("과목의 합계는 : %d\n", sum);
printf("과목의 평균은 : %.2f", average);
}
실행 결과