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;
}