C 언어에서 다차원 배열을 활용한 데이터베이스 시뮬레이션 작성법

C 언어는 간단하고 효율적인 다차원 배열 구조를 제공하여 데이터를 체계적으로 저장하고 관리할 수 있습니다. 이 기사에서는 다차원 배열을 활용하여 간단한 데이터베이스를 설계하고, 데이터를 저장, 검색, 수정하는 방법을 단계별로 살펴봅니다. 이를 통해 다차원 배열의 활용 능력을 높이고 실질적인 프로그래밍 스킬을 익힐 수 있습니다.

목차

다차원 배열의 개념 및 용도


다차원 배열은 C 언어에서 데이터의 집합을 행과 열의 형태로 저장할 수 있는 구조입니다. 1차원 배열이 단일 데이터 목록을 저장하는 데 사용된다면, 다차원 배열은 표 형태나 더 복잡한 데이터 집합을 저장하는 데 적합합니다.

다차원 배열의 구조


다차원 배열은 여러 개의 1차원 배열을 포함하는 배열로 볼 수 있습니다. 예를 들어, int arr[3][4];는 3개의 행과 4개의 열을 가진 2차원 배열을 선언하며, 각 요소는 arr[i][j] 형식으로 접근할 수 있습니다.

용도와 활용


다차원 배열은 다음과 같은 다양한 용도로 사용됩니다:

  • 행렬 연산: 수학적 행렬 계산
  • 게임 개발: 체스판, 퍼즐 등의 데이터 관리
  • 데이터베이스: 간단한 데이터베이스처럼 행과 열로 데이터를 구조화

다차원 배열은 데이터를 구조적으로 관리하고 효율적인 검색 및 수정 기능을 제공하기 때문에 많은 응용 분야에서 활용됩니다.

데이터베이스와 다차원 배열의 연관성

다차원 배열은 행과 열의 구조를 통해 데이터베이스의 테이블과 유사한 형태를 제공합니다. 이로 인해 데이터를 체계적으로 저장하고 검색하는 작업을 효율적으로 수행할 수 있습니다.

다차원 배열을 데이터베이스로 활용하는 이유

  1. 테이블 구조의 구현:
    다차원 배열은 데이터베이스 테이블과 유사한 행(row)과 열(column)의 구조를 가지므로, 데이터를 분류하고 정리하는 데 적합합니다.
    예: int db[10][3];는 10명의 사용자의 데이터(3개의 속성)를 저장할 수 있는 구조를 제공합니다.
  2. 빠른 접근 속도:
    배열은 인덱스를 통해 데이터를 즉시 접근할 수 있어 검색 및 수정 속도가 매우 빠릅니다.
    예: 특정 사용자 데이터를 검색하려면, 해당 행의 인덱스만 사용하면 됩니다.
  3. 직관적인 관리:
    C 언어에서 배열은 선언과 초기화가 간단하며, 코드 수준에서 데이터를 관리하기에 직관적입니다.

데이터베이스의 기본 기능과 배열의 관계

  • 데이터 저장: 배열의 요소에 데이터를 저장하여 데이터베이스의 레코드와 동일한 역할을 수행합니다.
  • 데이터 검색: 배열 인덱스를 활용해 특정 데이터를 검색할 수 있습니다.
  • 데이터 수정: 특정 인덱스를 이용해 배열 요소의 값을 변경할 수 있습니다.

다차원 배열은 복잡한 데이터베이스 시스템의 간단한 대안으로, 학습과 실습에 매우 적합한 도구입니다.

다차원 배열을 사용한 데이터베이스 기본 구현

다차원 배열을 사용하여 간단한 데이터베이스처럼 데이터를 저장하고 검색하는 방법을 살펴보겠습니다.

구조 설계


다차원 배열의 행(row)은 데이터베이스의 레코드(record)를, 열(column)은 각 필드(field)를 나타냅니다. 예를 들어, 학생들의 성적 데이터를 저장하는 데이터베이스를 설계한다고 가정하면 다음과 같이 정의할 수 있습니다:

int student_data[5][3]; 
// 5명의 학생, 3개의 필드(예: ID, 수학 성적, 영어 성적)

데이터 저장


배열 요소를 통해 데이터를 저장합니다.

// 예: 학생 데이터를 저장
student_data[0][0] = 1;  // 학생 ID
student_data[0][1] = 85; // 수학 성적
student_data[0][2] = 90; // 영어 성적

데이터 검색


배열의 인덱스를 사용하여 데이터를 검색합니다.

