배열
배열(Array)의 개념
**Array(배열)**는 동일한 자료 유형의 여러 변수를 한 번에 선언하여 사용하는 자료 구조이다. Array를 선언하면, 각 원소는 동일한 크기로 메모리상에 연속적으로 저장된다. 이는 여러 세대가 하나의 건물에 모여 사는 아파트와 유사한 개념으로, 단독주택과 같은 일반 변수와 비교할 수 있다.
배열의 선언
Array의 선언은 자료형, 배열 이름, 배열 크기 세 가지 주요 요소로 구성된다.
문법: 자료형 배열이름[배열크기];
int score[10]; // int형 변수 10개를 저장할 수 있는 score 배열을 선언한다.
- 자료형: Array에 저장될 원소의 자료형을 지정한다.
- 배열 이름: 식별자 규칙에 따라 이름을 지정한다.
- 배열 크기: 대괄호
[]
안에 저장할 원소의 개수를 지정한다.
배열의 원소와 첨자
- Array Element(배열 원소): Array를 구성하는 각각의 저장 공간(항목)을 의미한다.
- Index(첨자): Array의 각 원소에 접근하기 위해 사용하는 번호이다. C언어에서 Array의 **Index(첨자)**는 항상 0부터 시작한다. 따라서 크기가 10인 배열의 유효한 Index 범위는 0부터 9까지이다. 예를 들어,
score[4]
는score
배열의 다섯 번째 원소를 참조한다.
배열의 초기화
**Initialization(초기화)**는 배열을 선언함과 동시에 각 원소에 초기값을 할당하는 것이다.
-
선언 후 개별 할당: 선언 후에 Index를 이용하여 각 원소에 값을 대입할 수 있다.
int a[4];
a[0] = 10;
a[1] = 30; -
선언 시 초기화: 중괄호
{}
를 사용하여 선언과 동시에 값을 할당할 수 있다. 이 방법은 선언 시에만 사용할 수 있다.int a[4] = {10, 30, 40, 50};
-
초기화 시 배열의 크기를 생략하면, 컴파일러가 초기값의 개수에 맞춰 크기를 자동으로 결정한다.
int a[] = {10, 30, 40, 50};
-
초기값의 개수가 배열의 크기보다 작으면, 나머지 원소들은 자동으로 0으로 초기화된다.
int b[4] = {1, 3}; // b[2]와 b[3]은 0이 된다.
-
1차원 배열의 활용
배열의 합과 평균
for
반복문을 사용하여 배열의 모든 원소를 순회하며 합계를 구할 수 있다. 평균은 계산된 총합을 원소의 개수로 나누어 구하며, 정확한 소수점 결과를 얻기 위해 형변환(Type Casting)이 필요하다.
int grade[] = {10, 20, 33, 35, 13, 79, 45};
int total = 0;
int i;
for (i = 0; i < 7; i++) {
total += grade[i];
}
double avg = (double)total / 7; // 정수 나눗셈을 피하기 위해 double로 형변환
배열의 최소값 구하기
배열에서 최소값을 찾는 방법은 두 가지가 있다.
- 최소값 자체를 저장: 변수
min
을 첫 번째 원소data[0]
으로 초기화한 후, 배열을 순회하며min
보다 작은 값을 만나면min
을 그 값으로 갱신한다. - 최소값의 위치(Index)를 저장: 변수
minIndex
를 0으로 초기화한 후 , 배열을 순회하며data[i]
가data[minIndex]
보다 작으면minIndex
를i
로 갱신한다.
배열의 정렬
중첩된 for
반복문을 사용하여 배열을 정렬할 수 있다. 다음은 오름차순으로 정렬하는 선택 정렬(Selection Sort)의 예시이다.
// 바깥쪽 루프는 정렬될 위치를 지정한다.
for (i = 0; i < 10; i++) {
// 안쪽 루프는 정렬되지 않은 나머지 부분에서 최소값을 찾는다.
for (j = i + 1; j < 10; j++) {
// 현재 위치(i)의 값보다 더 작은 값을 찾으면 두 값을 교환(swap)한다.
if (a[i] > a[j]) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
다차원 배열과 문자열
2차원 배열
2차원 배열은 행(row)과 열(column)으로 구성된 테이블 형태의 배열이다. 첫 번째 크기가 행의 수를, 두 번째 크기가 열의 수를 나타낸다.
int a[2][4]; // 2행 4열의 2차원 배열 선언
a[1][2] = 10; // 2행 3열 위치의 원소에 10을 저장
문자열(String) 처리
C언어에서 **String(문자열)**은 문자의 배열로 처리되며, 문자열의 끝은 항상 Null character(널 문자) \0
로 표시된다. 따라서 문자열을 저장할 배열의 크기는 실제 문자 수보다 최소 1 이상 커야 한다.
문자열을 초기화하는 방법은 다음과 같다.
char s[] = "C Language";
: 컴파일러가 자동으로 마지막에\0
을 추가한다.char c[4] = {'a', 'b', 'c', '\0'};
: 수동으로\0
을 추가해야 한다.
문자열 입출력
-
printf("%s", s);
:%s
변환 명세를 사용하여 문자열을 출력한다.
-
scanf("%s", name);
: 공백 없는 문자열을 입력받는다. 첫 번째 공백 문자(space, tab, enter)가 나오기 전까지의 문자열만 저장하는 한계가 있다. -
gets(line);
/puts(line);
: 공백을 포함한 한 줄 전체를 입출력할 수 있다.gets()
는 입력받을 문자열을 저장하기에 충분한 크기의 배열을 인자로 받아야 한다.