07.01 - 배열, Array (Part 1)
배열(array)은 단일 식별자를 통해 같은 자료형의 여러 변수에 접근할 수 있게 해주는 집계 데이터 유형이다.
배열은 같은 자료형의 변수를 일렬로 늘어놓은 형태이며, 반복문과 결합하면 연속적이고 반복되는 값을 손쉽게 처리할 수 있다.
학생 30명의 성적을 기록하는 경우를 생각해보자. 배열이 없다면 30개의 변수를 선언하고 할당해야 한다.
// allocate 30 integer variables (each with a different name)
int score1;
int score2;
int score3;
// ...
int score30;
배열을 사용하면 위 작업을 훨씬 쉽게 수행할 수 있다.
int scores[30]; // allocate 30 integer variables in a fixed array
대괄호 []를 사용해서 컴파일러에 배열 변수와 할당할 변수 수(배열 길이)를 지정했다.
위 예제에서는 길이가 30인 scores라는 고정 배열(fixed array) 변수를 선언했다. 고정 배열은 컴파일 타임에 길이를 알고 있는 배열이다. scores가 인스턴스화되면 컴파일러는 30개의 정수를 할당한다.
Array elements and index
배열에 있는 각 변수를 요소(element)라고 한다. 요소에는 고유한 이름이 없다. 대신 배열의 개별 요소에 접근하려면 배열 이름을 하위 연산자([])와 함께 사용하고, 컴파일러에 원하는 요소를 알려주는 인덱스(index)라는 매개 변수를 사용하면 된다.
위 예제에서 배열의 첫 번째 요소는 scores[0], 두 번째 요소는 scores[1], 열 번째 요소는 scores[9] 그리고 scores 배열의 마지막 요소는 scores[29]다.
주의: C++에서 배열의 인덱스는 0부터 시작한다. 메모리 주소가 0부터 시작하기 때문이다.
길이가 N인 배열의 경우 배열 요소의 인덱스는 0에서 N-1까지다. 이것을 배열의 범위(range)라고 한다.
An example array program
다음은 배열의 정의와 인덱스를 사용하는 예제 프로그램이다.
#include <iostream>
int main()
{
int prime[5]; // 5개의 소수를 저장하는 배열
prime[0] = 2; // 첫 번째 요소의 인덱스는 0
prime[1] = 3;
prime[2] = 5;
prime[3] = 7;
prime[4] = 11; // 마지막 요소의 인덱스는 4 (배열 길이 - 1)
std::cout << "The lowest prime number is: " << prime[0] << "\n";
std::cout << "The sum of the first 5 primes is: " << prime[0] + prime[1] + prime[2] + prime[3] + prime[4] << "\n";
return 0;
}
/*
This prints:
The lowest prime number is: 2
The sum of the first 5 primes is: 28
*/
Array data types
모든 자료형의 배열을 만들 수 있다. 다음은 double
자료형의 배열을 선언하는 예제다.
#include <iostream>
int main()
{
double array[3]; // allocate 3 doubles
array[0] = 2.0;
array[1] = 3.0;
array[2] = 4.3;
cout << "The average is " << (array[0] + array[1] + array[2]) / 3 << "\n";
return 0;
}
/*
This program produces the result:
The average is 3.1
*/
또한, 구조체도 배열로 만들 수 있다.
struct Rectangle
{
int length;
int width;
};
Rectangle rects[5]; // declare an array of 5 Rectangle
배열 요소인 구조체(struct) 멤버에 접근하려면 먼저 원하는 배열 요소를 선택한 다음 멤버 선택 연산자(.
)를 사용해서 원하는 멤버를 선택하면 된다.
rects[0].length = 24;
배열도 배열로 만들 수 있다. 이 내용은 다음 포스트에서 다룰 예정이다.
Array Index
C++에서 배열 인덱스는 항상 정수형(integral type)이어야 한다. 정수형은 char
, short
, int
, long
, long long
등이 포함된다. 심지어 bool
자료형도 포함된다. (false: 0, true: 1) 배열 인덱스는 리터럴 값, 변수(상수 또는 비-상수) 또는 정수형으로 평가되는 표현식일 수도 있다.
int array[5]; // 배열 길이가 5인 배열 선언
// 리터럴(상수) 인덱스 사용:
array[1] = 7; // ok
// 열거형(상수) 인덱스 사용:
enum Animals
{
ANIMAL_CAT = 2
};
array[ANIMAL_CAT] = 4; // ok
// 변수(비-상수) 인덱스 사용:
short index = 3;
array[index] = 7; // ok
// 정수로 평가되는 표현식 사용:
array[1+2] = 7; // ok
Fixed array declarations
고정 배열(fixed array)을 선언할 때 배열의 길이(대괄호 사이)는 컴파일 타임 상수여야 한다. 컴파일 타임에 고정 배열의 길이를 알아야 하기 때문이다.
다음은 고정 배열을 선언하는 몇 가지 다른 방법이다.
// using a literal constant
// 리터럴 상수 사용:
int array[5]; // Ok
// using a macro symbolic constant
// 매크로 기호 상수 사용:
#define ARRAY_LENGTH 5
int array[ARRAY_LENGTH]; // Syntactically okay, but don't do this
// using a symbolic constant
// 기호 상수 사용:
const int arrayLength = 5;
int array[arrayLength]; // Ok
// using an enumerator
// 열거자 사용:
enum ArrayElements
{
MAX_ARRAY_LENGTH = 5
};
int array[MAX_ARRAY_LENGTH]; // Ok
비 상수 또는 런타임 상수는 사용할 수 없다.
// using a non-const variable
// 비-상수 변수 사용:
int length;
std::cin >> length;
int array[length]; // Not ok -- length is not a compile-time constant!
// using a runtime const variable
// 런타임 상수 변수 사용:
int temp = 5;
const int length = temp; // length 값은 런타임까지 알 수 없으므로 이것은 런타임 상수다.
int array[length]; // Not ok
A note on dynamic arrays
고정 배열은 컴파일할 때 메모리가 할당되기 때문에 두 가지 제한이 있다.
- 고정 배열은 사용자 입력 또는 런타임에 계산된 값에 따라 길이를 가질 수 없다.
- 고정 배열에는 변경할 수 없는 고정 길이가 있다.
대부분은 이러한 제한 사항은 문제가 있다. 다행히 C++은 동적 배열(dynamic array)이라는 두 번째 종류의 배열을 지원한다. 동적 배열의 길이는 런타임에 설정할 수 있으며, 길이를 변경할 수 있다.
동적 배열에 관한 내용은 나중에 다룰 예정이다.
Summary
고정 배열(fixed array)은 컴파일 타임에 배열의 길이를 알고 있는 한 같은 자료형의 여러 변수를 쉽게 할당하고 사용할 수 있는 방법을 제공한다.
번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/61-arrays-part-i/ 입니다.