C++ 배열(Array) | C++ 자습서 6

C++ 배열(Array)

C++ 배열(Array)은 자료를 메모리에 나열한 구조입니다. char, int 같은 데이터형 변수를 하나 선언하는 것이 변수의 선언이었다면 배열은 하나의 데이터형을 여러개 선언합니다. char 형 변수면 char charArray[10] 처럼 같은 형으로 선언할 수 있습니다.

배열을 사용하는 궁극적인 이유는 거정 간단하면서도 강력한 자료형이기 때문입니다. 알고리즘의 시작은 배열부터 시작합니다. 링크드리스트, 바이너리트리 등 자료구조를 만들 때 자료의 삽입, 검색, 삭제를 구현해야 합니다.

배열은 그 모든 것이 프로그래밍 언어에 다 구현되어 있습니다. 배열은 동일한 자료형이 반복되는 구조로 누구나 이해하기 쉬운 자료구조입니다.

복잡한 컴퓨터 알고리즘의 세계도 배열부터 시작한다고 볼 수 있습니다. 알고리즘 수업을 듣기전에 C++ 교재에 문법과 함께 기본 알고리즘을 배우는 것 입니다. 이런 것들이 나중에 어떻게 이어질까 생각할 수 있는데 다 여기서 시작되서 이어지는 것 입니다.

그럼 배열이 어떤 것인지 예제를 통해서 알아보겠습니다.

배열 만들기

배열은 [자료형] [식별자][배열크기] 의 형식으로 선언할 수 있습니다. 주의할 점은 배열은 한종류의 데이터를 사용한다는 점 입니다. 여러 종류의 데이터형을 사용하는 것을 복합데이터라고 합니다. C++에는 구조체, 클래스와 같은 복합 데이터형이 있습니다.

아래의 예제는 배열을 선언하고 각 배열의 요소에 값을 할당하고 있습니다. myArray[0] 을 하나의 방이라고 생각하면 쉽습니다. 총 5개짜리 int 정수형 배열을 만들었는데 각각의 방을 인덱스로 접근할 수 있습니다. [ ] 각괄호 안에 들어가는 숫자가 인덱스입니다. 인덱스는 0부터 배열 요소의 총 수량만큼 있습니다. 예를 들어 배열 개수가 5라면 인덱스는 0, 1, 2, 3, 4 입니다.

#include <iostream>

using namespace std;

int main()
{
    int myArray[5];

    myArray[0] = 1;
    myArray[1] = 3;
    myArray[2] = 5;
    myArray[3] = 7;
    myArray[4] = 9;

    int size = sizeof myArray / 4;

    for (int i = 0; i < size; i++)
    {
        cout << myArray[i] << ", ";
        /* code */
    }
    cout << endl;
    
    // 초기화

    cout << "[---------------]" << endl;

    int yourArray[5] = {2, 4, 6, 8, 10};

    for (int i = 0; i < size; i++)
    {
        cout << yourArray[i] << ", ";
        /* code */
    }
    cout << endl;
}
1, 3, 5, 7, 9, 
[---------------]
2, 4, 6, 8, 10,

배열은 for 루프와 궁합이 잘 맞는데요. 인덱스가 0부터 n-1 까지 가는 것도 그렇고 배열은 for 문과 함께 사용하게 될 것 입니다.

두번째 배열 yourArray 는 선언과 동시에 { } 괄호안에 초기값들을 넣었는데요. C++은 다양한 문법으로 초기화를 할 수 있습니다. C++ 은 프로그래머에게 선택지를 많이 주는 언어입니다. 아무리 문법이 간단하다고 해도 세부적인 테크닉들은 매우 종류가 많습니다. 같은 결과를 얻는데 과정이 다른 문법도 있기 때문에 굳이 전부 사용하지 않아도 됩니다.

배열의 크기 결정(정적, 동적)

배열의 크기는 컴파일시에 결정되야 합니다. 이는 배열의 인덱스에 상수만 사용가능한 규칙입니다.

배열의 크기를 바꾸기 위해서는 동적 메모리 할당을 사용해야 합니다. C언어에서 malloc 이었던 함수는 C++에 와서는 new 로 바뀌었습니다. new 란 프로그램의 실행중에 새로운 메모리를 할당해 달라는 요청입니다. 물론 최종적으로 메모리를 할당하는 권한이 있는 OS로 부터 할당 받습니다.

메모리를 조작하는 것은 컴퓨터 소프트웨어에서 가장 핵심이 됩니다. 우리가 실행하는 모든 프로그램은 메모리에 올라가야 CPU가 작업을 할 수 있습니다. 프로그램을 짠다는 것은 메모리에 명령어와 데이터들을 올린다는 말이기도 합니다. 다른 언어들은 프로그래머가 메모리를 조작하는데 제한을 많이 두는데 C++은 프로그래머가 메모리를 관리할 책임이 있습니다.

