💻프로그래밍 내용 정리/C++17

[C++ 1.1.10] C 스타일 배열, 영 초기화, 이니셜라이저 리스트, std::size(), sizeof

이이프 2022. 8. 15. 21:17
728x90

배열

배열은 같은 타입의 값을 나란히 저장하며, 각 항목은 배열에 놓인 위치로 접근한다.

C++에서 배열을 선언할 때는 반드시 배열의 크기를 지정해야 하는데,

변수로 지정할 수는 없고 반드시 상수 또는 상수 표현식으로 지정해야 한다.

 

예를 들어 정수 값을 세 개 가진 배열을 선언하려면 다음과 같이 작성한다.

int myArray[3];
myArray[0] = 0;
myArray[1] = 0;
myArray[2] = 0;

C++에서 배열의 첫 번째 원소의 위치는 1이 아닌 0이다.

또한 배열의 마지막 원소의 위치는 항상 배열의 크기에서 1을 뺀 값이다.

 

영 초기화

다음과 같이 영 초기화(제로 초기화) 구문으로 한 번에 초기화하는 방법도 있다.

int myArray[3] = {0};

여기서 0은 생략해도 된다.

int myArray[3] = {};

 

이니셜라이저 리스트

또한 이니셜라이저 리스트(initializer_list, 초기자/초기화 리스트)를 사용해도 된다.

그러면 배열의 크기를 컴파일러가 알아서 결정한다.

int myArray[] = {1, 2, 3, 4}; // 컴파일러는 네 개의 원소를 가진 배열을 생성한다

배열의 크기를 지정할 때 이니셜라이저 리스트에 나온 원소 수가 배열의 크기로 지정한 개수보다 적으면

나머지 원소는 초기화된다.

int myArray[3] = {2}; // 첫 번째 원소의 값만 2, 나머지 원소는 모두 0

 

배열의 크기 구하기 std::size(), sizeof

스택 기반의 C 스타일 배열의 크기는 C++17부터 제공하는 std::size() 함수로 알아낼 수 있다.

이 함수를 사용하려면 <array> 헤더를 인클루드 해야 한다.

unsigned int arraySize = std::size(myArray);

현재 사용하는 컴파일러가 C++17을 지원하지 않는다면 예전 방식처럼 sizeof 연산자로 크기를 구하면 된다.

sizeof 연산자는 인수로 지정한 대상의 크기를 바이트 단위로 리턴한다.

스택 기반 배열에 담긴 원소 수를 알아내려면 이 연산가 리턴한 값을 첫 번째 원소의 크기로 나눠야 한다.

unsigned int arraySize = sizeof(myArray) / sizeof(myArray[0]);

이 코드는 일차원 배열에 대한 예를 보여준다.

이 배열은 번호가 매겨진 칸마다 정수가 일렬로 담겨 있다고 볼 수 있다.

 

C++은 다차원 배열도 지원한다.

이차원 배열의 위치는 x축 위치와 y축 위치의 조합으로 표현한다.

예를 들어 틱택토 보드를 다음과 같이 문자 타입의 이차원 배열로 표현할 수 있다.

char TicTacToeBoard[3][3];
TicTacToeBoard[1][1] = 'o';

위의 정의한 틱택토 보드에 대한 배열을 표로 표현하면 다음과 같다.

TicTacToeBoard[0][0] TicTacToeBoard[0][1] TicTacToeBoard[0][2]
TicTacToeBoard[1][0] TicTacToeBoard[1][1] TicTacToeBoard[1][2]
TicTacToeBoard[2][0] TicTacToeBoard[2][1] TicTacToeBoard[2][2]