가변 배열

Jaemyeong Lee·2024년 6월 7일

C/C++

목록 보기
22/56

GPT

C/C++에서 가변 배열(VLA: Variable Length Array)에 대해 설명하고, 이를 이해하기 위한 다양한 방식을 설명하겠습니다.

1. 가변 배열 개요

가변 배열은 배열의 크기를 런타임에 결정할 수 있는 배열입니다. C99 표준에서는 가변 배열을 도입하였으나, C++에서는 표준으로 지원되지 않습니다. 대신 C++에서는 동적 메모리 할당을 사용하여 런타임에 크기가 결정되는 배열을 사용할 수 있습니다.

2. 가변 배열 선언과 사용법

C에서의 가변 배열

C에서는 배열의 크기를 런타임에 결정할 수 있습니다.

#include <stdio.h>

int main() {
    int n;

    printf("Enter the size of the array: ");
    scanf("%d", &n);

    // 가변 배열 선언
    int arr[n];

    // 배열 초기화
    for (int i = 0; i < n; ++i) {
        arr[i] = i * 2;
    }

    // 배열 요소 출력
    for (int i = 0; i < n; ++i) {
        printf("arr[%d] = %d\n", i, arr[i]);
    }

    return 0;
}

C++에서의 동적 배열

C++에서는 가변 배열을 지원하지 않지만, 동적 메모리 할당을 통해 런타임에 크기가 결정되는 배열을 사용할 수 있습니다.

#include <iostream>

int main() {
    int n;

    std::cout << "Enter the size of the array: ";
    std::cin >> n;

    // 동적 배열 선언
    int* arr = new int[n];

    // 배열 초기화
    for (int i = 0; i < n; ++i) {
        arr[i] = i * 2;
    }

    // 배열 요소 출력
    for (int i = 0; i < n; ++i) {
        std::cout << "arr[" << i << "] = " << arr[i] << std::endl;
    }

    // 동적 배열 해제
    delete[] arr;

    return 0;
}

3. 컴퓨터 구조 및 운영체제 측면에서의 이해

메모리 할당

  • 가변 배열 (C): 가변 배열은 스택 메모리에 할당됩니다. 배열의 크기는 런타임에 결정되며, 함수가 종료되면 자동으로 메모리가 해제됩니다.
  • 동적 배열 (C++): 동적 배열은 힙 메모리에 할당됩니다. 배열의 크기는 런타임에 결정되며, 프로그래머가 명시적으로 메모리를 해제해야 합니다.

메모리 접근

가변 배열과 동적 배열 요소는 인덱스를 사용하여 접근합니다. 이는 기본적으로 포인터 산술을 통해 구현됩니다.

메모리 구조:
+--------+--------+--------+--------+
| arr[0] | arr[1] | arr[2] | arr[3] |
+--------+--------+--------+--------+

캐시 적중

가변 배열과 동적 배열은 연속된 메모리 블록을 사용하므로, CPU 캐시의 적중률이 높아질 수 있습니다. 이는 반복적으로 배열 요소를 접근할 때 성능 향상을 가져옵니다.

4. 그림과 삽화

가변 배열과 동적 배열의 메모리 구조와 접근 방식을 이해하기 쉽게 그림과 표로 표현하였습니다.

가변 배열 (C):
int arr[n];

메모리 구조:
+--------+--------+--------+--------+ ... (n만큼)
| arr[0] | arr[1] | arr[2] | arr[3] |
+--------+--------+--------+--------+

동적 배열 (C++):
int* arr = new int[n];

메모리 구조:
+--------+--------+--------+--------+ ... (n만큼)
| arr[0] | arr[1] | arr[2] | arr[3] |
+--------+--------+--------+--------+

5. 예제 코드 확장

다양한 상황에서 가변 배열과 동적 배열을 사용하는 예제를 추가로 제공합니다.

이차원 가변 배열 (C)

#include <stdio.h>

int main() {
    int rows, cols;

    printf("Enter the number of rows: ");
    scanf("%d", &rows);
    printf("Enter the number of columns: ");
    scanf("%d", &cols);

    // 이차원 가변 배열 선언
    int arr[rows][cols];

    // 배열 초기화
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            arr[i][j] = i * cols + j;
        }
    }

    // 배열 요소 출력
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            printf("arr[%d][%d] = %d\n", i, j, arr[i][j]);
        }
    }

    return 0;
}

이차원 동적 배열 (C++)

#include <iostream>

int main() {
    int rows, cols;

    std::cout << "Enter the number of rows: ";
    std::cin >> rows;
    std::cout << "Enter the number of columns: ";
    std::cin >> cols;

    // 이차원 동적 배열 할당
    int** arr = new int*[rows];
    for (int i = 0; i < rows; ++i) {
        arr[i] = new int[cols];
    }

    // 배열 초기화
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            arr[i][j] = i * cols + j;
        }
    }

    // 배열 요소 출력
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            std::cout << "arr[" << i << "][" << j << "] = " << arr[i][j] << std::endl;
        }
    }

    // 이차원 동적 배열 해제
    for (int i = 0; i < rows; ++i) {
        delete[] arr[i];
    }
    delete[] arr;

    return 0;
}

요약

가변 배열은 배열의 크기를 런타임에 결정할 수 있는 배열로, C에서는 지원되지만 C++에서는 표준으로 지원되지 않습니다. 대신 C++에서는 동적 메모리 할당을 통해 런타임에 크기가 결정되는 배열을 사용할 수 있습니다. 가변 배열과 동적 배열은 각각 스택과 힙 메모리에 할당되며, 인덱스를 사용하여 요소에 접근합니다. 운영체제는 메모리 할당과 해제를 관리하여 프로그램이 효율적으로 배열을 사용할 수 있도록 돕습니다.

이와 같은 내용을 통해 C/C++의 가변 배열에 대해 더 깊이 이해할 수 있을 것입니다. 추가로 궁금한 사항이 있으면 알려주세요!

profile
李家네_공부방

0개의 댓글