소년코딩

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)은 컴파일 타임에 배열의 길이를 알고 있는 한 같은 자료형의 여러 변수를 쉽게 할당하고 사용할 수 있는 방법을 제공한다.


cpp 번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/61-arrays-part-i/ 입니다.

댓글 로드 중…

블로그 정보

소년코딩 - 소년코딩

소년코딩, 자바스크립트, C++, 물리, 게임 코딩 이야기

최근에 게시된 이야기