배열
배열(array)은 같은 타입의 변수들로 이루어진 유한 집합이다.
배열을 구성하는 각각의 값을 배열 요소(element)라고 하며, 배열에서의 위치를 가리키는 숫자를 인덱스(index)라고 한다.
배열은 선언되는 형식에 따라 1차원 배열, 2차원 배열뿐만 아니라 그 이상의 다차원 배열로도 선언할 수 있다.
C++에서 인덱스는 언제나 0부터 시작하며, 0을 포함한 양의 정수만을 가질 수 있다.
배열의 길이를 선언할 때는 반드시 상수를 사용해야 한다.
타입 배열이름[배열길이];
타입은 배열 요소로 들어가는 변수의 자료형이라 보면 된다. (int, float 등)
배열 이름은 사용할 배열의 변수 이름이라 보면 된다.
배열의 길이는 해당 배열이 몇 개의 배열 요소를 가질 것인지를 나타내는 곳이다.
배열을 선언하면, 배열의 크기만큼 연속된 메모리 주소가 할당된다.
또한, 선언만 하고 초기화하지 않으면, 기본 요소는 쓰레깃값으로 채워진다.
#include <iostream>
int main()
{
// [4byte]-[4byte]-[4byte]-[4byte]-[4byte]
int example[5];
example[0] = 1;
example[4] = 10;
}
int main()
{
int sum = 0;
int grade[3]; // 길이가 3인 int형 배열 선언
// 인덱스를 이용한 배열의 초기화
grade[0] = 85; // 국어 점수
grade[1] = 65; // 영어 점수
grade[2] = 90; // 수학 점수
for (int i = 0; i < 3; i++)
sum += grade[i]; // 인덱스를 이용한 배열로의 접근
cout << "국영수 과목 총 점수 합계는 " << sum << "점이고, 평균 점수는 " << sum / 3 << "점입니다!" << endl;
return 0;
}
/*실행 결과
국영수 과목 총 점수 합계는 240점이고, 평균 점수는 80점입니다!
*/
위의 예제는 int형 데이터를 3개 저장할 수 있는 배열을 선언하고 있다.
또한, 0부터 시작하는 인덱스(index)를 이용하면 각각의 배열 요소에 따로 접근할 수 있다.
※ 언제나 배열의 이름은 배열의 첫 번째 요소와 같은 주소를 가리키고 있다.
배열의 선언과 동시에 초기화
C++에서는 변수와 마찬가지로 배열도 선언과 동시에 초기화할 수 있다.
다음과 같이 괄호({})를 사용하여 초깃값을 나열한 것을 초기화 리스트라고 한다.
타입 배열이름[배열길이] = { 배열요소1, 배열요소2, ... };
단, 초기화 리스트의 타입과 배열의 타입은 반드시 일치해야 한다.
만약 초기화 리스트의 개수가 배열의 총길이보다 적으면, 배열의 앞에서부터 차례대로 초기화된다.
이때 초기화되지 못한 나머지 배열 요소는 모두 0으로 초기화된다.
초기화 리스트를 이용한 초기화 방법은 반드시 배열의 선언과 함께 정의되어야 하고, 배열 선언 후에는 이 방식으로 요소를 초기화할 수 없다.
int arr1[3] = { 0, 1, 2 }; // 배열의 선언과 동시에 초기화
int arr2[3]; // 배열의 선언
arr2[3] = { 0, 1, 2 }; // 배열이 먼저 선언된 후에는 이 방식으로 초기화 못함 / 오류 발생
arr2 = arr1 // 길이와 타입이 모두 같더라도 통째로 대입할 수는 없음.
배열의 길이 자동 설정
- C++에서는 배열의 길이를 따로 입력하지 않은 배열은 초기화 리스트의 배열 요소 개수에 맞춰 자동으로 배열의 길이가 설정된다.
int arr[] = { 1, 2, 3 };
위의 예제에서 int형 배열 arr의 길이는 자동으로 3으로 설정됨과 동시에 초기화 리스트에 의해 초기화된다
배열 사용 시 자주 만나는 OutOfRange(또는 OutOfIndex) 오류
- 배열을 사용할 때는 배열의 범위(Bound) 안에서 사용해야 한다. 이 점을 항상 주의하자
- 아래 코드는 배열의 범위를 벗어난 곳에 접근했기 때문에 오류가 발생한다.
int example[5];
example[0] = 1;
example[4] = 10;
example[-1] = 3;
example[5] = 20;
std::cout << example[4] << std::endl;
std::cout << example << std::endl;
배열과 포인터의 관계
- 배열의 이름은 포인터다.
- 따라서 포인터 변수에 배열 주소를 저장해 사용이 가능하다.
int example[5];
example[0] = 1;
example[4] = 10;
int* ptr = example;
*(ptr + 2) = 20;
//*(int*)((char*)ptr + 8) = 20;
std::cout << example[4] << std::endl;
std::cout << example << std::endl;
배열의 원소 순환
- 배열 안의 원소(Element)를 순환할 때는 보통 루프(For/While)를 사용한다.
int example[5];
example[0] = 1;
example[4] = 10;
//int length = 5;
int length = sizeof(example) / sizeof(example[0]);
for (int ix = 0; ix < length; ++ix)
{
example[ix] = 2;
}
std::cout << example[4] << std::endl;
std::cout << example << std::endl;
배열의 동적 할당
- 아래 코드는 배열을 힙(Heap) 메모리에 생성하고, 생성한 메모리의 주소를 반환한다.
int example[5];
//int length = 5;
int length = sizeof(example) / sizeof(example[0]);
for (int ix = 0; ix < length; ++ix)
{
example[ix] = 2;
}
int* another = new int[5];
for (int ix = 0; ix < 5; ++ix)
{
another[ix] = 2;
}
delete[] another;
다차원 배열
다차원 배열이란 2차원 이상의 배열을 의미하며, 배열 요소로 또 다른 배열을 가지는 배열이다.
- C++에서는 2차원 배열을 나타내는 타입을 따로 제공하지는 않고, 1차원 배열의 요소로 또 다른 1차원 배열을 사용하여 나타낸다.
타입 배열이름[행의길이][열의길이];
int arr1[6] = { 10, 20, 30, 40, 50, 60 };
int arr2[2][3] = { 10, 20, 30, 40, 50, 60 };
배열의 선언과 동시 초기화
- 2차원 배열을 1차원 배열의 초기화 형태로도 초기화할 수 있고, 2차원 배열부터는 좀 더 직관적으로 바꿔 초기화하는 방법도 좋다.
타입 배열이름[행의길이][열의길이] =
{
{배열요소[0][0], 배열요소[0][1], ...},
{배열요소[1][0], 배열요소[1][1], ...},
{배열요소[2][0], 배열요소[2][1], ...},
...
}
배열의 일부 요소만을 초기화
- C++에서는 2차원 배열의 일부 요소만을 초기화할 수도 있다.
- 이 방식으로는 원하는 배열 요소만을 초기화할 수 있고, 이때 초기화 하지 않은 배열 요소는 모두 0으로 자동 초기화된다.
int arr[3][4] =
{
{10, 20},
{30, 40, 50, 60},
{0, 0, 70, 80}
};
배열의 길이 자동 설정
- 2차원 배열도 1차원 배열과 마찬가지로 배열의 길이를 명시하지 않고, 자동으로 배열의 길이를 설정할 수 있다.
- 단, 행의 길이는 생략할 수 있지만, 열의 길이는 반드시 명시해야 한다.
int arr[][4] =
{
{10, 20},
{30, 40, 50, 60},
{0, 0, 70, 80}
};
'📕Programming > 📝C/C++' 카테고리의 다른 글
| [C / C++] 문자열 (0) | 2023.09.14 |
|---|---|
| [C / C++] 포인터 / 레퍼런스 (0) | 2023.09.12 |
| [C / C++] 반복문 (0) | 2023.09.10 |
| [C / C++] 조건문 (0) | 2023.09.10 |
| [C / C++] 문자 입출력 (0) | 2023.09.09 |