Program Language/C++ 언어

05. C++ 배열과 포인터 - 1차원 배열과 다차원 배열

parkes811 2023. 1. 28. 17:41
  • 배열(Array)이란?

- 배열은 같은 타입의 변수들로 이루어진 유한 집합으로 정의할 수 있습니다.

- 배열을 구성하는 각각의 값을 배열 요소(element)라고 하며, 배열에서의 위치를 가리키는 숫자를 인덱스(index)라고 합니다.

- C++에서 인덱스는 언제나 0부터 시작하며, 0을 포함한 양의 정수만을 가질 수 있습니다.

- 배열은 선언되는 형식에 따라 1차원 배열, 2차원 배열뿐만 아니라 그 이상의 다차원 배열로도 선언할 수 있습니다.

 

  • 1차원 배열 

- 1차원 배열은 가장 기본적인 배열로 다음과 같은 문법에 따라 선언합니다.

타입 배열이름[배열길이];

- 타입은 배열 요소로 들어가는 변수의 타입을 명시합니다. 

- 배열 이름은 배열이 선언된 후에 배열에 접근하기 위해 사용됩니다.

- 배열의 길이는 해당 배열이 몇 개의 배열 요소를 가지게 되는지 명시합니다.

- 배열은 선언만 하고 초기화 하지 않으면, 모든 배열 요소가 쓰레깃값으로 채워집니다.

 

- 정수형 데이터를 저장할 수 있는 배열을 선언하게되면 0부터 2까지 3개의 배열이 만들어집니다.

- 배열의 이름은 배열의 첫 번째 요소와 같은 주소를 가리킵니다.

 

 

 

 

 

 

 

 

  • 배열의 선언과 동시에 초기화하는 방법

- C++에서는 변수와 마찬가지로 배열도 선언과 동시에 초기화할 수 있습니다.

- 다음과 같이 괄호 {} 를 사용하여 초깃값을 나열한 것을 초기화 리스트라고 합니다.

- 초기화 리스트의 타입과 배열의 타입은 반드시 일치해야합니다.

타입 배열이름[배열길이] = {배열요소1, 배열요소2, ...};

- 초기화 리스트를 이용한 초기화 방식은 반드시 배열의 선언과 함께 정의되어야 합니다.

- 배열이 먼저 선언된 후에는 이 방식으로 배열의 요소를 초기화할 수 없습니다.

- 만약 초기화 리스트의 개수가 배열의 총 길이보다 적으면, 배열의 앞에서부터 차례대로 초기화되고 나머지 배열 요소는 모두 0으로 초기화됩니다.

 

  • 배열의 길이 자동 설정

- C++에서는 초기화 리스트에 맞춰 자동으로 배열의 길이를 설정할 수도 있습니다.

타입 배열이름[] = {배열요소1, 배열요소2, ...};

- 배열의 길이를 따로 입력하지 않은 배열은 초기화 리스트의 배열 요소 개수에 맞춰 자동으로 배열의 길이가 설정됩니다.

 

  • 배열의 특징

- C++에서 배열은 다음과 같은 특징을 가집니다.

1. 배열의 길이를 선언할 때에는 반드시 상수를 사용해야 합니다.

2. 배열 요소의 인덱스는 언제나 0부터 시작합니다.

3. C++ 컴파일러는 배열의 길이를 전혀 신경 쓰지 않습니다.

 

  • 배열이 차지하는 메모리의 크기

- C++에서 배열을 복사하거나 배열 요소에 특정 작업을 하고 싶을 때는 해당 배열이 차지하는 메모리의 크기를 정확히 알고 있는 것이 좋습니다.

 

- 배열이 차지하는 총 메모리의 크기는 다음 수식을 사용하여 구할 수 있습니다.

배열이 차지하는 메모리의 크기 = 배열의 길이 X sizeof(타입)

 

- 배열의 길이를 알고 싶을 때에는 다음 수식을 사용하여 구할 수 있습니다.

