동적 배열은 일반 배열과 매우 유사하지만, 프로그램 런타임 중에 크기를 수정할 수 있습니다. 동적 배열 요소는 연속된 메모리 블록을 차지합니다.
일반 배열은 생성 후 크기를 변경할 수 없습니다. 그러나 동적 배열은 다릅니다. 동적 배열은 필요할 때 일정 팩터만큼 메모리 크기를 늘릴 수 있습니다.
배열 생성 시 미리 정해진 양의 메모리가 할당됩니다. 동적 배열의 경우는 필요할 때 메모리 크기를 늘립니다.
이 C++ 튜토리얼에서 배울 내용:
동적 배열이란?
동적 배열 성능에 영향을 주는 요인들
new 키워드
동적 할당 배열 초기화
배열 크기 조정
동적 배열 삭제
동적 배열 성능에 영향을 주는 요인들
배열의 초기 크기와 성장 팩터가 성능을 결정합니다. 다음 사항에 유의하세요:
배열 크기가 작고 성장 팩터가 작으면 메모리 재할당이 빈번해져 성능 저하
배열 크기가 크고 성장 팩터가 크면 미사용 메모리 청크가 커져 리사이즈 연산이 더 오래 걸릴 수 있어 성능 저하
new 키워드
C++에서 new 키워드로 동적 배열을 생성할 수 있습니다. 할당할 항목 수는 대괄호 쌍 안에 지정합니다. 타입 이름이 앞에 와야 합니다. 요청된 항목 수가 할당됩니다.
문법:
new 키워드는 다음 문법을 가집니다:
pointer_variable = new data_type;
pointer_variable: 포인터 변수 이름
data_type: 유효한 C++ 데이터 타입
키워드는 첫 번째 항목에 대한 포인터를 반환합니다. 동적 배열 생성 후 delete 키워드로 삭제할 수 있습니다.
예제 1:
#include<iostream>
using namespace std;
int main() {
int x, n;
cout << "Enter the number of items:" << "\n";
cin >>n;
int *arr = new int(n);
cout << "Enter " << n << " items" << endl;
for (x = 0; x < n; x++) {
cin >> arr[x];
}
cout << "You entered: ";
for (x = 0; x < n; x++) {
cout << arr[x] << " ";
}
return 0;
}
출력:
코드 스크린샷:
코드 설명:
iostream 헤더 포함하여 함수 사용
std 네임스페이스 포함하여 클래스 직접 사용
main() 함수 호출, 프로그램 로직은 본문 내에 작성
정수 변수 x, n 선언
콘솔에 프롬프트 출력하여 변수 n 값 입력 요청
키보드에서 사용자 입력 읽어 변수 n에 할당
총 n개의 정수를 담을 배열 선언하고 포인터 변수 *arr에 할당
사용자에게 n개 항목 입력 요청 메시지 출력
for 루프로 루프 변수 x 생성하여 사용자 입력 항목 순회
사용자 입력 요소를 읽어 배열 arr에 저장
for 루프 본문 끝
콘솔에 텍스트 출력
for 루프로 배열 항목 순회
배열 arr의 값들을 콘솔에 출력
for 루프 본문 끝
프로그램 성공 완료 시 값 반환
main() 함수 본문 끝
참고: 위 예제에서 사용자는 런타임에 배열 크기를 임의로 지정할 수 있습니다. 즉, 배열 크기가 런타임에 결정됩니다.
동적 할당 배열 초기화
동적 배열을 0으로 초기화하는 것은 쉽습니다.
문법:
int *array{ new int[length]{} };
위 문법에서 length는 배열에 추가할 요소 수입니다. 0으로 초기화해야 하므로 비워둡니다.
초기화 리스트로 동적 배열을 초기화할 수도 있습니다. 이를 보여주는 예제를 만듭시다.
예제 2:
#include <iostream>
using namespace std;
int main(void) {
int x;
int *array{ new int[5]{ 10, 7, 15, 3, 11 } };
cout << "Array elements: " << endl;
for (x = 0; x < 5; x++) {
cout << array[x] << endl;
}
return 0;
}
출력:
코드 스크린샷:
코드 설명:
iostream 헤더 포함
std 네임스페이스 포함
main() 함수 호출
정수 변수 x 선언
초기화 리스트로 동적 배열 array 선언. 5개 정수 요소 보유. 배열 길이와 초기화 리스트 사이에 "=" 연산자 사용 안 함에 유의
콘솔에 텍스트 출력. endl은 줄바꿈을 의미하는 C++ 키워드
for 루프로 배열 요소 순회
배열 array의 내용 콘솔 출력
for 루프 본문 끝
프로그램 성공 완료 시 값 반환
main() 함수 본문 끝
배열 크기 조정
동적 배열의 길이는 할당 시 설정됩니다.
그러나 C++은 한 번 할당된 배열을 리사이즈하는 내장 메커니즘이 없습니다.
새 배열을 동적 할당하고 요소를 복사한 뒤 기존 배열을 지우는 방식으로 극복할 수 있습니다.
참고: 이 기법은 오류 발생 가능성이 있으므로 가능한 피하세요.
동적 배열 삭제
동적 배열은 목적이 완료되면 컴퓨터 메모리에서 삭제해야 합니다. delete 문으로 이를 수행할 수 있습니다. 해제된 메모리 공간은 다른 데이터 저장에 재사용됩니다. 동적 배열을 메모리에서 삭제하지 않아도 프로그램 종료 시 자동으로 삭제됩니다.
참고:
동적 배열을 컴퓨터 메모리에서 삭제하려면 delete 대신 delete[]를 사용해야 합니다. []은 CPU에 여러 변수가 아닌 단일 변수를 삭제하도록 지시합니다. 동적 배열 처리 시 delete[] 대신 delete 사용 시 메모리 누수, 데이터 손상, 크래시 등의 문제가 발생할 수 있습니다.
예제 3:
#include<iostream>
using namespace std;
int main() {
int x, n;
cout << "How many numbers will you type?" << "\n";
cin >>n;
int *arr = new int(n);
cout << "Enter " << n << " numbers" << endl;
for (x = 0; x < n; x++) {
cin >> arr[x];
}
cout << "You typed: ";
for (x = 0; x < n; x++) {
cout << arr[x] << " ";
}
cout << endl;
delete [] arr;
return 0;
}