배열
스택 배열, 힙 배열, 다차원 스택 배열, 다차원 힙 배열
7장 - 배열
1) 배열이란?
서로 타입이 같은 원소들을 변수 하나에 담아서 인덱스로 접근하게 해주는 것. 스택영역이나 힙 영역에 배열을 만들 수 있다.
2) 스택 배열
int i;
int myArray[5];
//int myArray[i] <- 불가능
배열의 크기는 컴파일 시간에 결정되기 때문에 상수값으로 설정해야 한다.
3) 힙 배열
int* myArray = new int[5];
배열 자체는 힙에 저장하고, 배열의 0번째 원소를 가리키는 포인터는 스택에 저장된다.
힙 배열을 사용할 때는 delete에 주의하자. delete myArray
는 소멸자를 단 한번 호출하기에 배열의 모든 공간을 해제할 수 없다. new를 호출한 횟수만큼 delete를 호출해야 하기 때문에 delete[] myArray
를 사용한다.
4) 동적 배열
위의 두 배열은 저장 위치만 다를 뿐, 크기가 정해져 있는 정적 배열이다. 반대로 프로그램의 실행에 맞추어 크기를 조절할 수 있는 배열이 동적 배열
이다.
힙 배열은 동적배열이 아닌 동적으로 할당된 배열
이다. 프로그램 실행 중에 원하는 크기의 배열을 만들 수 있지만, 생성 이후에 크기의 변경은 불가능하다.
5) 다차원 스택 배열
int board[3][2]
과 같은 형태의 배열이다. 실제 메모리 상태는 일차원 배열과 동일하다.
보통 3차원 배열까지만 사용한다. 그 이상은 머리로 떠올리기 힘들기 때문이다.
6) 다차원 힙 배열
char** board = new char[i][j] <- 오류!
위와 같은 코드는 오류가 발생한다. 힙에서는 메모리 공간이 연속적으로 할당되진 않기 때문이다. 힙 공간에 일차원 배열을 먼저 생성하고, 해당 일차원 배열의 각 요소가 두 번째 배열을 가리키는 포인터에 해당한다.
이런 구조이다. 컴파일러가 자동으로 처리하지 못하니 직접 연결해주자.
// 다차원 힙 배열 생성
char** boardAllocator(size_t row, size_t colum){
char** board = new char*[row];
for(size_t i = 0; i< row; i++){
board[i] = new char[colum];
}
return board;
}
// 다차원 힙 배열 해제
void boardEraser(char** board, size_t row){
for(size_t i = 0; i< size; i++){
delete[] board[i];
}
delete[] board;
}
- 1차 배열 생성 → 2차 배열 생성
- 2차 배열 삭제 → 1차 배열 삭제
7) 배열도 좋지만
std::array
, std::vector
는 더 좋다! 표준 라이브러리에서 제공하므로 상황에 맞는 녀석을 사용하자.