[C++] 1차원 배열, 다차원 배열

2022. 6. 11. 13:40♣ C++

이번 포스팅에선 C++의 배열에 대해 알아보도록 하겠습니다.

배열 : 같은 타입의 변수들로 이루어진 유한 집합

즉, 정수들의 집합/ 문자열들의 집합/실수들의 집합 등이 배열입니다.

 

개발 환경 : VSCode, Windows 10

 

 

 

 

 

기본 개발 세팅은 다음과 같습니다.

#include <iostream>
#include <string.h>
using namespace std;

int main()

{    
    // 연산자
    int num1 = 10;
    int num2 = 4;
    cout << "연산자 예시 \n";
    return 0;
}

 

 

 

 

 

1차원 배열


1차원 배열은 말 그대로, 한 줄(1차원)로 세워져 있는 변수들의 집합을 의미합니다.

예를 들면, {1,2,3,4,5} 같은 경우가 1차원 배열입니다.

 

 

 

[1차원 배열 생성 및 초기화]

-> Type ArrayName[ArrayLength] = {Array's elements}

 

1차원의 배열을 생성하고, 초기화하는 코드입니다.

** 여기서 초기화는 배열을 의미있는 변수들로 채우는 활동을 말합니다.

 

int main()

{    
    int num1 = 8, num2 = 4;
    // int형 배열인 경우, 'int 배열이름[배열 길이] = 배열 리스트'로 배열을 초기화합니다.
    int arr[6] = {23,34,25,27,31,57};
    for (int i=0; i < 6; i++){
        printf("배열의 %d번째 요소는 %d 입니다.\n", i+1, arr[i]);
    }
}

 

결과

배열의 1번째 요소는 23 입니다.
배열의 2번째 요소는 34 입니다.
배열의 3번째 요소는 25 입니다.
배열의 4번째 요소는 27 입니다.
배열의 5번째 요소는 31 입니다.
배열의 6번째 요소는 57 입니다.

int arr[6] = {23,34,25,27,31,57} 코드를 통해 arr라는 이름의 배열을 생성했습니다.

이처럼 배열을 초기화할 때 리스트를 이용하여 초기화를 할 수도 있지만, 값 하나하나 초기화하는 방법도 존재합니다.

 

int main()

{    
    int num1 = 8, num2 = 4;
    int arr[6] = {23,34,25,27,31,57};
    // 하나하나씩 초기화
    for (int i=0; i < 6; i++){
        arr[i] = i*5;
    }

    // 배열 출력 
    for (int i=0; i < 6; i++){
        printf("배열의 %d번째 요소는 %d 입니다.\n", i+1, arr[i]);
    }
}

 

결과

배열의 1번째 요소는 0 입니다.
배열의 2번째 요소는 5 입니다.
배열의 3번째 요소는 10 입니다.
배열의 4번째 요소는 15 입니다.
배열의 5번째 요소는 20 입니다.
배열의 6번째 요소는 25 입니다.

i번째 배열 요소를 i*5로 대체시켰습니다.

그 결과, 1번째 요소를 제외하고는 5의 배수 배열이 만들어졌습니다.

 

 

 

배열을 다루면서 몇 가지 짚고 넘어가야 할 특성들이 있습니다. 

(1) 배열의 길이를 따로 정해주지 않아도 됩니다. 할당되는 대로 기계는 길이를 재정의할 것입니다.

int arr[] = {1,2,3,4,5}

 

(2) 배열의 길이는 반드시 상수를 사용해야 합니다. 변수 불가.

int arr[a] = {1,2,3,4,5} -> X

 

(3) C++ 컴파일러는 배열의 길이를 전혀 신경 쓰지 않기에, 길이 3으로 지정한 배열에도 100개의 요소가 들어갈 수 있습니다. 따라서 개발자가 일일이 신경 써서 코딩해줘야 합니다.

(4) 초기화 리스트를 이용하여 초기화할 경우, narrowing cast를 허용하지 않습니다.

* narrowing cast : 초기화를 통해 발생하는 암시적 데이터 손실. int형인데 float가 들어올 경우, 손실 발생.

 

 

 

 

 

[배열의 길이 및 메모리 크기 구하기]

배열의 길이와 메모리 크기는 sizeof() 함수를 통해 구할 수 있습니다.

 

배열의 메모리 크기 = 배열의 길이 * sizeof(배열 타입)

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

 

int main()

{    
    int ArrayMemory, ArrayLength;
    int arr[6] = {23,34,25,27,31,57};
    ArrayMemory = 6 * sizeof(int);
    ArrayLength = sizeof(arr) / sizeof(arr[0]);

    cout << "배열의 메모리 크기는 " << ArrayMemory << " 입니다." << endl;
    cout << "배열의 길이는 " << ArrayLength << " 입니다." << endl;
}

 

결과

배열의 메모리 크기는 24 입니다.
배열의 길이는 6 입니다.

int형 배열이기에, int형의 메모리 크기와 배열의 길이를 곱하면 배열의 메모리 크기가 나옵니다.

배열의 메모리 크기에서 변수 하나의 크기를 나누면, 배열의 길이가 나오게 됩니다.

 

 

 

 

 

 

 

다차원 배열


다차원 배열이란?

만약 n차원의 배열이라면, n-1차원의 배열을 요소로 가집니다.

2차원 배열은 1차원 배열을 요소로, 3차원 배열은 2차원 배열을 요소로 가집니다. 

이때 배열의 요소가 1차원 배열 이상일 때를 다차원 배열이라고 합니다. 

C++ 에선 보통 2차원 배열을 많이 쓰므로, 이 포스팅에서도 2차원 배열을 위주로 다루겠습니다.

 

 

 

[2차원 배열 초기화 방법 2가지]

 

1. 선형적 초기화

int TwoDimensArray[2][3] = {1,2,3,4,5,6};

 

2. 직관적 초기화, 보통 이 방법을 많이 사용합니다.

int main()
{    
    int TwoDimenArray[2][3] = {
        {1,2,3},
        {4,5,6}
        };
}

 

 

 

 

[2차원 배열 요소들의 값 확인]

두 번의 반복문을 돌려서 값을 확인합니다.

 

int main()
{    
    int TwoDimenArray[2][3] = {
        {1,2,3},
        {4,5,6}
        };
    
    // 두 개의 반복문 돌리기
    for (int i=0; i<2; i++){
        for (int j=0; j<3; j++){
            cout << "현재 배열 요소는 " << TwoDimenArray[i][j] << " 입니다." << endl;
        }
    }
}

 

결과

현재 배열 요소는 1 입니다.
현재 배열 요소는 2 입니다.
현재 배열 요소는 3 입니다.
현재 배열 요소는 4 입니다.
현재 배열 요소는 5 입니다.
현재 배열 요소는 6 입니다.

 

 

 

 

[2차원 배열 열/행의 길이 구하기]

1차원 배열과 마찬가지로 sizeof() 함수를 통해 구합니다.

 

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

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

 

int main()
{    
    int TwoDimenArray[2][3] = {
        {1,2,3},
        {4,5,6}
        };
    
    int CrossLength = sizeof(TwoDimenArray[0]) / sizeof(TwoDimenArray[0][0]);
    int FlatLength = sizeof(TwoDimenArray) / sizeof(TwoDimenArray[0]);
    
    printf("열의 길이 : %d\n", CrossLength);
    printf("행의 길이 : %d", FlatLength);
}

 

결과

열의 길이 : 3
행의 길이 : 2

 

 

2차원 배열의 경우도 특징이 존재합니다.

(1) 1차원 배열과 마찬가지로 길이(행)를 명시하지 않고, 자동으로 길이(행)를 설정할 수 있습니다.

(2) 단, 행의 길이는 생략할 수 있지만 열의 길이는 생략해서는 안됩니다. 

 

 

 

지금까지 C++의 배열을 다뤄보았습니다.

기본 문법과 몇 가지 특성들을 배웠으니, 나중에 꼭 복습/ 혼자 연습해보시길 바랍니다.

다음 포스팅에선 Pointer에 대해 다뤄보도록 하겠습니다.

수고하셨습니다.