// 예: 첫 번째 학생의 데이터를 출력
printf("ID: %d, Math: %d, English: %d\n", 
       student_data[0][0], 
       student_data[0][1], 
       student_data[0][2]);

데이터베이스 초기화


배열을 초기화하여 기본 데이터를 설정할 수 있습니다.

int student_data[5][3] = {
    {1, 85, 90},
    {2, 78, 82},
    {3, 92, 88},
    {4, 75, 80},
    {5, 89, 95}
};

예제 실행


간단한 학생 데이터베이스를 생성하고 특정 학생의 데이터를 검색하는 프로그램을 작성합니다.

#include <stdio.h>

int main() {
    int student_data[5][3] = {
        {1, 85, 90},
        {2, 78, 82},
        {3, 92, 88},
        {4, 75, 80},
        {5, 89, 95}
    };

    // 특정 학생 데이터 출력
    int index = 2; // 3번째 학생
    printf("ID: %d, Math: %d, English: %d\n", 
           student_data[index][0], 
           student_data[index][1], 
           student_data[index][2]);

    return 0;
}

이 간단한 구현은 다차원 배열을 데이터베이스처럼 사용하는 기본 개념을 보여줍니다. 이 구조를 바탕으로 더 복잡한 기능을 추가할 수 있습니다.

데이터 검색 및 수정 기능 구현

다차원 배열을 사용하여 저장된 데이터의 검색 및 수정 기능을 구현하는 방법을 알아보겠습니다. 이는 간단한 데이터베이스 기능을 수행할 수 있도록 합니다.

데이터 검색 기능


다차원 배열의 특정 데이터를 검색하려면 배열의 행(row)과 열(column)의 인덱스를 사용합니다.

#include <stdio.h>

// 학생 데이터 검색 함수
void search_data(int data[][3], int rows, int student_id) {
    for (int i = 0; i < rows; i++) {
        if (data[i][0] == student_id) { // ID가 일치하는 경우
            printf("ID: %d, Math: %d, English: %d\n", 
                   data[i][0], data[i][1], data[i][2]);
            return;
        }
    }
    printf("Student with ID %d not found.\n", student_id);
}

데이터 수정 기능


특정 학생의 데이터를 수정하려면 해당 배열 요소를 업데이트합니다.

// 학생 데이터 수정 함수
void update_data(int data[][3], int rows, int student_id, int math_score, int english_score) {
    for (int i = 0; i < rows; i++) {
        if (data[i][0] == student_id) { // ID가 일치하는 경우
            data[i][1] = math_score;
            data[i][2] = english_score;
            printf("Data updated for ID %d: Math: %d, English: %d\n", 
                   student_id, math_score, english_score);
            return;
        }
    }
    printf("Student with ID %d not found.\n", student_id);
}

전체 코드 예제


검색 및 수정 기능을 포함한 전체 프로그램 예제입니다.

#include <stdio.h>

// 검색 함수
void search_data(int data[][3], int rows, int student_id);

// 수정 함수
void update_data(int data[][3], int rows, int student_id, int math_score, int english_score);

int main() {
    int student_data[5][3] = {
        {1, 85, 90},
        {2, 78, 82},
        {3, 92, 88},
        {4, 75, 80},
        {5, 89, 95}
    };

    printf("Before update:\n");
    search_data(student_data, 5, 3); // ID 3 학생 검색

    printf("\nUpdating data...\n");
    update_data(student_data, 5, 3, 95, 98); // ID 3 학생 데이터 수정

    printf("\nAfter update:\n");
    search_data(student_data, 5, 3); // 수정 후 ID 3 학생 검색

    return 0;
}

// 함수 정의
void search_data(int data[][3], int rows, int student_id) {
    for (int i = 0; i < rows; i++) {
        if (data[i][0] == student_id) {
            printf("ID: %d, Math: %d, English: %d\n", 
                   data[i][0], data[i][1], data[i][2]);
            return;
        }
    }
    printf("Student with ID %d not found.\n", student_id);
}

void update_data(int data[][3], int rows, int student_id, int math_score, int english_score) {
    for (int i = 0; i < rows; i++) {
        if (data[i][0] == student_id) {
            data[i][1] = math_score;
            data[i][2] = english_score;
            printf("Data updated for ID %d: Math: %d, English: %d\n", 
                   student_id, math_score, english_score);
            return;
        }
    }
    printf("Student with ID %d not found.\n", student_id);
}

결과


위 코드를 실행하면 데이터 검색 및 수정이 올바르게 수행됩니다. 이를 통해 다차원 배열을 간단한 데이터베이스로 활용할 수 있습니다.

