배열
50명의 시험 점수를 변수에 기억시켜 관리하는 코드를 쓴다면 test1부터 test50이라는 이름의 변수를 50개 초기화할 수 있다.
int test1 = 90;
int test2 = 80;
int test3 = 20;
...
int test50 = 75;
이와 같이 많은 변수를 사용하면 코드가 복잡해서 읽기가 어렵게 되는 경우가 있다. 이때에는 배열(array)을 사용하면 편리하다.
변수가 특정의 1개의 값을 기억시키는 기능을 가지고 있다는 것을 생각하도록 한다. 배열도 특정의 값을 '기억한다'는 점에서 변수와 똑같은 역할을 가진다. 단, 배열은 똑같은 형의 값을 여러 개 종합해서 기억한다는 편리한 기능을 갖추고 있다.
변수와 같이 배열의 상자 내에도 값을 저장해서 이용할 수 있다. 배열의 각각의 상자를 배열 요소(element)라고 부른다.
배열 선언
그러면 배열을 사용해 보도록 한다. 변수와 같이 배열도 사용하기 전에 배열을 선언하는 작업이 필요하다. 배열의 여러 상자를 준비하는 작업에 해당한다. 배열의 경우도 식별자(변수 파트 참조)로부터 적당한 배열명을 준비하고 형을 지정한다. 단, 배열일 경우는 이것에 추가해서 몇 개의 값을 기억할 것인가를 지정해야 한다. 즉, 배열에서는 상자의 수를 지정해야 한다. 이 수를 배열의 요소 수라고 부른다. 배열의 선언은 다음과 같은 형식으로 되어 있다.
[구문 : 배열의 선언]
형명 배열명[요소 수];
그러면 int형의 값을 5개 기억할 수 있는 요소 수가 5인 배열 test[5]를 선언해 보도록 한다.
int test[5]; //int형의 값 5개를 기억할 수 있는 배열을 선언하였다.
배열의 요소 수는 정해진 수이어야 한다. 즉, [ ]에 기입하는 수는 5와 10이란 고정적인 수어야 한다. 준비한 배열의 상자(요소)에는 각각의 상자에 다음의 이름이 붙여진다.
test[0]
test[1]
test[2]
test[3]
test[4]
[ ] 내에 지정하는 번호를 첨자(index)라고 한다. 이 첨자에 의해 배열의 상자를 특정할 수 있다.
C++의 배열의 첨자는 0부터 시작하므로 마지막의 첨자는 '요소 수 - 1'로 되어 있다. test[4]가 값을 저장할 수 있는 마지막의 요소로 된다. test[5]라는 이름의 요소는 없으므로 주의해야 한다.
배열의 사용
배열 요소에 값 대입
배열의 각 요소는 test[0], test[1], ...이라는 이름으로 취급하도록 되어 있으므로 1개씩 값을 대입해 보도록 한다. 이 배열의 상자에는 정수값을 대입한다.
int test[5]; //배열을 선언하였다.
test[0] = 90;
test[1] = 80;
test[2] = 20;
test[3] = 50;
test[4] = 75;
여기서는 5개의 배열 요소에 시험 점수를 대입한다. 배열 요소에 값을 대입하는 방법은 변수와 똑같다. 배열의 상자를 지정하고 대입 연산자의 =를 사용해서 기술하면 된다.
[구문 : 배열 요소로의 값 대입]
배열명[첨자] = 식;
배열 요소의 값 출력
그러면 배열을 실제로 이용하는 코드를 작성해 보도록 한다. 각 요소의 첨자는 0부터 순서대로 정렬되어 있으므로 반복문을 사용하면 세련되게 기술할 수 있다.
예제) 배열 요소값의 출력
배열에 성적 점수를 저장하고, 반복문을 사용해서 배열에 저장한 시험 점수를 출력하는 코드를 작성해 보도록 한다.
#include <iostream>
using namespace std;
int main()
{
int test[5];
test[0] = 90;
test[1] = 80;
test[2] = 20;
test[3] = 50;
test[4] = 75;
for (int i = 0; i < 5; i++) { //①...
cout << i + 1 << "번째의 학생의 점수는 " << test[i] << "입니다.\n";
}
return 0;
}
① 반복문을 사용해서 배열 요소를 출력한다. 우선 최초의 배열의 각 요소에 값을 대입한다. 그 후에 for문을 사용해서 각 요소의 값을 출력한다. 배열의 첨자는 0에서부터 시작하고 있기 때문에 반복문 내에는 출력하는 순서를 i + 1번째로 지정한다.
이와 같이 배열에서는 각 요소를 지정할 때의 첨자에 변수를 사용한다는 것이 가능하도록 되어 있다. 이것으로 '몇 번째 학생의 점수인가'를 반복문 내에서 출력할 수 있는 것이다. 배열과 반복문을 사용하면 코드를 세련되게 기술할 수 있다.
배열 초기화
앞선 예제에서는 배열의 선언과 값의 대입을 별개의 코드로 기술하였다. 배열에서는 이 2개의 작업을 종합해서 수행할 수 있도록 되어 있다.
[구문 : 배열의 초기화]
형명 배열명[요소 수] = {값0, 값1, ...};
지금까지 살펴본 시험의 점수를 취급하는 배열은 다음과 같이 초기화할 수 있다.
int test[5] = {90, 80, 20, 50, 75};
{ } 내에 값을 차례대로 각 요소의 값을 기술한다. 그러면 배열이 준비되었을 때 90, 80, ... 이라는 값이 요소에 저장되는 것이다. { } 내에 지정하는 값을 초기값이라고 부른다. 위에서는 90, 80, ... 이 초기값이다.
또한 배열을 초기화할 경우에는 [ ] 내에 배열의 요소 수를 지정하지 않아도 상관없다. 요소 수를 지정하지 않은 경우는 초기화자의 수에 대응한 요소가 자동으로 준비되는 것으로 되어 있기 때문이다. 즉, 다음의 초기화는 상기의 코드와 완전히 똑같은 의미로 된다.
int test[] = {90, 80, 20, 50, 75};
배열의 첨자에 주의
또한 배열을 사용할 경우에는 주의해야 할 것이 있다. 그것은 배열의 크기를 넘는 요소를 이용할 수가 없다는 것이다. 예를 들면, 지금까지의 코드에서는 5개의 요소를 가지는 배열을 선언하였다. 이 배열을 취급할 때는 test[10] 등이란 첨자를 지정해서 값을 대입하는 것은 안된다.
int test[5];
//오류
//test[10] = 50;
test[10]이란 요소는 존재하지 않는다. 이와 같은 코드는 잘못된 것이다. 배열의 첨자에 주의하기 바란다.
배열의 응용
키보드로부터 입력
이번에는 시험의 점수를 키보드로부터 입력해서 배열에 저장하고, 종합해서 출력하는 코드를 기술해 보도록 한다. 배열의 수를 변경하기 쉽도록 상수를 사용해 보도록 한다. 상수를 사용하려면 변수의 초기화를 수행할 때 const 키워드를 지정한다.
예제) 배열 요소에 수의 입력
키보드로부터 입력한 값을 배열에 저장하여 출력하는 코드를 작성해 보도록 한다. 상수를 사용하려면 변수의 초기화를 수행할 때 const 키워드를 지정한다.
#include <iostream>
using namespace std;
int main()
{
const int num = 5; //인원수의 지정에는 상수를 사용한다.
int test[num];
cout << num << "명의 학생의 점수를 입력하세요.\n";
for (int i = 0; i < num; i++) {
cin >> test[i]; //이 코드에서는 키보드로부터 입력한 5명의 점수를 배열에 저장한다.
}
for (int j = 0; j < num; j++) {
cout << j + 1 << "번째 학생의 점수는 " << test[j] << " 입니다.\n";
} //for문을 사용해서 입력한 값을 배열을 사용해서 출력한다.
return 0;
}
이 코드에서는 const를 지정한 상수를 사용한다. 이 때문에 시험을 치른 학생수에 맞춰서 코드를 쓰는 것이 간단하다. 즉, const int num = 5;에서 '5'의 수치를 바꾸어 쓰면 좀 더 많은 학생의 점수를 관리하는 코드를 작성할 수 있다.
배열의 내용 정렬
배열을 사용한 응용으로 시험의 점수를 정렬해 보기로 한다. 값을 순서대로 정렬하는 것을 정렬(sort)이라고 한다. 배열은 요소에 여러 개의 값을 지정할 수 있기 때문에 정렬하는 코드에 이용하면 편리하다.
예제) 배열 요소의 정렬
앞선 예제에서 배열에 저장된 값을 내림 차순으로 정렬하는 코드를 작성해 보도록 한다.
큰 수 → 작은 수 : 내림 차순 작은 수 → 큰 수 : 오름 차순
#include <iostream>
using namespace std;
int main()
{
const int num = 5;
int test[num];
cout << num << "명의 학생의 점수를 입력하세요.\n";
for (int i = 0; i < num; i++) {
cin >> test[i];
}
for (int s = 0; s < num - 1; s++) { //배열을 정렬한다.
for (int t = s + 1; t < num; t++) {
if (test[t] > test[s]) {
int temp = test[t];
test[t] = test[s];
test[s] = temp;
}
}
}
for (int j = 0; j < num; j++) {
cout << j + 1 << "번째 학생의 점수는 " << test[j] << " 입니다.\n";
}
return 0;
}
이 코드는 배열의 요소를 큰 순으로 정렬하는 코드이다. 실행 결과를 보면 점수가 높은 순으로 출력되어 있다. 배열을 정렬하려면 여러 가지 방법이 있지만 여기서는 다음과 같은 방법을 사용한다. 순서를 살펴보도록 한다.
① 우선 처음에 배열의 각 요소를 배열 1번째 요소 (test[0])와 비교해 간다. 비교한 요소 쪽이 큰 경우에는 1번째 요소와 바꾸어 넣는다. 그러면 배열의 1번째 요소에 최댓값을 저장할 수 있다.
② 이것으로 가장 큰 값인 배열의 1번째 요소가 결정되었다. 그리고 남은 요소에 관해서도 같은 처리를 반복한다. 즉, 남은 요소를 배열의 2번째 (test[1])와 비교해서 큰 경우에 바꾸어 넣는다. 그러면 최종적으로 2번째로 큰 수치가 2번째의 요소로 된다.
③ 순서대로 반복하면 배열의 정렬이 완료된다.
90 80 75 50 20
위 예제에서는 반복문을 종합해서 이 정렬의 순서를 기술하고 있다. 요소를 바꾸어 넣기 위해서는 바꾸어 넣는 것과 같은 형의 작업용 에리어(변수)가 필요하다. 그 때문에 이 정렬에서는 작업용 변수 tmp를 사용하고 있다.
다차원 배열의 구조
지금까지 학습한 배열은 일렬로 정렬한 상자와 같은 이미지로 하였다. C++에서는 2차원 이상으로 상자를 정렬한 이미지를 가리키는 다차원 배열을 만들 수 있다. 2차원 배열이면 표 계산 소프트웨어의 표(워크시트)와 같은 이미지를 생각할 수 있다. 3차원 배열이면 x축, y축, z축으로 나타내는 입체를 생각하면 좋을지도 모른다.
다차원 배열의 선언은 다음과 같다.
[구문 : 다차원 배열(2차원인 경우)]
형명 배열명[요수 수][요수 수];
실제의 다차원 배열의 선언을 살펴보도록 한다.
int test[2][5];
이 2차원 배열은 int형의 값을 2 × 5 = 10개 기억할 수 있는 배열이다. 다차원 배열은 여러 가지 용도에서 이용이 고려되고 있다. 예를 들면, 여러 과목의 시험 점수를 정리할 수 있다. 또한 수학의 행렬식의 계산 등에 응용할 수도 있다.
예제) 다차원 배열
배열 크기가 2 × 5인 2차원 배열을 사용하여 5명의 학생에 대한 국어, 수학 점수를 저장하고 출력하는 코드를 작성해 보도록 한다.
#include <iostream>
using namespace std;
int main()
{
const int sub = 2; //과목수를 초기화한다.
const int num = 5; //인원수를 초기화한다.
int test[sub][num]; //과목수×인원수분의 값을 저장하는 2차원 배열이다.
test[0][0] = 90;
test[0][1] = 80;
test[0][2] = 20;
test[0][3] = 50;
test[0][4] = 75;
test[1][0] = 95;
test[1][1] = 55;
test[1][2] = 88;
test[1][3] = 72;
test[1][4] = 58;
for (int i = 0; i < num; i++) {
cout << i + 1 << "번째의 학생의 국어 점수는 " << test[0][i] << " 입니다.\n"; //국어 점수 출력
cout << i + 1 << "번째의 학생의 수학 점수는 " << test[1][i] << " 입니다.\n"; //수학 점수 출력
}
return 0;
}
여기서는 test[0][●]에 국어 점수를 test[1][●]에 수학 점수를 저장하는 것으로 하였다. 이것을 중첩한 for문으로 반복해서 출력한다. 2차원 이상의 배열로 값의 대입과 출력도 사용 방법은 기본적으로 똑같다.
또한 다차원 배열을 초기화할 수도 있다. 다차원 배열에서는 통상의 배열의 초기화로 사용한 { } 내에, 한 번 더 { }를 기술하는 방법으로 된다. 다음의 코드는 위 예제의 다차원 배열을 초기화하는 기술이다.
int test[2][5] = { {90, 80, 20, 50, 75}, {95, 55, 88, 72, 58} };
int test[][5] = { {90, 80, 20, 50, 75}, {95, 55, 88, 72, 58} };
최초의 배열의 요소 수(행)에 관해서는 1차원 배열과 똑같이 수를 생략해서 기술할 수 있도록 되어 있다.(열은 생략 불가) 다차원 배열은 C++ 언어의 내부적으로는 1차원 배열의 각 요소가 거듭 배열로서 취급되어 있으므로 이와 같은 것이 가능하다.
출처: 박흥복, 서정희. 2015. C++ 프로그래밍 (초보자를 위한). 문운당