권한이 높고 자유도가 많은 만큼 이점이 있지만 만약 메모리를 잘못 관리한다면 메모리로 인해 발생하는 오류는 치명적일 수 있습니다. 지금은 OS가 많이 좋아져서 그런 일이 별로 없는데 윈도우 98이 나오고 나서도 한참동안 소위 파란화면(윈도우 치명적 오류)을 많이 봤습니다. 대부분은 메모리 충돌로 PC가 종료했던 것입니다.

그만큼 메모리의 관리는 중요합니다. 메모리 관리는 포인터에 들어가면서 본격적으로 배울 것 입니다. 여기서는 프로그램의 실행도중에 배열의 크기를 늘리려면 new 라는 메모리 할당을 받야아 한다 정도로 이해하면 충분합니다.

#include <iostream>

using namespace std;

int main()
{

    // 배열의 인덱스에는 상수만 사용가능 (const -> 변수를 상수로)
    
    const int size = 5;

    double myScore[size];

    for (int i = 0; i < size; i++)
    {
        myScore[i] =  (i+1) * 3.0;
        /* code */
    }
    
    for (int i = 0; i < size; i++)
    {
        cout << myScore[i] << ", ";
        /* code */
    }
    cout << endl;

    cout << "[----------------------]" << endl;

    // 동적 배열 할당

    int newSize = 3;

    double* yourScore = new double [newSize];

    yourScore[0] = 10.2;
    yourScore[1] =  7.5;
    yourScore[2] =  5.0;

    for (int i = 0; i < newSize; i++)
    {
        cout << yourScore[i] << ", ";
        /* code */
    }

    delete[] yourScore;
    
}
3, 6, 9, 12, 15, 
[----------------------]
10.2, 7.5, 5,

동적 배열 할당은 사용이 끝나고 delete 키워드로 메모리를 해제시켜줘야 합니다. main 함수가 종료될 때 OS에 해당 프로세스의 모든 자원을 반환하긴 합니다만, 메모리는 항상 명시적으로 해제해야 합니다.

배열의 다양한 초기화 방법

배열의 초기화는 다소 테크닉적인 부분이라고 설명했습니다.

C++ 표준이 발전을 거듭해오면서 지금은 다양한 초기화 방법을 제공하고 있습니다. 자신이 사용하는 초기화 방식을 한가지로 통일해두면 좋습니다. 초기화만 봐도 누가 쓴 코드인지 알수 있을 정도로 일관성이 있다면 자신을 포함해서 코드를 읽는 사람이 편할 것 입니다. (자기 자신이 1년 뒤에 읽는다고 생각하고 씁니다)

#include <iostream>

using namespace std;

int main()
{
    // C++ 배열의 초기화 방법

    int myArray1[3];
    myArray1[0] = 777;
    myArray1[1] = 222;
    myArray1[2] = 555;

    // 정의하는 곳에 사용
    int myArray2[4] = {30, 60, 70, 20};

    // 전부 초기화 하지 않아도 된다. 나머지를 0으로 설정
    int myArray3[5] = {15, 9};

    // 대입 부호가 없어도 된다 C++ 11
    int myArray4[3] {999, 256, 128};

    // 전부 0으로 설정
    int myArray5[50] = {0};
    int meArray5[10] = {};
    int peArray5[20] {};

    // 요소의 개수를 계산한다
    int myArray6[] = {1, 3, 5, 7, 9};

    // 대입 연산자 생략
    int myArray7[] {2, 4, 6, 8, 10};

}

초기화는 몇번 해보면 쉽게 익숙해질 것 입니다.

요약

C++ 배열 기초에 대하여 알아봤습니다. 모든 알고리즘의 기본이 되는 자료구조입니다. 머리속에 이미지 모델을 만들어 놓는게 좋습니다. 나중에 다차원 배열로 확장하면 좀 복잡해집니다만. 어쨋든 가장 직관적인 자료구조입니다.

참고문서를 충분히 읽어보면 머리속에 모형을 만들 수 있을 것 입니다. 배열의 구조에 있어서는 C언어나 C++ 언어나 차이점이 없습니다. 좋은 자료는 C언어 자료도 함께 보도록 합니다.

참고문서

배열 (C++) | Microsoft Docs

Arrays – C++ Tutorials (cplusplus.com)

C++ Arrays (With Examples) (programiz.com)

C++ Arrays – Tutorialspoint

Arrays in C++ (beginnersbook.com)

Arrays in C/C++ – GeeksforGeeks

C++ Arrays (w3schools.com)

C언어 배열

C언어 자료구조 – 배열의 구조

4 thoughts on “C++ 배열(Array) | C++ 자습서 6”

    • 포인터가 어려울 때는 다시 기초로 돌아가 보는 것도 하나의 방법입니다~ 많은 학습자가 포인터에서 포기한 역사가 있으니 너무 성급하지 않아도 괜찮습니다.

      응답
  1. 배열을 선언할때 for문으로 만드는것 대신에 Python의 Numpy 패키지에서 numpy.arange() 처럼 자동으로 만들어주는 방법은 없나요?

    응답
    • std::iota 를 std::vector와 함께 사용하거나, std::generate를 std::array와 함께 사용하는 방법을 참고하면 좋을 것 같네요

      응답

Leave a Comment