고급 기능: 동적 메모리와의 결합

다차원 배열은 고정된 크기로 선언되지만, 동적 메모리를 활용하면 배열의 크기를 런타임에 동적으로 결정할 수 있습니다. 이는 데이터베이스의 크기가 유동적으로 변하는 상황에서 매우 유용합니다.

동적 메모리를 활용한 다차원 배열


C 언어에서 malloc 함수와 이중 포인터를 사용하여 동적으로 2차원 배열을 생성할 수 있습니다.

동적 배열 생성 코드

#include <stdio.h>
#include <stdlib.h>

// 동적 메모리를 사용하여 다차원 배열 생성
int** create_dynamic_array(int rows, int cols) {
    int** array = (int**)malloc(rows * sizeof(int*));
    for (int i = 0; i < rows; i++) {
        array[i] = (int*)malloc(cols * sizeof(int));
    }
    return array;
}

// 동적 배열 메모리 해제
void free_dynamic_array(int** array, int rows) {
    for (int i = 0; i < rows; i++) {
        free(array[i]);
    }
    free(array);
}

동적 메모리와 데이터 관리


다음은 동적 배열을 생성하고 데이터를 저장 및 검색하는 예제입니다.

전체 코드 예제

#include <stdio.h>
#include <stdlib.h>

// 동적 배열 생성 및 해제 함수
int** create_dynamic_array(int rows, int cols);
void free_dynamic_array(int** array, int rows);

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

    // 동적 배열 생성
    int** student_data = create_dynamic_array(rows, cols);

    // 데이터 초기화
    for (int i = 0; i < rows; i++) {
        student_data[i][0] = i + 1;         // ID
        student_data[i][1] = 80 + i * 2;   // 수학 점수
        student_data[i][2] = 85 + i * 3;   // 영어 점수
    }

    // 데이터 출력
    printf("Student Data:\n");
    for (int i = 0; i < rows; i++) {
        printf("ID: %d, Math: %d, English: %d\n", 
               student_data[i][0], student_data[i][1], student_data[i][2]);
    }

    // 메모리 해제
    free_dynamic_array(student_data, rows);

    return 0;
}

// 동적 배열 생성
int** create_dynamic_array(int rows, int cols) {
    int** array = (int**)malloc(rows * sizeof(int*));
    for (int i = 0; i < rows; i++) {
        array[i] = (int*)malloc(cols * sizeof(int));
    }
    return array;
}

// 동적 배열 메모리 해제
void free_dynamic_array(int** array, int rows) {
    for (int i = 0; i < rows; i++) {
        free(array[i]);
    }
    free(array);
}

실행 결과

Student Data:
ID: 1, Math: 80, English: 85
ID: 2, Math: 82, English: 88
ID: 3, Math: 84, English: 91
ID: 4, Math: 86, English: 94
ID: 5, Math: 88, English: 97

동적 메모리 사용의 장점

  1. 유연성: 런타임에 배열 크기를 결정할 수 있습니다.
  2. 확장성: 데이터 크기가 변경될 때 효율적으로 대응할 수 있습니다.
  3. 효율적인 메모리 사용: 필요한 만큼만 메모리를 할당하여 낭비를 줄입니다.

동적 메모리를 활용한 다차원 배열은 더 복잡한 데이터 구조를 효율적으로 구현할 수 있도록 해줍니다. 이를 통해 데이터베이스 구현의 유연성과 성능을 모두 높일 수 있습니다.

실전 연습: 다차원 배열로 학생 성적 관리 프로그램 작성

다차원 배열을 활용하여 학생 성적을 관리하는 프로그램을 작성해 보겠습니다. 이 프로그램은 데이터를 저장, 검색, 수정하는 기능을 제공하며, 실제로 데이터를 처리하는 방법을 익힐 수 있는 실습 예제입니다.

프로그램 요구사항

  1. 학생 ID, 수학 점수, 영어 점수를 관리합니다.
  2. 학생 데이터를 입력, 출력, 검색, 수정할 수 있습니다.
  3. 동적 메모리를 활용하여 학생 수를 유연하게 설정합니다.

전체 코드 예제

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 동적 배열 생성 및 해제 함수
int** create_dynamic_array(int rows, int cols);
void free_dynamic_array(int** array, int rows);

// 학생 데이터 출력 함수
void print_student_data(int** data, int rows);

// 학생 데이터 검색 함수
void search_student(int** data, int rows, int student_id);

// 학생 데이터 수정 함수
void update_student(int** data, int rows, int student_id, int math_score, int english_score);

