[C++] std::array

빵욱·2025년 2월 5일

std::array를 switch를 대체해서 사용했는데 이 참에 관련 내용을 정리했다.

관련 설명은 코드 주석에 달아놈.

#include <array>
#include <iostream>


using namespace std;

enum class Status {
	Not_Connected = 0,
	Not_Communicated,
	Not_Initialized,
	Communicated,
	Count  // 개수
};

std::array<const char*, static_cast<size_t>(Status::Count)> statusMessages = {
"Not Connected",
"Not Communicated",
"Not Initialized",
"Communicated"
};


void PrintStatus(Status state)
{
	std::cout << statusMessages[static_cast<size_t>(state)] << std::endl;
};


// arr는 int*로 변환됨!
void printArray(int arr[]) { 
	std::cout << "sizeof(arr): " << sizeof(arr) << " bytes\n";
}

// 원본 배열 그대로 전달됨
void printArray(std::array<int, 5> arr) { 
	std::cout << "sizeof(arr): " << sizeof(arr) << " bytes\n";
}

void printArray2(const std::array<int, 5>& arr) {
	std::cout << "sizeof(arr): " << sizeof(arr) << " bytes\n";
}


int main(void)
{
	// std::array는 C++ 표준 라이브러리의 정적 배열(Container)

	/*
	=== 특징 ===
	기본 배열(T arr[N])보다 관리를 쉽게해주는 표준 라이브러리
	std::vector보다 빠름 (정적 배열이므로 동적 할당 없음)
	C 배열보다 안전 (.at() 사용 가능, 범위 검사 지원)
	STL과 호환 가능 (begin(), end() 등 제공)
	크기가 고정됨 (컴파일 타임에 결정됨)
	함수에 파라미터로 사용할 때 포인터 형으로 변환되지 않음.
	*/

	// 고정 배열 처럼 배열의 크기는 컴파일 타임에 설정 해야한다.
	std::array<int, 4> arr_numbers = {0,1,2,3};
	std::array<int, 4> arr_numbers2{ 0,1,2,3 };

	std::array<int,5> arr_numbers3 = { 0,1,2,3 }; // 마지막 요소는 0

	std::array<int, 5> arr_numbers4;
	arr_numbers4 = { 1,2,3,4,5 };
	// arr_numbers4 = { 1,2,3,4,5,6 }; //  Error.

	// []로 통해서 접근 가능.
	cout << arr_numbers3[1] << "\n";

	cout << arr_numbers3.at(4) << "\n";
	// cout << arr_numbers3.at(6) << "\n"; // Exception throw.

	// size 사용 가능.
	cout << "size : " << arr_numbers3.size() << "\n";


	// Switch문 대신 Array를 사용했음.
	/*
	switch (state) {
	case Status::Not_Connected:    std::cout << "Not Connected\n"; break;
	case Status::Not_Communicated: std::cout << "Not Communicated\n"; break;
	case Status::Not_Initialized:  std::cout << "Not Initialized\n"; break;
	case Status::Communicated:     std::cout << "Communicated\n"; break;
	default: std::cout << "Unknown State\n";
	}
	*/

	// switch와 if else가 많아져 코드 가독성도 떨어지고 관리가 힘들어질 때 사용하니까 좋았다.
	// 상단에 선언된 enum class와 함수들 참고.
	Status currentState = Status::Communicated;
	PrintStatus(currentState);


	// 기본 배열은 함수 파라미터로 사용 시 포인터 형태로 전달된다고 한다.
	int arr_basic[5] = { 1, 2, 3, 4, 5 };
	std::cout << "sizeof(arr) in main: " << sizeof(arr_basic) << " bytes\n"; // 20 bytes
	printArray(arr_basic); // 8 bytes (포인터 크기)
	// 즉, 배열 크기 정보가 사라짐

	std::cout << "sizeof(arr) in main: " << sizeof(arr_numbers4) << " bytes\n"; // 20 bytes
	printArray(arr_numbers4);


	// printArray2 처럼 const 참조형으로 받으면 컴파일러가 std::array의 복사본을 만들지 않는다.
	// 성능에 좋다. 
	printArray2(arr_numbers4);

	//
    
    /*
array::fill
배열을 지우고 지정된 요소를 빈 배열에 복사.
MS learn에 있는 아래 예제를 실행시켜 보았다.
*/
array<int, 2> v1 = { 1, 2 };

cout << "v1 = ";
for (const auto& it : v1)
{
	std::cout << " " << it;
}
cout << endl;

v1.fill(3);
cout << "v1 = ";
for (const auto& it : v1)
{
	std::cout << " " << it;
}
cout << endl;
return 0;

/*
출력
v1 =  1 2
v1 =  3 3
*/
// fill 함수는 array의 모든 요소를 특정 값으로 전부 바꾸는 것이다.
	return 0;
}
profile
rove drink eat

0개의 댓글