더북(TheBook)

[] 연산자와 at() 함수 외에 std::array에서 원소 접근을 위해 사용할 수 있는 멤버 함수를 그림 1-6에 정리했습니다.

함수

설명

front()

배열의 첫 번째 원소에 대한 참조를 반환합니다.

back()

배열의 마지막 원소에 대한 참조를 반환합니다.

data()

배열 객체 내부에서 실제 데이터 메모리 버퍼를 가리키는 포인터를 반환합니다. 반환된 포인터를 이용하여 다양한 포인터 연산을 수행할 수 있습니다. 이 기능은 포인터를 함수의 인자로 받는 예전 스타일의 함수를 사용할 때 유용합니다.

▲ 그림 1-6 std::array의 원소 접근 함수

다음은 그림 1-6에서 소개한 함수의 사용 예제 코드입니다.

std::array<int, 5> arr = {1, 2, 3, 4, 5};
std::cout << arr.front() << std::endl;       // 1 출력
std::cout << arr.back() << std::endl;        // 5 출력
std::cout << *(arr.data() + 1) << std::endl; // 2 출력

std::array는 깊은 비교(deep comparison)를 위한 관계 연산자(relational operator)와 깊은 복사를 위한 복사 할당 연산자(copy-assignment operator)도 지원합니다. std::array에 저장되는 데이터 타입에서 크기 비교(<, >, <=, >=, ==, !=)를 지원할 경우, 이들 관계 연산자를 이용하여 두 std::array 배열을 비교하는 용도로 사용할 수도 있습니다.

C 스타일 배열에 대해서도 관계 연산자를 사용할 수 있지만, 이 경우에는 배열 원소 값을 비교하는 것이 아니라 포인터 주소 값을 비교합니다. 즉, 깊은 비교 대신 얕은 비교(shallow comparison)를 수행하기 때문에 실용적이지 않습니다. 할당(assignment)에 대해서도 C 스타일 배열은 메모리를 새로 생성하여 값을 복사하지 않으며, 단순히 같은 배열 데이터를 가리키는 새로운 포인터를 생성할 뿐입니다.

Note ≡


std::array에 대해 관계 연산자를 사용할 경우, 두 배열의 크기가 같아야 합니다. 이는 std::array로 생성한 배열 객체의 경우, 배열의 크기가 데이터 타입 일부로 동작하기 때문입니다. 즉, 크기가 다른 배열은 서로 다른 타입으로 인식되므로 비교할 수 없습니다.

다음 연습 문제를 통해 C 스타일 배열을 대체하는 래퍼 클래스(wrapper class) 정의 방법에 대해 알아보겠습니다. 배열의 크기는 사용자 입력으로 정의할 것입니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.