int main() {
    int rows, cols = 3; // 학생 수와 필드 수
    printf("Enter the number of students: ");
    scanf("%d", &rows);

    // 동적 배열 생성
    int** student_data = create_dynamic_array(rows, cols);

    // 데이터 입력
    printf("Enter student data (ID, Math, English):\n");
    for (int i = 0; i < rows; i++) {
        scanf("%d %d %d", &student_data[i][0], &student_data[i][1], &student_data[i][2]);
    }

    // 데이터 출력
    printf("\nInitial Data:\n");
    print_student_data(student_data, rows);

    // 특정 학생 검색
    int search_id;
    printf("\nEnter student ID to search: ");
    scanf("%d", &search_id);
    search_student(student_data, rows, search_id);

    // 특정 학생 수정
    int update_id, new_math, new_english;
    printf("\nEnter student ID to update and new scores (Math English): ");
    scanf("%d %d %d", &update_id, &new_math, &new_english);
    update_student(student_data, rows, update_id, new_math, new_english);

    // 수정 후 데이터 출력
    printf("\nUpdated Data:\n");
    print_student_data(student_data, rows);

    // 메모리 해제
    free_dynamic_array(student_data, rows);

    return 0;
}

// 동적 배열 생성
int** create_dynamic_array(int rows, int cols) {
    int** array = (int**)malloc(rows * sizeof(int*));
    for (int i = 0; i < rows; i++) {
        array[i] = (int*)malloc(cols * sizeof(int));
    }
    return array;
}

// 동적 배열 메모리 해제
void free_dynamic_array(int** array, int rows) {
    for (int i = 0; i < rows; i++) {
        free(array[i]);
    }
    free(array);
}

// 학생 데이터 출력
void print_student_data(int** data, int rows) {
    printf("ID\tMath\tEnglish\n");
    for (int i = 0; i < rows; i++) {
        printf("%d\t%d\t%d\n", data[i][0], data[i][1], data[i][2]);
    }
}

// 학생 데이터 검색
void search_student(int** data, int rows, int student_id) {
    for (int i = 0; i < rows; i++) {
        if (data[i][0] == student_id) {
            printf("Found Student - ID: %d, Math: %d, English: %d\n", 
                   data[i][0], data[i][1], data[i][2]);
            return;
        }
    }
    printf("Student with ID %d not found.\n", student_id);
}

// 학생 데이터 수정
void update_student(int** data, int rows, int student_id, int math_score, int english_score) {
    for (int i = 0; i < rows; i++) {
        if (data[i][0] == student_id) {
            data[i][1] = math_score;
            data[i][2] = english_score;
            printf("Updated Student - ID: %d, Math: %d, English: %d\n", 
                   student_id, math_score, english_score);
            return;
        }
    }
    printf("Student with ID %d not found.\n", student_id);
}

프로그램 실행 흐름

  1. 학생 수를 입력합니다.
  2. 학생 데이터를 입력합니다.
  3. 입력된 데이터를 출력합니다.
  4. 특정 학생을 검색하여 정보를 확인합니다.
  5. 특정 학생의 점수를 수정하고 수정된 데이터를 확인합니다.

결과 예시

Enter the number of students: 3
Enter student data (ID, Math, English):
1 85 90
2 78 82
3 92 88

Initial Data:
ID      Math    English
1       85      90
2       78      82
3       92      88

Enter student ID to search: 2
Found Student - ID: 2, Math: 78, English: 82

Enter student ID to update and new scores (Math English): 2 88 95
Updated Student - ID: 2, Math: 88, English: 95

Updated Data:
ID      Math    English
1       85      90
2       88      95
3       92      88

학습 목표


이 실습을 통해 다차원 배열의 활용, 동적 메모리 관리, 데이터 검색 및 수정 기능을 구현하는 방법을 익힐 수 있습니다. 이를 바탕으로 더욱 복잡한 데이터 관리 프로그램을 작성할 수 있는 기초를 다질 수 있습니다.

요약

이 기사에서는 C 언어의 다차원 배열을 활용해 간단한 데이터베이스를 설계하고 구현하는 방법을 살펴보았습니다. 다차원 배열의 기본 구조와 데이터 저장, 검색, 수정 기능 구현을 다뤘으며, 동적 메모리를 활용한 고급 기능까지 확장했습니다. 실전 예제로 학생 성적 관리 프로그램을 작성하며 실질적인 프로그래밍 스킬을 익혔습니다. 이를 통해 효율적인 데이터 관리 및 프로그래밍 기법을 학습할 수 있습니다.

목차