Ch06. 복합데이터 - 08. std::array

2025. 4. 8. 17:43Programming Language/C++

반응형

1. std::array

std::array는 C++11부터 도입된 고정 크기 배열 컨테이너로, C 배열(int arr[5])의 단점을 보완하면서 STL의 장점(반복자, 알고리즘, 범위 검사 등)을 제공하는 템플릿 클래스이다

 

std::array를 사용한다면 array라는 라이브러리를 include 해줘야한다.

#include <array>

 

2. 기본 문법

std-array의 선언은 아래와 같이 사용한다.

std::array<자료형, 크기> 변수이름;

실 예시는 

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

와 같이 사용이 된다.

 

일반 배열은 초기화하면서 선언하는 경우엔 배열의 크기를 지정하지 않아도 초기화하는 값의 길이에 맞춰 크기를 맞췄으나 std::array의 경우는 불가능하다.

이는 array자체가 내부적으로 크기를 무조건 받아야하도록 구현이 되어 있기 때문이다.

 

물론 초기화 없이 선언도 가능하다.

std::array<int, 5> arr;                 // - 초기화되지 않은 값 쓰레기값으로 초기화
std::array<int, 5> arr = {};            // - 초기화되지 않은 값 0으로 초기화
std::array<int, 5> arr{};               // - 초기화되지 않은 값 0으로 초기화
std::array<int, 5> arr{1, 2};           // - 초기화되지 않은 값 0으로 초기화
std::array<int, 5> arr{1, 2, 3, 4, 5};

위 방식 네 방식은 모두 가능한 선언 방식이다.

 

3. 사용 방식

std::array도 그냥 일반 배열과 동일하게 사용이 가능하다.

 

4. std::array의 멤버함수

std:array에는 사용가능한 함수들이 존재한다. 

하나씩 살펴보자면 

 

1) .size() : 배열의 크기를 반환

 

기존의 배열의 경우는 std에 존재하는 size함수에 전달해서 크기를 확인했었다.

 

2) .at(i) : 범위 검사가 포함된 배열에 접근 방식(예외 발생이 가능하다)

기존에 배열에서 사용하던 

이 방식과 동일한 사용방법이다

다만 기존에 저렇게 배열이 선언되었을때 그 크기를 벗어나는 값에 접근하게 되면

이렇게 쓰레기값을 출력하고 코드 : 0 으로 main함수가 0을 반환하면서 종료가 됐었는데 

.at함수를 사용하면 

이렇게 에러를 띄워준다.

그리고 그 결과도 이상하게 코드 : 1073741855 라면서 이상하게 표출된다.

 

3) .front() : 첫 번째 요소 참조

 

4) .back() : 마지막 요소 참조

 

5) .fill(value) : 모든 요소를 value로 채움

 

6) .data() : 내부 배열 포인터 반환

일반 배열의 경우는 배열의 이름을 전달하면 배열의 주소값을 전달했었는데 std::array의 경우는 주소값을 전달해주지 않는다.

그렇기에 std::array의 주소값을 찾아 줄 함수가 필요하다 

그때 사용되는데 .data()함수이다.

void foo(int* ptr) {
    // C 스타일 API
}

foo(arr.data());  // ✅ 정확하게 주소가 넘어감

 

그래서 사실

이런 사용도 가능하다 

 

이는 

std::array<int, 5> arr1{ 1, 2, 3, 4, 5 };

로 만들어진 실제 내부 배열(std::array가 구현될때 내부에 배열을 만들어서 이런 사용이 가능하게 되는거고 그 내부배열에 직접 접근하는 것을 의미함)에 접근해서 사용하는 것이기 때문이다.

 

7) arr1.swap(arr2) : 같은 타입의 두 배열의 내용을 통째로 전환

std::array<int, 5> a = {1, 2, 3, 4, 5};
std::array<int, 5> b = {6, 7, 8, 9, 10};

a.swap(b); // a와 b의 내용을 바꾼다

 

유의할 점은 타입이 같아야하고 크기가 같아야한다는 점이다.

 

8) 배열의 복사

std::array의 경우는 일반배열이 못하던 배열의 이름만 갖고 복사하던것도 가능하다.

std::array<int, 5> arr1 {1, 2, 3, 4, 5};
std::array<int, 5> arr2;

arr2 = arr1;

 

반응형