C++

[C++] 배열(Array) 선언 및 초기화

제에엔 2025. 2. 5. 03:03

C++에서 배열을 선언하는 방법은 여러 가지가 있으며, 일반 배열, 동적 배열, 이중 배열(2차원 배열) 등을 사용할 수 있다.

 

1️⃣ 기본 배열 (정적 배열)

정적 배열은 크기가 고정된 배열로, 컴파일 시 크기가 결정된다.

#include <iostream>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};  // 크기가 5인 배열 선언
    std::cout << "첫 번째 원소: " << arr[0] << std::endl;
    return 0;
}

 

📌 특징

  • 크기가 고정됨 (컴파일 시 결정)
  • 초기화 시 배열 크기 자동 설정 가능: int arr[] = {1, 2, 3};

배열 초기화 방법

배열을 초기화하는 방법에는 여러 가지가 있다.

int arr1[5] = {1, 2, 3, 4, 5};  // 전체 초기화
int arr2[5] = {1, 2};           // 나머지는 자동으로 0으로 채움
int arr3[] = {10, 20, 30};      // 크기를 자동으로 설정
int arr4[5] = {};               // 모든 요소를 0으로 초기화

배열 요소 접근

배열 요소는 인덱스(index) 를 사용하여 접근한다. (0부터 시작)

#include <iostream>

int main() {
    int arr[3] = {10, 20, 30};
    
    std::cout << "첫 번째 원소: " << arr[0] << std::endl;
    std::cout << "두 번째 원소: " << arr[1] << std::endl;
    
    return 0;
}

 

📌 주의
배열의 크기를 초과하여 접근하면 예기치 않은 동작(버퍼 오버플로우, 런타임 오류) 가 발생할 수 있다.

반복문을 사용한 배열 출력

#include <iostream>

int main() {
    int arr[5] = {10, 20, 30, 40, 50};
    
    for (int i = 0; i < 5; i++) {
        std::cout << "arr[" << i << "] = " << arr[i] << std::endl;
    }

    return 0;
}

 

📌 특징

  • for문을 사용해 배열을 쉽게 순회 가능
  • sizeof(arr) / sizeof(arr[0]) 을 사용하여 배열 크기 계산 가능

2️⃣ 이중 배열 (2차원 배열)

2차원 배열은 행(row)과 열(column)로 구성된 배열이다.

#include <iostream>

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

    std::cout << "첫 번째 행, 첫 번째 원소: " << matrix[0][0] << std::endl;
    
    return 0;
}

 

📌 특징

  • int arr[행][열]; 형식으로 선언
  • matrix[i][j] 로 요소에 접근

이중 배열(2차원 배열) 초기화

1. 기본 선언 및 초기화

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

2. 중괄호를 생략하는 초기화

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

 

  • 왼쪽에서 오른쪽, 위에서 아래 방향으로 자동 채워짐
  • 위 코드와 동일하게 동작

 

3. 특정 원소만 초기화 (나머지는 자동 0으로 채움)

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

 

📌 결과

arr[0][0] = 1   arr[0][1] = 2   arr[0][2] = 0
arr[1][0] = 4   arr[1][1] = 0   arr[1][2] = 0

 

  • `{1, 2}`만 제공했으므로 `arr[0][2]`는 자동 `0`으로 초기화
  • `{4}`만 제공했으므로 `arr[1][1]`, `arr[1][2]`도 `0`으로 초기화

 

4. 모든 원소를 0으로 초기화

int arr[3][3] = {};  // 모든 원소가 0으로 초기화

 

📌 결과

arr[0][0] = 0   arr[0][1] = 0   arr[0][2] = 0
arr[1][0] = 0   arr[1][1] = 0   arr[1][2] = 0
arr[2][0] = 0   arr[2][1] = 0   arr[2][2] = 0

 

  • `{}`을 사용하면 모든 값이 자동으로 0 으로 설정됨
  • `int arr[3][3] = {0};` 와 동일

 

이중 배열(2차원 배열) 출력

#include <iostream>

int main() {
    int matrix[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            std::cout << matrix[i][j] << " ";
        }
        std::cout << std::endl;
    }

    return 0;
}

 

📌 출력 결과

1 2 3
4 5 6
7 8 9

3️⃣ 가변 크기 배열(동적 배열)

C++에서는 크기가 고정된 배열 대신 동적 배열(new 연산자) 을 사용할 수도 있다.

1차원 동적 배열

#include <iostream>

int main() {
    int size;
    std::cout << "배열 크기를 입력하세요: ";
    std::cin >> size;

    int* arr = new int[size];  // 동적 배열 할당

    for (int i = 0; i < size; i++) {
        arr[i] = i + 1;
        std::cout << arr[i] << " ";
    }

    delete[] arr;  // 동적 메모리 해제
    return 0;
}

✅ 2차원 동적 배열

#include <iostream>

