7장 - 배열

1) 배열이란?

서로 타입이 같은 원소들을 변수 하나에 담아서 인덱스로 접근하게 해주는 것. 스택영역이나 힙 영역에 배열을 만들 수 있다.


2) 스택 배열

int i;
int myArray[5];
//int myArray[i] <- 불가능

Untitled

배열의 크기는 컴파일 시간에 결정되기 때문에 상수값으로 설정해야 한다.


3) 힙 배열

int* myArray = new int[5];

Untitled

배열 자체는 힙에 저장하고, 배열의 0번째 원소를 가리키는 포인터는 스택에 저장된다.

힙 배열을 사용할 때는 delete에 주의하자. delete myArray는 소멸자를 단 한번 호출하기에 배열의 모든 공간을 해제할 수 없다. new를 호출한 횟수만큼 delete를 호출해야 하기 때문에 delete[] myArray를 사용한다.


4) 동적 배열

위의 두 배열은 저장 위치만 다를 뿐, 크기가 정해져 있는 정적 배열이다. 반대로 프로그램의 실행에 맞추어 크기를 조절할 수 있는 배열이 동적 배열이다.

힙 배열은 동적배열이 아닌 동적으로 할당된 배열이다. 프로그램 실행 중에 원하는 크기의 배열을 만들 수 있지만, 생성 이후에 크기의 변경은 불가능하다.


5) 다차원 스택 배열

int board[3][2]과 같은 형태의 배열이다. 실제 메모리 상태는 일차원 배열과 동일하다.

Untitled

보통 3차원 배열까지만 사용한다. 그 이상은 머리로 떠올리기 힘들기 때문이다.


6) 다차원 힙 배열

char** board = new char[i][j] <- 오류!

위와 같은 코드는 오류가 발생한다. 힙에서는 메모리 공간이 연속적으로 할당되진 않기 때문이다. 힙 공간에 일차원 배열을 먼저 생성하고, 해당 일차원 배열의 각 요소가 두 번째 배열을 가리키는 포인터에 해당한다.

Untitled

이런 구조이다. 컴파일러가 자동으로 처리하지 못하니 직접 연결해주자.

// 다차원 힙 배열 생성
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는 더 좋다! 표준 라이브러리에서 제공하므로 상황에 맞는 녀석을 사용하자.