Channi Studies

[C++] 배열 (Array) 본문

C++/기타

[C++] 배열 (Array)

Chan Lee 2023. 12. 5. 12:40

Modern C++에서는 주로 배열보다는 벡터를 사용합니다.

 

배열에는 여러가지 특징이 존재합니다.

대표적인 특징 여러가지를 소개해드리겠습니다.

1. 배열의 모든 요소들은 같은 데이터 타입이여야 합니다.

int my_arr[] {30, 50, 'a', "Ricky"}		// 🚫🚫🚫 오류 발생
int my_arr[] {30, 50, 100, 300000}		// Good
char my_arr[] {'a', 'c', 'q' ,'h'}		// Good

 

2. 배열의 크기는 고정되어 있습니다. (배열의 요소의 총 숫자는 선언 이후 변화할 수 없습니다.)

그에 반해, 벡터는 크기가 가변적입니다.

 

3. Array 사용 중 인덱스 초과에 대한 검사가 존재하지 않습니다.

즉, array의 크기를 3으로 선언하고 3 이상의 index에 대해 출력을 하려고 하면,

오류는 발생하지 않지만 random garbage data가 출력됩니다.

 

4. 배열의 이름은 [index 0]번째 요소의 위치를 나타냅니다.

배열은 선언하고 이름을 출력하면 어떠한 16진수 숫자가 나옵니다.

이것이 바로 해당 배열이 저장된 위치, 즉 index 0번째 값이 저장된 위치입니다.

 

여기서 더욱 나아가서, [index]는 그 배열의 시작점에서 부터의 offset을 나타냅니다.

즉, index가 1이면 배열의 시작점(아까의 16진수 값)에서 1만큼 offset된 위치에 저장된 데이터를 나타냅니다.

 

여기서, C++는 sizeof() 함수를 통해 해당 배열의 비트 값을 이해하기 때문에, 

offset이 1이라고 숫자 1만큼 떨어졌다는 뜻이 아닙니다. 

 

편의상 특정 int 배열의 numbers의 첫번째 값의 데이터상 위치가 1000이라고 가정을 해봅시다.

int numbers[5] {10, 20, 30, 40, 50}

값들의 인덱스는 각각 10→0, 201, 302, 403, 504 입니다.

 

여기서 첫번째 값인 10의 위치가 인덱스 0, 즉 1000이니까,

20은 1000에서 1 offset의 값을 가진 위치, 30은 2의 위치 40은 3의 위치, 50은 4의 offset의 값을 가진 위치에 존재합니다.

 

여기서, sizeof(int) = 4, 즉 정수 데이터는 4바이트 메모리를 차지하기 때문에,

1000, 1001, 1002, 1003, 1004, 1005의 위치가 아니라,

1000, 1004, 1008, 1012, 1016 의 위치에 각각 값이 저장될 것입니다.

 

 

c++는 sizeof 함수를 통해 배열의 타입의 byte 크기를 이해하기 때문에,

배열의 자료형이 다를 때에는 같은 offset, 즉 같은 index에 대해서도 다른 데이터 위치에 있는 값을 적절하게 접근합니다.

가령 자료형이 정수가 아닌 double이였다면, (double은 8 bytes를 차지합니다)

1000, 1008, 1016, 1024, 1032의 위치에 데이터들이 저장되어 있을 것입니다.

 

* 데이터가 무조건 1000에 저장된다는 뜻이 아니고, 이해를 위해 첫번째 값이 1000에 저장된다고 가정한 것입니다.

 

 

또한, 예시에서 1000~ 1016의 위치에 데이터가 배정되었다고 해서, 그 미만 혹은 초과하는 위치에는 데이터가 없는것이 아닙니다.그렇기 때문에 3번 규칙에서 처럼 초과된 index를 출력하면 전혀 연관없는 garbage data가 출력되는 것입니다.


 

C++에서도 물론 2차원 배열을 사용할 수 있습니다.

2차원 배열도 동일하게 선언과 동시에 초기화를 할수도, 하지 않을수도 있습니다.

int movie_rating [3][4];

// or 

const int rows {3};
const int cols {4};
int movie_rating [rows][cols];

// or

int movie_rating [3][4]
    {
    	{3, 3, 1, 5},
        {1, 5, 5, 3},
        {2, 4, 4, 2}
    };