int main() {
    int rows = 3, cols = 3;

    // 2차원 동적 배열 생성
    int** matrix = new int*[rows];
    for (int i = 0; i < rows; i++) {
        matrix[i] = new int[cols];
    }

    // 값 할당 및 출력
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            matrix[i][j] = i * cols + j + 1;
            std::cout << matrix[i][j] << " ";
        }
        std::cout << std::endl;
    }

    // 동적 메모리 해제
    for (int i = 0; i < rows; i++) {
        delete[] matrix[i];
    }
    delete[] matrix;

    return 0;
}

 

📌 특징

  • `new`를 사용해 동적 할당
  • 사용 후 반드시 `delete[]` 로 메모리 해제

4️⃣ ` std::array`를 사용한 배열 (C++11 이상)

C++11부터 제공되는 `std::array`는 정적 크기 배열을 보다 안전하고 편리하게 사용할 수 있도록 도와준다.
기존 C 스타일 배열 (`int arr[5];`) 과 비교했을 때, 유지보수성과 기능성이 향상된 배열 컨테이너이다.

 

`std::array`는 C++ 표준 라이브러리의 컨테이너 클래스로,
✔️ 정적 크기 배열을 감싸서 더 안전하고 직관적인 기능을 제공한다.

#include <array>

 

✔️ `std::array`는 템플릿 기반이며, 다음과 같이 선언된다.

std::array<자료형, 크기> 변수명;

 

✔️ 주요 장점

  • C 스타일 배열보다 안전 (std::array는 크기 정보를 저장하므로 size() 사용 가능)
  • STL과 호환 가능 (begin(), end() 같은 STL iterator 사용 가능)
  • at() 함수로 범위 검사 가능 (안전한 인덱스 접근)
  • std::vector보다 가벼움 (동적 크기 변경이 필요 없다면 std::array가 std::vector보다 빠름)

1차원 배열 기본 선언

#include <iostream>
#include <array>

int main() {
    std::array<int, 5> arr = {1, 2, 3, 4, 5};

    for (int i = 0; i < arr.size(); i++) {
        std::cout << "arr[" << i << "] = " << arr[i] << std::endl;
    }

    return 0;
}
  • `arr.size()` : 배열의 크기를 반환

1차원 배열 초기화 방법

1. 기본 초기화 (명시적 값 설정)

std::array<int, 5> arr = {1, 2, 3, 4, 5};

2. 기본값으로 0 초기화

std::array<int, 5> arr = {};  // 모든 값이 0으로 초기화
  • `{}`를 사용하면 자동으로 `0`으로 채워짐

3. `.fill(value)` 사용

#include <iostream>
#include <array>

int main() {
    std::array<int, 5> arr;
    arr.fill(10);  // 모든 요소를 10으로 설정

    for (int num : arr) {
        std::cout << num << " ";
    }
    return 0;
}
  • 배열의 모든 요소를 `value` 값으로 초기화 할 수 있음

2차원 배열 선언

#include <iostream>
#include <array>

int main() {
    std::array<std::array<int, 3>, 2> matrix = { 
        { {1, 2, 3}, {4, 5, 6} } 
    };

    std::cout << "matrix[0][1]: " << matrix[0][1] << std::endl;
    return 0;
}
  • `std::array<std::array<int, 열>, 행>` 형식
  • 중괄호 `{}`를 사용하여 행과 열을 초기화

2차원 배열 초기화

(1) 직접 초기화

std::array<std::array<int, 3>, 2> matrix = { 
    { {1, 2, 3}, {4, 5, 6} } 
};

(2) `{}`를 사용하여 모든 원소를 0으로 초기화

std::array<std::array<int, 3>, 2> matrix = {};  // 모든 요소가 0으로 초기화

2차원 배열 반복문 출력

#include <iostream>
#include <array>

int main() {
    std::array<std::array<int, 3>, 3> matrix = { 
        { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} } 
    };

    for (const auto& row : matrix) {  // 행 반복
        for (int num : row) {  // 열 반복
            std::cout << num << " ";
        }
        std::cout << std::endl;
    }

    return 0;
}

 

📌 출력 결과

1 2 3
4 5 6
7 8 9

✅ std::array 주요 함수

함수 설명
`.size()` 배열의 크기 반환
`.fill(value)` 모든 요소를 `value`로 채움
`.at(index)` 안전한 인덱스 접근 (배열 범위 벗어나면 예외 발생)
`.front()` 첫 번째 요소 반환
`.back()` 마지막 요소 반환
`.begin()`, `.end()` STL 반복자 지원 (순회 가능)
`.data()` 내부 배열 포인터 변환

💡 `constexpr`을 사용한 크기 자동 계산

배열 크기를 자동으로 계산하려면 constexpr을 사용한다.

#include <iostream>

int main() {
    constexpr int ROWS = 2, COLS = 3;
    int arr[ROWS][COLS] = { {1, 2, 3}, {4, 5, 6} };

    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            std::cout << arr[i][j] << " ";
        }
        std::cout << std::endl;
    }

    return 0;
}

 

📌 특징

  • constexpr을 사용해 매크로처럼 크기 정의
  • 크기를 변경할 때 유지보수성이 증가

'C++' 카테고리의 다른 글

[C++] 사용자 입력 받기  (0) 2025.02.05