C를 다루다보면 다양한 불편함이 생깁니다. 그러한 불편함 중, 변수를 쓸데없이 많이 선언해야할 때가 있습니다.
다행히도, C는 이러한 불편함을 [배열] 변수 선언을 통해 한 방에 해결할 수 있도록 했습니다.
오늘은 배열에 대해 알아보고, 활용할 수 있는 시간을 가져봅시다.
목차
그래서, 배열이 뭔데?
배열은 간단하게 이야기 하면 변수들의 집합체입니다.
여러개의 변수를 하나로 이어붙여서 관리한다고 생각하시면 편합니다.
그림을 보시면, 조금 더 이해가 확 되실 수 있습니다.
결과적으로, 흩어져 있는 변수를 하나의 집합체로 관리해서 편리하게 됩니다.
배열의 가장 큰 이점은 뭐니뭐니 해도, 변수의 이름을 지을 때 나온다고 생각합니다.
int Korean1, Korean2, Korean3, Korean4;
int English1, English2, English3, English4;
지금 만들고자 하는 프로그램이 4명의 성적을 입력받아 저장하고, 평균, 등수 등을 계산하는 프로그램이라 가정합시다.
4명의 성적을 모두 입력받아야 하기에 저렇게 변수를 선언했습니다.
그러나, 이는 매우 귀찮고 복잡한 일입니다. 처리해야 하는 학생이 4명만 되어도 변수의 개수가 벌써 8개임을 알 수 있습니다.
이때, 필요한 것이 배열입니다.
int Korean[4];
int English[4];
자세한 것은 바로 아래의 [배열 만들어보기]에서 배우겠습니다. 당장에는 그냥 배열을 선언했다 정도로 이해해주세요.
이렇게 Korean, English라는 말 하나로 변수 Korean1, Korean2... 등을 대체하는 것에 성공했습니다.
결과적으로 관리가 훨씬 편해졌다고 볼 수 있습니다.
이 외에도, 장점이 한가지 더 있습니다. 이는 [배열에 있는 값 읽어들이기]에서 배우도록 하겠습니다.
또한, 문자열의 저장에도 배열이 쓰입니다. C/C++은 문자 데이터만 존재하고, 문자열 데이터는 존재하지 않습니다.
모두, 문자 데이터의 집합, 그러니까 배열로서 저장할 수 있습니다. 따라서, 우리가 문자열을 입력받거나, 저장 후 출력하는 행동을 위해서는 배열을 선언하고 쓸 필요가 있습니다.
(C++에서는 string이라는 객체를 만들 수 있는 방법이 있어서 문자열 데이터의 저장이 쉽습니다만, C에는 존재하지 않으므로 후에 추가적으로 포스팅하겠습니다.)
배열 만들어보기(배열 선언)
배열 만들기는 매우 쉽습니다. 그냥 변수의 이름 뒤에 [ ]만 붙여주시면 됩니다.
변수의 선언하는 방법이 기억나지 않으시면 아래의 포스팅을 참고해주세요.
2022.12.29 - [IT/C and C++] - [C] 변수란 무엇이고, 어떻게 사용하나요?
[C] 변수란 무엇이고, 어떻게 사용하나요?
저번 포스팅까지는 Visual Studio와 C를 활용한 간단한 실습을 진행하였습니다. 혹시 궁금하신 분들은 아래의 포스팅들을 참고해주세요! 2022.12.29 - [IT/C and C++] - [C]프로그래밍을 시작하는 방법 [C]프
timemory.tistory.com
//(자료형) (변수 이름)[(배열의 크기)];
int Korean[4];
char Name[4];
변수의 선언에 [ ]만 붙인 결과입니다.
어렵지 않게 그 의미를 예측할 수 있습니다.
배열의 크기 안에는 정수 상수만 들어갈 수 있습니다.
(정수 '상수'만 들어갈 수 있습니다. 정수 변수는 들어갈 수 없어요!)
*참고 : 문자열을 사용할 때 주의해야 할 점 중 하나로, 관리하고 싶은 문자의 길이가 n이면 변수의 길이는 무조건 n+1로 해주셔야 합니다. 컴퓨터는 문자열을 읽을 때, 하나를 전체로 보고 읽는 것이 아니라 앞에서부터 하나씩 읽어나갑니다. 결과적으로 '이 문자가 끝이다!'라는 것을 컴퓨터에 알리기 위해서는 마지막 글자가 '\0'(NULL 문자) 일 필요가 있습니다. NULL 문자는 아무것도 없음을 나타내는 문자로 컴퓨터는 이 문자를 읽으면 문자열을 읽는 것을 멈춥니다.
배열의 선언에서 초기화하고 싶을 때는 아래처럼 초기화합니다.
int Korean[4] = { 95, 97, 89, 86 };
int English[4] = { 98, 78 };
{ }로 초기화 하고 싶은 값들을 감싸고, 그 안에 초기화할 값들을 넣어두시면 됩니다.
English 배열을 보시면 초기화 값이 2개입니다. 이 경우, 앞쪽의 2개만 초기화하고, 나머지는 0으로 초기화합니다.
또한 아래와 같이 초기화할 수도 있습니다.
int Korean[] = { 96, 98, 89, 87 };
[ ]안에 배열의 크기가 정해져 있지 않습니다. 이 경우, 컴파일러(저는 Visual Studio 2022)가 알아서 [ ]안에 알맞은 크기를 지정하고 선언해줍니다.
이 경우, Korean의 배열 크기는 4가 됩니다.
위와 같은 방법으로 배열의 크기를 정해주지 않을 경우, 초기화 값이 필수입니다.
배열에 있는 값 읽기
배열의 값은 다음과 같이 읽습니다. 이번에도 [ ]가 쓰이는데 선언에서 쓰이는 것과는 다른 것입니다.
int Korean[] = { 96, 94, 89, 87 };
printf("4번째 학생의 국어 점수 : %d", Korean[3]);
위의 코드와 같이 배열의 우측에 [(읽을 값의 위치)]를 적으시면 됩니다.
*읽을 값의 위치를 Index(인덱스)라고 합니다.
주의해야 할 점은
'4번째 학생의 국어 점수'임에도 불구하고 Korean[3]을 써서 값을 읽습니다.
왜냐하면 배열은 1번째 부터 시작하는 것이 아닌 0번째 부터 시작하기 때문입니다.
(이건 익숙해져야 합니다. 그냥 0부터 시작한다고 외우세요.)
인덱스 번호가 0부터 시작한다는 것만 잘 외워두면, 매우 쉽습니다.
선언에서는 [ ]안에 변수가 들어갈 수 없다고 배웠습니다. 그러나, 인덱스로 값을 읽을 때는 [ ]안에 변수가 들어갈 수 있습니다.
따라서 다음과 같이 활용이 가능합니다.
#include <stdio.h>
int main() {
int Korean[4] = { 91, 98, 86, 96 };
int n = 0;
scanf("%d", &n);
printf("n번째 학생의 국어 점수 : %d", Korean[n-1]);
}
인덱스로 값을 읽을 때, 입력된 n의 값에 따라 결과값이 바뀌도록 할 수 있습니다.
근데, 이를 배열이 아니라, 변수의 형태로서 국어점수를 저장했다면 n의 값을 활용하기 어려웠을 것입니다.
따라서, 배열의 이점에는 이렇게 변수로도 입력이 가능한 인덱스를 활용해 값 읽기가 가능하다는 점이 있습니다.
2차원, 3차원 배열이 뭔가요?
2차원, 3차원 배열은 말 그대로 차원수가 늘어난 배열입니다.
1 | 2 | 3 | 4 |
위의 표를 하나의 배열이라고 생각합시다. 이렇게 배열값이 인덱스 하나에 의해서 변하게 하고 싶은 경우 그냥 위에서 배웠던 배열을 사용하시면 됩니다.
그러나, 우리는 아래와 같은 자료를 배열로 선언하고 싶습니다.
1번째 | 2번쨰 | |
사람1 | 8 | 5 |
사람2 | 3 | 9 |
위의 자료는 [사람]과 [번호]로 두 가지 기준점이 존재합니다. 물론, 이것도 규칙을 정해놓으면 위에서 배웠던 배열을 사용해서 저장 및 관리가 가능합니다.
예를 들면 아래와 같이 말입니다.
int Var[4] = {8, 5, 3 ,9} // 2칸씩 나눠서 한 사람 사람n과 m번째 자료는 2*n+m-3의 인덱스를 가진다.
이런식으로 주석(코드에 포함되지 않는 메모와 같은 개념)을 이용해서 값을 다룰 수 있습니다. 그러나, 배열의 크기가 1000, 10000 정도가 된다면, 하나의 값을 구하기 위해 어지러운 식에 대입해서 인덱스를 얻어야 합니다.
결과적으로, 이는 매우 비효율적인 방식입니다. C는 현명하고 합리적인 방식으로 이를 해결했는데, 바로 차원(인덱스의 개수)를 늘리는 방식입니다.
아래와 같이 선언하고 값을 읽을 수 있습니다.
int var[2][2] = {8, 5, 3, 9};
printf("%d", var[1][1]) // 9
이렇게 선언할 때나, 읽을 때 [ ]를 하나 더 붙임으로서 인덱스의 개수 자체를 늘려버리는 방식으로 이를 해결했습니다.
이렇게 선원된 배열은 2차원 배열이라고 불립니다.
또한, [ ]를 더 붙임으로서 3차원, 4차원...n차원 배열을 만들 수는 있지만
제 기억상으로 5차원 배열 이상을 쓰시는 분은 못 봤습니다.
아마 여러분들도 살면서 일부러 하지 않는 한 4차원 배열정도까지만 쓰지 않을까 싶습니다.
마무리
이번에는 C에서 중요한 개념 중 하나인 배열에 관하여 다루어보았습니다.
사실 배열은 포인터를 배우고 나서 한번 더 짤막하게 다룰 예정입니다.
언제가 될지는 모르겠지만, 그 때가서 다시 배열을 들고 나와야겠군요.
물론 그 때쯤이면, C/C++에 꽤 익숙해지겠지요?
'IT > C and C++' 카테고리의 다른 글
[C] 프로그램의 흐름을 조절하는 제어문(1/3) (0) | 2023.01.04 |
---|---|
[C] scanf 함수를 알아보자! (0) | 2023.01.02 |
[C] 절대불변의 값, 상수에 대하여 (0) | 2022.12.30 |
[C] 전역변수와 지역변수란? (0) | 2022.12.30 |
[C] 함수란 무엇이고, 어떻게 사용하나요? (2/2) (0) | 2022.12.30 |
댓글