본문 바로가기
<CPP>/BASIC

11. 고정 크기 배열(Array)

by CodeGrimie 2021. 1. 13.

가로로 늘여놓다, 배열

▼ CPP에서 배열 코드

#include <cstdio>
#include <array>

int main()
{
    std::array<int, 5> arr = {0, 1, 2, 3, 4};

    for (int i = 0; i < arr.size(); i++)
    {
        printf("ARR[%d] = %d\n", i, arr[i]);
    }
    return (0);
}

 

C에서 사용하는 내장 고정 배열도 CPP에서 사용할 수 있지만 권장 사항은 아니다.

CPP 11 이후에서는 표준 라이브러리에 포함된 <array>의 std::array를 사용하기를 권장한다.

기존의 내장 고정 배열과 비교해서 메모리를 덜 먹으며 함수에 전달될 때 포인터로 형 변환되지 않는다는 장점이 있다.

고정 크기 배열 선언

▼ std::array의 선언 방법은 크게 다르지 않다.

#include <array>

int main()
{
    std::array<int, 5> arrInt = {0, 1, 2, 3, 4};
    std::array<char, 5> arrChar = {'a', 'b', 'c', 'd', 'e'};
    return (0);
}

std::array는 고정 배열이기 때문에 반드시 배열의 크기를 선언할 때 포함해야 한다.

이게 유일한 std::array의 단점으로 꼽히는데 애초에 유동 크기 배열은 atd::vector를 사용하니 경우가 맞지 않다.

 

보다시피 <자료형, 크기>로 선언하는데 다차원 배열의 경우엔 아래와 같이 선언한다.

 

▼ std::array의 다차원 배열 예시

#include <array>

int main()
{
    // 1 Dimentional
    std::array<int, 1> arr_1d = 
    {
        1
    };

    // 2 Dimentional
    std::array<std::array<int, 1>, 2> arr_2d = 
    {{ 
        {1}, 
        {2} 
    }};

    // 3 Dimentional
    std::array<std::array<std::array<int, 1>, 2>, 3> arr_3d = 
    {{  
        {{
            {1},
            {2}
        }},
        {{
            {3},
            {4}
         }},
        {{
            {5},
            {6}
        }}
    }};
    return (0);
}

다차원 배열의 경우엔 조금 모습이 다르다.

가장 내부의 배열을 제외하고는 {{중괄호 두 개}}를 사용하는 걸 원칙으로 한다.

가로로 이어 쓰면 직관적으로 보기 힘들 기 때문에 보통 줄 바꿈을 통해 구조적으로 보기 쉽게 작성한다.

 

러시아 마트료시카 인형의 구조를 떠올리면 기억하기 편하다.

std::array는 CPP 11이후부터 등장한 기능이기 때문에 편의를 위한 기능들도 많이 내장되어 있다.

맨 위 코드에서 사용한 size()도 있지만 반복자(Iterator)를 비롯한 begin()과 end()도 있다.

 

다양한 편의 기능을 제공하는 std::array

#include <cstdio>
#include <array>

int main()
{
    std::array<int, 5> arr = {0, 1, 2, 3, 4};

    // auto = std::array<int, 5>::iterator
    for (auto i = arr.begin(); i != arr.end(); i++)
    {
        printf("%d\n", (*i));
    }
    return (0);
}

CPP 11이후와 이전의 코드 양상은 많이 다르다.

코딩에 편리한 기능들이 추가된 만큼 C 개발자에게는 익숙하지 않은 개념들이 많아졌다.

 

auto는 컴파일러가 자동으로 적절한 변수형을 찾아주는 기능이다.

auto가 타입 추론으로 인한 실수가 발생할 수 있기 때문에 사용에 따른 주의점은 분명 있다.

대신 auto는 선언시 반드시 초기화를 해야 하기 때문에 정확성 문제를 미연에 방지하는 장점도 분명 존재한다.

std::array <int, 5>::iterator와 같은 iterator를 사용할 때에는 auto 사용을 권장하기도 한다.

그리고 사용하기에 따라서 기존 코드보다 오히려 컴파일 속도가 빠르다고 한다..!

 

C언어 코드에 익숙하다면 for문에서 반복자(iterator)를 사용한 것도 매우 낯설 것이다.

이름에서도 알 수 있듯이 반복자는 Array나 Vector 같은 배열에서 내부를 순환하는 기능을 한다.

 

사용 방법이 다를 뿐이지 기존 C언어에서 내부를 순환하는 이론은 같다.

'<CPP> > BASIC' 카테고리의 다른 글

13. 포인터(Pointer)  (0) 2021.01.14
12. 열거형(Enum)  (0) 2021.01.14
10. 상수  (0) 2021.01.13
9. 변수 삼형제  (0) 2021.01.12
8. 함수  (0) 2021.01.12

댓글