배열 (Array)
같은 자료형의 여러 변수를 하나의 이름으로 관리하기 위한 자료구조이다.
배열은 메모리에 연속적으로 저장되며, 각 요소는 인덱스(Index)를 통해 접근할 수 있다.
배열 선언
기본 문법
자료형 배열이름[크기];
예시
int numbers[5];
int형 변수 5개가 연속된 메모리에 생성된다.- 인덱스는
0부터 시작한다.
배열 요소 접근
int numbers[5];
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
배열의 첫 번째 요소는 0번 인덱스이다.
cout << numbers[0];
실행 결과
10
배열 초기화
배열은 {}를 이용하여 초기화할 수 있다.
int numbers[5] = { 1, 2, 3, 4, 5 };
크기를 생략한 초기화
배열 크기를 적지 않아도 초기화한 원소 개수만큼 자동으로 크기가 결정된다.
int numbers[] = { 1, 2, 3, 4, 5 };
위 코드는 아래와 같다.
int numbers[5] = { 1, 2, 3, 4, 5 };
일부만 초기화
int numbers[5] = { 1, 2 };
실제 저장 값
1 2 0 0 0
나머지 요소는 0으로 초기화된다.
배열과 인덱스
int numbers[5] = { 10, 20, 30, 40, 50 };
| 인덱스 | 값 |
|---|---|
| 0 | 10 |
| 1 | 20 |
| 2 | 30 |
| 3 | 40 |
| 4 | 50 |
배열 순회
배열은 반복문과 함께 자주 사용된다.
int numbers[5] = { 10, 20, 30, 40, 50 };
for (int i = 0; i < 5; i++)
{
cout << numbers[i] << endl;
}
실행 결과
10
20
30
40
50
배열의 특징
- 같은 자료형만 저장할 수 있다.
- 메모리에 연속적으로 저장된다.
- 인덱스를 통해 빠르게 접근할 수 있다.
- 선언 시 크기가 고정된다.
int numbers[5];
한 번 생성된 배열의 크기는 변경할 수 없다.
정적 배열 (Static Array)
일반적인 배열은 선언과 동시에 크기가 결정된다.
int numbers[5];
이러한 배열을 정적 배열(Static Array) 이라고 한다.
특징
- 크기가 컴파일 시 결정된다.
- 스택(Stack) 영역에 생성된다.
- 크기를 변경할 수 없다.
배열 크기 변경이 불가능한 이유
int numbers[5];
배열은 연속된 메모리를 미리 확보한다.
[10][20][30][40][50]
실행 중에 크기를 변경하면 새로운 연속 메모리가 필요하므로 일반 배열은 크기 변경이 불가능하다.
동적 배열
실행 중에 배열 크기를 결정하려면 동적 할당을 사용해야 한다.
new 사용
int size = 10;
int* numbers = new int[size];
메모리 해제
delete[] numbers;
동적 배열 특징
- 실행 중 크기를 결정할 수 있다.
- 힙(Heap) 영역에 생성된다.
- 사용 후 반드시 해제해야 한다.
int* numbers = new int[100];
delete[] numbers;
VLA (Variable-Length Array)
일부 컴파일러는 다음과 같은 문법을 허용한다.
int size;
cin >> size;
int numbers[size];
이를 가변 길이 배열(VLA) 이라고 한다.
주의사항
VLA는 C++ 표준 기능이 아니다.
int size = 10;
int numbers[size];
- GCC : 지원
- Clang : 일부 지원
- MSVC(Visual Studio) : 지원하지 않음
따라서 실무에서는 사용하지 않는 것이 좋다.
배열과 메모리 영역
정적 배열
int numbers[10];
스택(Stack) 영역 사용
VLA
int numbers[size];
스택(Stack) 영역 사용
동적 배열
int* numbers = new int[size];
힙(Heap) 영역 사용
malloc
int* numbers = (int*)malloc(sizeof(int) * size);
힙(Heap) 영역 사용
메모리 해제
free(numbers);
C++에서 권장하는 방법
현대 C++에서는 배열 대신 std::vector 사용을 권장한다.
#include <vector>
vector<int> numbers;
또는
vector<int> numbers(10);
특징
- 크기 자동 관리
- 동적 확장 가능
- 메모리 자동 해제
- 배열처럼 사용 가능
numbers.push_back(10);
cout << numbers[0];
정리
- 배열은 같은 자료형의 데이터를 연속된 메모리에 저장하는 자료구조이다.
- 인덱스는
0부터 시작한다. - 일반 배열은 크기가 고정된 정적 배열이다.
- 정적 배열은 보통 스택 영역에 생성된다.
- 실행 중 크기를 정하려면 동적 배열(
new)을 사용해야 한다. - VLA는 일부 컴파일러만 지원하며 C++ 표준이 아니다.
new와malloc은 힙 영역을 사용한다.- 현대 C++에서는 동적 배열 대신
std::vector사용을 권장한다.