c언어 배열 기초 알아보기
네 안녕하세요, 이번 포스팅에서는 배열에 대하여 알아보도록 하겠습니다.
사실 배열은 우리가 데이터를 다룰 때 없어서는 안 되는 요소이며,
실제로 프로그래밍을 할 때 정말 많이 쓰입니다.
거의 항상 쓰인다고 봐야죠.
그래서 이번 시간에는 그런 배열에 대하여 하나하나 알아보도록 하겠습니다.
그럼 지금부터 시작하도록 하겠습니다.
1. 배열이란?
배열은 동일한 타입의 데이터가 한 곳에 여러개가 저장이 된 장소입니다.
기본적으로 배열은 정수형으로 저장이 되어있어서 정수형 자료형으로 접근을 합니다.
그래서 필요에 따라서 캐스팅(형 변환)을 해주어야 합니다.
그리고 이러한 배열이 필요한 이유는 우리가 한 번에 하나의 데이터만 처리를 하는 게 아니기에,
다수의 데이터가 비슷하거나 같은 특성을 지니고 있다고 한다면 한 번에 처리를 하는 것이 일률적으로 좋겠죠?
그래서 우리가 배열을 쓰는 것입니다.
1 - 1. 배열의 특징
배열은 다음과 같은 특징을 가지고 있습니다.
- 배열은 연속적인 데이터이기 때문에 연속적인 메모리 공간에 저장이 된다.
- 배열은 한 개의 이름을 공유하고, 번호만 다르기 때문에 비슷하거나 관련이 있는, 혹은 같은 범주 내에 있는 데이터를 순서대로 접근하여 처리를 할 수 있다는 장점을 가지고 있다.
1 - 2. 배열의 선언
배열 역시 우리가 변수를 선언을 하는 것 처럼 선언을 해야 합니다.
기본적으로 이렇게 씁니다.
int A[10];
변수명은 대소문자 아무거나 써도 되지만,
보통 일반 변수를 선언할 때 소문자를 쓰기 때문에 이와 다르다는 것을 표시하기 위해서 대문자를 자주 씁니다.
이렇게 쓰게되면 A라는 배열 안에 10개의 데이터가 저장이 되어있다는 뜻이 됩니다.
그리고 이 역시 컴퓨터가 새는 것이기 때문에 0번부터 9번까지 저장이 되어 총 10개입니다.
또한, 기본형은 정수형이지만, 다른 자료형으로도 선언이 될 수 있습니다.
float A[23]; // 실수형 배열 선언
char name[40]; // 문자형 배열 선언
char src[15], dst[10]; // 문자열 배열 선언
int index, days[7]; // 일반 변수와 배열을 함께 선언
// #define을 이용하여 상수 선언 후 배열에 적용
#define SIZE 30
int B[SIZE];
이렇게 쓸 수 있습니다.
1 - 3. 배열 요소에 접근하기
우리가 배열을 선언을 했다면, 배열 요소에도 접근을 해야 데이터를 다룰 수 있겠죠?
우리가 사용하는 배열은 0번부터 시작하여 (n - 1) 번까지의 번호가 부여가 된다고 그랬습니다.
다시 말하면 10개의 데이터가 들어있는 배열이라 한다면, 0번부터 9번까지 있는 것이지요.
그리고 여기 보이는 0 ~ 9번 까지의 번호를 우리는 '인덱스'라고 부릅니다.
예를 들어서 우리가 A라는 배열에 있는 인덱스 넘버가 3인 데이터에 접근을 하고 싶다면 'A [3]'이라고 입력을 하면 되며,
이 요소들은 우리가 사용하는 변수랑 똑같기 때문에 각각의 요소에 데이터를 저장을 할 수 있습니다.
이런 식으로요.
A[i] = 50; // 변수를 인덱스로 쓸 수 있음.
A[i + 2] = 30; // 수식을 인덱스로 쓸 수 있음.
A[index[3]] = 60; // index[]는 정수배열, 배열 안에 배열을 쓰는 것도 가능함.
그럼 제가 간단한 예제를 들어 한 번 보여드리겠습니다.
#include <stdio.h>
int main()
{
int a, A[5];
A[0] = 1;
A[1] = 2;
A[2] = 3;
A[3] = 4;
A[4] = 5;
for(a = 0; a < 5; a++)
{
printf("A[%d] = %d\n", a, A[a]);
}
return 0;
}
이렇게 작성을 했고요,
이제 결과를 보도록 하겠습니다.
A[0] = 1
A[1] = 2
A[2] = 3
A[3] = 4
A[4] = 5
결과도 잘 나오는 것을 볼 수가 있습니다.
2. 배열과 반복문
우리는 보통 배열을 쓸 때 반복문을 쓰게 됩니다.
그 이유는 반복문을 쓰게되면 값을 한 번에 저장을 할 수 있기 때문입니다.
우리가 반복문을 쓰지 않는다면 인덱스에 일일이 데이터의 값을 선언을 하여 저장을 해야 하지만,
반복문을 쓰게 된다면 그럴 필요 없이 for문 하나로 저장을 할 수 있기 때문입니다.
그러면 제가 한 번 간단한 예제를 보여드리도록 하겠습니다.
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
int main()
{
int scores[SIZE];
for(int i = 0; i < SIZE; i++)
{
scores[i] = rand() % 100;
}
for(int i = 0; i < SIZE; i++)
{
printf("scores[%d] = %d\n", i , scores[i]);
}
return 0;
}
이렇게 작성을 했습니다.
배열이 잘 저장이 되는지 테스트를 해보기 위해 난수 함수를 사용하기 위해서 <stdlib.h> 헤더 파일을 들여왔고,
배열의 크기는 가독성을 높이기 위해서 #define을 이용하여 상수화 시켰습니다.
그럼 결과를 바로 보도록 하겠습니다.
scores[0] = 41
scores[1] = 67
scores[2] = 34
scores[3] = 0
scores[4] = 69
이렇게 결과가 잘 저장이 된 것을 볼 수가 있습니다.
그러면 이걸 활용하여 학생들의 성적 평균을 구하는 프로그램을 한 번 작성을 해보도록 하겠습니다.
#include <stdio.h>
#include <stdlib.h>
#define STUDENTS 5
int main()
{
int average, sum = 0;
int scores[STUDENTS];
for(int i = 0; i < STUDENTS; i++)
{
printf("학생들의 성적을 입력하세요 : ");
scanf("%d", &scores[i]);
}
for(int i = 0; i < STUDENTS; i++)
{
sum += scores[i];
}
average = sum / STUDENTS;
printf("성적의 평균은 %d입니다.\n", average);
return 0;
}
이렇게 작성을 했습니다.
그럼 결과는 어떻게 나오는지 한 번 볼까요?
학생들의 성적을 입력하세요 : 5
학생들의 성적을 입력하세요 : 78
학생들의 성적을 입력하세요 : 43
학생들의 성적을 입력하세요 : 87
학생들의 성적을 입력하세요 : 99
성적의 평균은 62입니다.
결과도 잘 나오는 것을 볼 수가 있습니다.
3. 인덱스의 범위
앞서 이야기를 했지만, 인덱스의 범위는 0부터 (n - 1)까지라 했습니다.
그 이유는 컴퓨터는 무조건 0부터 수를 세기 때문에 그렇습니다.
그래서 첫 번째 데이터에 접근을 하고 싶다면 인덱스 번호 0번의 데이터에 접근을 해야 합니다.
그리고 아까 예제에서 보실 수 있듯이, 제가 이렇게 쓴 것이 보였을 것입니다.
printf("scores[%d] = %d\n", i , scores[i]);
scanf("%d", &scores[i]);
형식 지정자와 대응이 되는 변수에 배열을 넣어도 문제가 되지 않습니다.
그 이유는 데이터에 접근을 하려면 배열의 인덱스 번호와 연결이 되어야 하기 때문에 이러한 부분에서 오류가 난다면 접근을 할 수가 없겠죠?
그리고 이러한 경우도 있을 수 있는데,
이 경우를 우리는 최악의 경우라 부르기로 했습니다.
그럼 바로 보여드리겠습니다.
int A[3]
A[3] = 5;
무엇이 잘못되었는지 바로 보이시죠?
배열의 범위를 벗어났습니다.
배열의 크기가 3이라면 인덱스 번호는 0, 1, 2가 되는데,
3을 넣음으로써 그 배열이 틀어진 것입니다.
이렇게 되면 엉뚱한 변수의 값을 변경을 하게 되고,
최악의 경우에는 컴퓨터 시스템 자체가 중단이 되는 불상사가 일어날 수 있으니,
항상 주의를 기울여야 합니다.
여기까지 배열의 기본에 대하여 알아보았는데요,
다음 포스팅에서는 배열을 초기화 하는 방법에 대하여 알아보도록 하겠습니다.
긴 글 읽어주신 독자님들께 진심으로 감사드립니다 ~
'c언어' 카테고리의 다른 글
c언어 배열을 함수를 이용하여 다루기(배열의 복사, 배열의 비교, 배열의 변경, 학생들의 성적 평균 구하기) (0) | 2022.12.06 |
---|---|
c언어 배열 초기화, 복사, 비교하는 방법 알아보기 (0) | 2022.12.06 |
c언어 변수 이용하여 문제 풀기(은행 계좌 구현하기, 초기화를 한 번만 하기, 난수 발생기 만들기, 10진수를 2진수로 출력하기, 하노이의 탑 문제 풀기) (0) | 2022.12.06 |
c언어 순환 호출하기 (0) | 2022.12.06 |
c언어 가변 매개 변수 함수 알아보기 (0) | 2022.12.06 |
댓글