배열의 길이 = sizeof(배열 이름) / sizeof(배열 이름[0])

- 위 수식에서 배열 이름[0]은 해당 배열의 타입을 나타내기 위해 사용했습니다.

 

  • narrowing cast

- 배열, 변수 데이터 타입에 맞지 않는 데이터 값을 통해 초기화할 경우 암시적인 데이터의 손실을 의미합니다.

int var = 3.14 // narrowing cast

 


 

  • 다차원 배열 (multi-dimensional array)

- 다차원 배열이란 2차원 이상의 배열을 의미하며, 배열 요소로 또 다른 배열을 가지는 배열을 의미합니다.

- 2차원 배열은 배열 요소로 1차원 배열을 가지고, 3차원 배열은 2차원 배열을 배열 요소로 가지는 것입니다.

 

- 2차원 배열은 다음과 같은 문법에 따라 선언할 수 있습니다.

타입 배열이름[행의길이][열의길이];

- 타입은 배열 요소로 저장되는 변수의 타입을 설정합니다.

- 배열 이름은 배열이 선언된 후에 배열에 접근하기 위해 사용됩니다.

 

- 다음 그림은 2차원 배열을 이해하기 쉽도록 도식화한 그림입니다. 

 

- 하지만 컴퓨터의 메모리는 위와 같은 입체적 공간이 아니라 선형 공간이므로 실제로는 다음 그림과 같이 저장됩니다.

 

  • 배열의 선언과 동시에 초기화하는 방법

- 1차원 배열과 마찬가지로 2차원 배열도 선언과 동시에 초기화할 수 있습니다.

- 2차원 배열은 1차원 배열과는 달리 다음과 같이 여러 방식으로 초기화할 수 있습니다.

 

1. 1차원 배열의 초기화 형태를 따르는 방식

2. 배열의 모든 요소를 초기화하는 방식

3. 배열의 일부 요소만을 초기화하는 방식

 

  • 1차원 배열의 초기화 형태를 따르는 방식

- C++에서는 2차원 배열을 1차원 배열의 초기화 형태로도 초기화할 수 있습니다.

타입 배열이름[행의길이][열의길이] = {배열요소[0][0], 배열요소[0][1],
..., 배열요소[1][0], 배열요소[1][1], ..., 배열요소[2][0], 배열요소[2][1], ...};

- 이 방식은 2차원 배열의 배열 요소 [0][0]부터 차례대로 초기화됩니다.

- 만약 초기화하는 배열 요소의 개수가 배열의 총 길이보다 적으면, 나머지 배열 요소는 모두 0으로 초기화됩니다.

 

  • 배열의 모든 요소를 초기화하는 방식

- C++에서는 2차원 배열의 모든 요소를 좀 더 직관적으로 초기화할 수 있습니다.

타입 배열이름[행의길이][열의길이] =
{
    {배열요소[0][0], 배열요소[0][1], ...},
    {배열요소[1][0], 배열요소[1][1], ...},
    {배열요소[2][0], 배열요소[2][1], ...},
    ...
};

- 이 방식은 1차원 배열의 초기화 형태를 따르는 방식과 결과는 같으나 더 직관적으로 2차원 배열의 모습을 알 수 있으므로, 보통 이 방식을 많이 사용합니다.

 

  • 배열의 일부 요소만을 초기화하는 방식

- C++에서는 2차원 배열의 일부 요소만을 초기화할 수 있습니다.

- 2차원 배열의 원하는 배열 요소만 초기화하고, 초기화하지 않은 배열 요소는 모두 0으로 자동 초기화됩니다.

int arr[3][4] = {
    {10, 20},
    {30, 40, 50, 60},
    {0, 0, 70, 80}
};

 

  • 배열의 길이 자동 설정 

- 2차원 배열도 길이를 명시하지 않고 자동으로 배열의 길이를 설정할 수 있습니다.

- 행의 길이는 생략할 수 있지만, 열의 길이는 반드시 명시해야 합니다.