Skip to main content

Command Palette

Search for a command to run...

Array in C languages

C언어의 배열

Updated
24 min read
Array in C languages

Contents

1️⃣ 배열의 개념 (Overview of Array)
2️⃣ 배열의 선언과 초기화 (Array Declaration and Initialization)
3️⃣ 배열과 함수 (Array and Function)
4️⃣ 2차원 배열 (2D Array)
5️⃣ 행렬(Matrix)


1️⃣ 배열의 개념(Overview of Array)

💡요약: 배열은 "여러 개의 변수를 한 번에 생성할 수 있는 방법" (way to generate multiple variables at once)이다.

💡중요포인트

  • 배열은 한 번에 여러 변수를 관리하기 위한 자료구조이다.

  • 배열 선언 예시: int s[10]; — 이 코드에서는 정수형 변수 10개를 한 번에 생성하였다.

배열을 사용하면 동일한 타입의 변수들을 하나의 이름으로 묶어 관리할 수 있게 된다. 예를 들어, int s[10];이라고 선언하면, 10개의 정수를 저장할 수 있는 공간이 만들어진다.


배열 #1: 필요성 (The Necessity of Arrays)

💡요약: 배열을 사용하면 "여러 개의 변수를 하나의 이름으로 관리" (manage multiple variables under a single name)할 수 있어 코드를 더 깔끔하고 관리하기 쉽게 만들수 있다.

💡중요한 부분

  • 배열은 "동일한 타입의 여러 데이터를 하나의 이름으로 묶어 관리" (group multiple data of the same type under a single name)한다.

  • 배열을 사용하면 데이터를 더 쉽게 접근하고 관리할 수 있게 된다. 예를 들어, s[3]으로 4번째 데이터를 쉽게 호출할 수 있다.

일반 변수로 각각의 변수를 선언하면, 모든 변수에 각각 이름을 붙여야 해서 번거롭고 관리가 어려워진다. 예를 들어, int s0, s1, ..., s9;처럼 각각의 변수를 별도로 선언하면, 이름을 따로 관리해야 한다. 그러나 int s[10];처럼 배열을 사용하면 s[0], s[1], ..., s[9] 형태로 관리할 수 있어 훨씬 편리해진다.


배열 #2: 특징 (Characteristics of Arrays)

배열을 사용하면 "관련된 데이터를 순서대로 관리할 수 있고 메모리 사용이 효율적" (manage related data in sequence and use memory efficiently)이게 된다. 예를 들어, 여러 관련 데이터가 있을 때, 배열로 선언하면 하나의 이름과 인덱스 번호만으로 쉽게 접근할 수 있어 편리하다.

💡요약: 배열은 "메모리 효율과 데이터 접근성을 높이는 구조" (a structure that enhances memory efficiency and data accessibility)로, 여러 데이터 항목을 하나의 이름으로 순서대로 저장하여 쉽게 관리할 수 있게 한다.

💡중요한 부분:

  • 배열은 "메모리의 연속된 공간에 저장" (stored in contiguous memory locations)된다.

  • 배열의 장점은 "관련된 데이터를 한 번에 접근하고 처리하기 쉽다는 점" (easily accessing and processing related data).

  • "배열의 이름 하나와 인덱스 번호로 여러 데이터를 편리하게 관리" (manage multiple data points conveniently with a single array name and index number)할 수 있다.


배열 #3: 선언 (Array Declaration)

💡 요약: 배열을 선언할 때는 "데이터 타입과 크기를 지정하여 여러 데이터를 한 번에 저장할 수 있는 공간" (specifying the data type and size to store multiple data at once)으로 만든다.

💡중요한 부분:

  • 배열 선언은 "데이터 타입, 배열 이름, 그리고 크기" (data type, array name, and size)로 구성된다.

배열을 선언할 때, 먼저 "데이터 타입" (data type)을 지정하고, "배열 이름" (array name)을 정한 후, "요소의 개수" (number of elements)를 대괄호 안에 작성한다. 이를 통해 배열에 몇 개의 데이터를 저장할 수 있을지 미리 정할 수 있게 된다. 예를들어 int scores[10];처럼 배열을 선언하면, 정수형(int) 데이터 10개를 저장할 수 있는 배열이 생성된다.


배열 #4: 원소와 인덱스 (Array Elements and Index)

💡요약: 배열의 각 요소는 "인덱스라는 번호를 통해 개별적으로 접근 가능" (individually accessible via an index number)하며, 인덱스는 0부터 시작하여 배열의 크기-1까지 있다.

💡중요한 부분:

  • "배열의 인덱스는 0부터 시작" (array index starts from 0).

  • 각 배열 요소는 "배열 이름과 인덱스를 통해 접근" (accessed using the array name and index)합니다.

  • 예를 들어, scores[3]은 배열의 네 번째 요소를 의미한다.

배열의 각 요소는 특정 인덱스를 통해 개별적으로 접근할 수 있다. 즉, 배열을 사용할 때는 각 원소의 위치를 나타내는 "인덱스" (index)를 통해 원하는 데이터를 효율적으로 불러올 수 있게 된다.

int scores[5] = {10, 20, 30, 40, 50};
printf("%d", scores[2]); // 출력 결과: 30

위 코드에서 scores[2]는 배열의 세 번째 요소로, 값은 30이다.


배열 #5: 선언의 예시 (Examples of Array Declaration)

💡 요약: 배열은 "특정 타입의 여러 값을 저장할 수 있는 공간" (a space to store multiple values of a specific type)으로, 각 배열의 크기와 데이터 타입을 미리 정의하여 다양한 데이터를 효과적으로 관리할 수 있습니다.

💡중요한 부분:

  • "int형 배열 score[60]" (int array score[60]): 60개의 정수를 저장할 수 있는 배열

  • "float형 배열 cost[12]" (float array cost[12]): 12개의 실수(float)를 저장할 수 있는 배열

  • "char형 배열 name[50]" (char array name[50]): 50개의 문자(char)를 저장할 수 있는 배열

배열은 여러 데이터를 한 번에 저장할 수 있도록 만들어주는 자료 구조이다. 각각의 배열은 데이터 타입과 배열 이름, 그리고 요소의 개수로 선언된다. 예를 들어, int score[60];는 60개의 정수(int)를 저장할 수 있는 배열이라는 뜻이다.

int score[60]; // 60개의 정수 데이터를 저장할 수 있는 배열
float cost[12]; // 12개의 실수 데이터를 저장할 수 있는 배열
char name[50]; // 50개의 문자 데이터를 저장할 수 있는 배열

위 코드에서는 각각 score, cost, name 배열이 다양한 데이터 타입과 크기로 선언되었다.


배열 #6: 선언 시 주의사항 (Cautions for Array Declaration)

💡요약: 배열을 선언할 때 크기는 "변하지 않는 정수 값으로 지정" (specified as a constant integer), 음수나 실수를 사용할 수 없으며, 변수로 배열의 크기를 설정할 수 없습니다.

💡중요한 부분:

  • "배열의 크기는 반드시 상수로 지정" (the array size must be a constant).

  • 배열 크기에 "변수나 음수, 실수 사용 시 오류 발생" (error occurs if variable, negative, or decimal values are used for array size).

배열의 크기는 변하지 않는 정수 값이어야 하며, 변수나 음수, 실수를 배열 크기로 설정하면 컴파일 오류가 발생하게 된다.


배열 #7: 기호 상수 사용 (Using Symbolic Constants)

💡요약: 배열의 크기를 정의할 때 "기호 상수를 사용하면 수정이 용이" (using symbolic constants makes it easy to modify)하여, 프로그램의 다른 부분을 수정할 필요 없이 크기만 바꾸어 활용할 수 있습니다.

💡중요한 부분:

  • "#define 지시자로 기호 상수를 정의하여 배열의 크기 지정" (define array size using symbolic constants with the #define directive).

  • 배열 크기를 쉽게 변경하려면 "기호 상수 값만 바꾸면 됨" (just change the value of the symbolic constant).

배열 크기를 기호 상수로 정의하면, 프로그램의 다른 부분을 수정하지 않고도 배열 크기를 바꾸는 것이 편리해진다. 나중에 배열 크기를 바꾸고 싶다면 SIZE의 값만 변경하면 된다.


배열 #8: 배열 요소 접근 (Accessing Array Elements)

요약: 배열 요소에 값을 저장하거나 가져올 때는 "인덱스를 사용하여 특정 위치에 접근 가능" (able to access a specific position using an index), 인덱스에는 정수 변수나 수식을 사용할 수 있다.

중요한 부분:

  • scores[5] = 80;"scores 배열의 여섯 번째 요소에 80을 저장" (store 80 in the sixth element of the scores array)을 의미한다.

  • scores[i] = 100;에서는 i가 정수 변수이므로, "변수를 사용해 배열의 특정 위치에 값 저장 가능" (possible to store values at a specific position using a variable).

  • scores[i+2] = 100;과 같이 수식을 사용하여 인덱스를 계산할 수도 있다.

배열 요소에 접근할 때는 특정 인덱스를 사용하여 값을 저장하거나 가져올 수 있으며, 인덱스에는 정수 변수를 사용할 수도 있다.


배열 #9: 기초 예제 (Basic Array Example)

💡요약: 배열을 선언하고 초기화한 후 "for 반복문을 사용하여 배열 요소를 순서대로 출력 가능" (can print each element of the array in sequence using a for loop)한다.

💡중요한 부분:

  • 배열 요소에 값을 할당할 때, scores[0] = 10;, scores[1] = 20;과 같이 각각의 인덱스에 접근하여 값을 넣을 수 있다.

  • "for 반복문을 사용하여 배열 요소를 순서대로 처리" (using for loop to process each array element sequentially)할 수 있다.

  • for 반복문 내에서 scores[i]로 접근하여 각 요소의 값을 출력할 수 있다.

배열의 각 요소에 값을 저장한 후, for 반복문을 사용하여 배열에 접근하고 출력할 수 있다.


배열 #10: 기초 예제 (Basic Array Example)

#include <stdio.h>

int main(void)
{
    int i;
    int scores[5];

    scores[0] = 10;
    scores[1] = 20;
    scores[2] = 30;
    scores[3] = 40;
    scores[4] = 50;

    for(i = 0; i < 5; i++)
        printf("scores[%d] = %d\n", i, scores[i]);

    return 0;
}

이 코드에서는 배열 scores에 5개의 값을 할당한 후, for 반복문을 통해 각 요소를 순서대로 출력한다. scores[0]부터 scores[4]까지 각각의 값이 출력된다.


배열 #11: 배열과 반복문 (Arrays and Loops)

💡요약: 배열의 모든 요소를 같은 값으로 초기화할 때 "반복문을 사용하면 편리하고 코드가 간결해짐" (using loops is convenient and makes the code concise).

중요한 부분:

  • 배열의 각 요소를 처리하기 위해 "반복문을 사용하면 코드가 더 간결하고 효율적" (using a loop makes the code simpler and more efficient)이 된다.

  • scores[0] = 0;, scores[1] = 0;와 같은 개별 선언 대신 for 반복문을 사용해 한 번에 모든 요소를 초기화할 수 있다.

위 코드에서는 SIZE를 5로 정의하고, for 반복문을 통해 배열 scores의 각 요소에 0을 할당한다. i가 0에서 시작해 4까지 증가하면서 scores[i] = 0;을 실행하여 모든 요소를 초기화한다. 이를 통해 반복문 없이 각각의 요소를 초기화하는 것보다 훨씬 간편하게 설정할 수 있게 된다.


배열 #12: 예제, 성적 평균 계산하기 (Example: Calculating Average Score)

💡요약: 배열과 반복문을 이용하여 "여러 학생의 성적을 간단히 입력받고 평균을 계산" (easily input multiple students' scores and calculate the average)할 수 있다.

중요한 부분:

  • int scores[STUDENTS];"5개의 성적을 저장할 배열을 선언" (declares an array to store 5 scores)한다.

  • 반복문을 사용하여 "각 학생의 성적을 입력받고 저장" (input and store each student's score)한다.

  • 두 번째 반복문을 사용하여 "모든 성적을 합산하고 평균을 계산" (calculate the sum and average of all scores)한다.

예제 코드 설명:

#include <stdio.h>
#define STUDENTS 5

int main(void)
{
    int scores[STUDENTS];
    int sum = 0;
    int i, average;

    // 학생들의 성적 입력 받기
    for (i = 0; i < STUDENTS; i++)
    {
        printf("학생들의 성적을 입력하세요: ");
        scanf("%d", &scores[i]);
    }

    // 성적 합계 계산
    for (i = 0; i < STUDENTS; i++)
        sum += scores[i];

    // 평균 계산
    average = sum / STUDENTS;
    printf("성적 평균 = %d\n", average);

    return 0;
}

STUDENTS라는 상수를 5로 정의하고, scores 배열을 선언하여 학생 5명의 성적을 입력 받는다. 첫 번째 for 반복문을 통해 각 성적을 입력받고, 두 번째 for 반복문에서 성적의 합을 계산하여 평균을 구한다.


배열 #13: 잘못된 인덱스 문제 (Out of Bounds Index Issue)

💡요약: 배열을 사용할 때는 "인덱스가 배열의 범위를 초과하지 않도록 확인" (ensure that the index does not exceed the array's range)하는 것이 중요하다. 초과하는 인덱스에 접근하면 프로그램에 오류가 발생할 수 있기 때문이다.

중요한 부분:

  • "배열의 크기를 초과하는 인덱스에 접근하지 않도록 주의" (be careful not to access an index beyond the array size)해야 한다.

  • 배열의 인덱스 범위는 항상 "0부터 배열 크기-1까지" (from 0 to array size - 1)이다.

배열의 인덱스 범위를 벗어나 데이터를 저장하거나 읽으려고 하면, 프로그램이 예기치 않은 동작을 할 수 있다. 예를 들어, int scores[5];scores[0]에서 scores[4]까지만 접근할 수 있으며, scores[5]에 접근하면 오류가 발생하게 된다.


배열 #14: 배열 원소의 개수 계산 (Calculating the Number of Elements in an Array)

💡요약: 배열의 전체 크기를 각 요소 크기로 나누면 "배열의 원소 개수를 쉽게 계산할 수 있다" (you can easily calculate the number of elements in an array).

중요한 부분:

  • sizeof(scores)는 배열의 전체 바이트 크기 (total byte size of the array)를 반환한다.

  • sizeof(scores[0])는 배열의 각 요소 크기 (size of each element)를 반환한다.

  • size = sizeof(scores) / sizeof(scores[0]);는 배열의 원소 개수를 계산하는 공식이다.

배열의 전체 크기를 각 요소의 크기로 나누면 배열에 몇 개의 원소가 있는지 알 수 있게 된다. 이를 통해 배열의 길이를 쉽게 계산할 수 있다.

#include <stdio.h>
#define SIZE 5

int main(void)
{
    int i;
    int scores[] = {1, 2, 3, 4, 5, 6}; // 배열 초기화
    int size;

    size = sizeof(scores) / sizeof(scores[0]); // 배열 원소 개수 계산

    for(i = 0; i < size; i++)
        printf("%d ", scores[i]); // 배열 요소 출력

    return 0;
}

이 코드에서 size 변수는 sizeof(scores) / sizeof(scores[0])를 통해 배열 scores의 원소 개수를 자동으로 계산하여 6으로 설정된다. for 반복문을 사용해 scores 배열의 모든 요소를 출력한다.


배열 #15: 복사 (Array Copying)

요약: C 언어에서 배열을 복사할 때는 "반복문을 사용하여 요소를 하나씩 복사" (use a loop to copy each element one by one)해야 한다.

중요한 부분:

  • 배열을 단일 대입문으로 복사할 수 없음 (cannot copy arrays using a single assignment).

  • 배열 복사를 위해 "반복문을 사용하여 각 요소를 개별적으로 복사" (use a loop to copy each element individually)해야 한다.

위의 코드에서 for 반복문을 통해 a 배열의 각 요소가 b 배열로 복사되게 된다. a = b;와 같은 단일 대입문으로는 배열 복사가 불가능하므로, 반복문을 통해 각 요소를 개별적으로 복사하는 방법을 사용해야 한다.


배열 #16: 배열의 비교 (Array Comparison)

💡요약: 배열의 내용을 비교하려면 "각 요소를 개별적으로 비교해야 함" (compare each element individually)으로, if (a == b)는 배열 비교에 사용될 수 없다.

중요한 부분:

  • if (a == b)는 배열의 내용이 아닌 주소 (compares addresses, not contents)를 비교g한다.

  • 배열의 각 요소를 하나씩 비교해야 "올바른 배열 비교" (correct array comparison)를 할 수 있게 된다.

#include <stdio.h>
#define SIZE 5

int main(void)
{
    int i;
    int a[SIZE] = {1,2,3,4,5};
    int b[SIZE] = {1,2,3,4,5};

//올바르지 않은 배열 비교
    if (a == b)
      printf("잘못된 결과입니다.\n");
    else
      printf("잘못된 결과입니다.\n");

    return 0;
}


배열 #17: 배열의 비교 (Array Comparison)

요약: 배열 비교는 "각 요소를 하나씩 비교하여 동일한지 확인해야 함" (each element should be compared individually to verify equality).

중요한 부분:

  • for 반복문을 사용해 배열의 각 요소를 비교 (use a loop to compare each element in the array).

  • 만약 하나라도 다른 요소가 있으면 즉시 "배열이 같지 않다" (arrays are not the same)고 출력하고 종료한다.

#include <stdio.h>
#define SIZE 5

int a[SIZE] = {1, 2, 3, 4, 5};
int b[SIZE] = {1, 2, 3, 4, 5};

int main(void)
{
    int i;  // 반복문 내에서 사용할 변수 선언

    for (i = 0; i < SIZE; i++) 
    {
        if (a[i] != b[i]) 
        {
            printf("a와 b는 같지 않습니다.\n");
            return 0;  // 프로그램 종료
        }
    }

    // 배열이 모두 같은 경우
    printf("a와 b는 같습니다.\n");
    return 0;  // 프로그램 정상 종료
}

이 코드에서 for 반복문을 통해 배열 ab의 각 요소를 하나씩 비교하였다. 만약 a[i]b[i]와 다르면 "a[]와 b[]는 같지 않습니다."라는 메시지를 출력하고 프로그램이 종료된다. 모든 요소가 같으면 마지막에 "a[]와 b[]는 같습니다."라는 메시지를 출력하게 된다.


중간 점검 (Midpoint Check)

  1. 독립적인 여러 개의 변수 대신에 배열을 사용하는 이유는 무엇인가?

    • 독립적인 여러 개의 변수 대신 배열을 사용하는 이유는 "데이터를 하나의 이름으로 쉽게 관리" (easily manage data under a single name)하기 위해서 이다.
  2. n개의 원소를 가지는 배열의 경우, 첫 번째 원소의 번호는 무엇인가?

    • n개의 원소를 가지는 배열의 경우, 첫 번째 원소의 번호는 항상 0이다.
  3. n개의 원소를 가지는 배열의 경우, 마지막 원소의 번호는 무엇인가?

    • n개의 원소를 가지는 배열의 경우, 마지막 원소의 번호는 n-1이다.
  4. 배열 원소의 번호 혹은 위치를 무엇이라고 하는가?

    • 배열 원소의 **번호 혹은 위치를 "인덱스" (index)라고 한다.
  5. 배열의 크기보다 더 큰 인덱스를 사용하면 어떻게 되는가?

    • 배열의 크기보다 더 큰 인덱스를 사용하면 "프로그램 오류" (program error)가 발생할 수 있다.
  6. 배열의 크기를 나타낼 때 변수를 사용할 수 있는가?

    • 배열의 크기를 나타낼 때는 변수를 사용할 수 없다. "상수만 사용 가능" (only constants are allowed)하다.

2️⃣ 배열의 선언과 초기화 (Array Declaration and Initialization)

💡요약: 배열을 선언할 때 "초기값을 중괄호 { } 안에 넣어 배열을 쉽게 초기화" (initialize the array easily by putting initial values inside { })할 수 있다.

중요한 부분:

  • 배열 초기화 시 "중괄호 { } 안에 초기값들을 나열" (list initial values inside { })한다.

  • 각 값은 "콤마로 구분" (separated by commas)된다.

  • 초기값을 지정하지 않으면, 배열 요소는 "예기치 않은 값" (undefined values)을 가질 수 있다.

배열을 선언하면서 각 요소에 초기값을 지정할 수 있다.

int scores[5] = {10, 20, 30, 40, 50}; // 배열 scores의 각 요소에 초기값을 지정

위의 코드대로 선언하면, scores[0]부터 scores[4]까지 순서대로 초기값이 들어게 된다.


배열의 선언과 초기화 #1 (Array Declaration and Initialization)

💡요약: 배열 선언 시 크기를 생략하고 초기값만 제공하면 "컴파일러가 자동으로 배열 크기를 설정" (compiler automatically sets the array size)하여 초기값의 개수만큼 배열이 생성된다.

배열 크기를 지정하지 않아도 초기값을 나열하면, 컴파일러가 해당 초기값의 개수를 기준으로 배열 크기를 자동으로 설정하게 된다.

int scores[] = {10, 20, 30, 40, 50}; // 초기값의 개수 5에 따라 배열 크기 자동 설정

위의 예제는 초기값 5개를 포함하므로, scores 배열의 크기가 5로 설정되게 된다.


배열의 선언과 초기화 #2 (Array Declaration and Initialization)

C 언어에서 배열을 초기화할 때, 초기값의 개수가 배열의 요소 개수보다 적다면 초기값을 지정한 부분까지만 초기화되고, 나머지 요소들은 자동으로 0으로 초기화된다.

int array[10] = {1, 2, 3};

위 코드는 array라는 이름의 정수 배열을 선언하고, 처음 세 개의 값만 초기화한다. 나머지 요소들은 자동으로 0으로 채워지게 된다. 배열의 값은 아래와 같다.

array = {1, 2, 3, 0, 0, 0, 0, 0, 0, 0}

배열 초기화: 초기값을 주지 않았다면? (What if No Initial Values are Given?)

요약: 배열을 선언할 때 초기값을 지정하지 않으면 "쓰레기 값이 저장되므로, 반드시 필요한 경우 초기값을 설정해야 함" (garbage values are stored, so it’s best to initialize if needed).

중요한 부분:

  • 지역 변수로 선언된 배열에 초기값을 주지 않으면 "쓰레기 값이 자동으로 채워진다" (garbage values are automatically filled).

  • 쓰레기 값은 "아무 의미가 없는 데이터" (data with no meaning)로, 예기치 않은 결과를 초래할 수 있다.

지역 변수로 선언한 배열은 초기값을 지정하지 않으면 쓰레기 값을 가지게 되어, 이 값을 사용할 경우 잘못된 결과가 발생할 수 있다. 따라서 초기값이 필요한 경우에는 명시적으로 값을 지정해주는 것이 좋다.

int main(void)
{
    int scores[5]; // 초기값이 지정되지 않아 쓰레기 값이 저장됨
    // scores 배열의 각 요소는 예측할 수 없는 값이 들어 있음
}

이 코드에서 scores 배열은 초기값을 지정하지 않았기 때문에 쓰레기 값을 가지며, 예기치 않은 값들이 배열 요소에 저장될 수 있다.


경고: 배열 초기화 오류 (Warning: Array Initialization Error)

배열의 모든 요소를 "같은 값으로 초기화" (initialize all elements with the same value)하려고 할 때, { 10 }과 같이 작성하면 오류가 발생한다. 아래 코드처럼 작성하면, 첫 번째 요소만 10이 되고 나머지 요소는 **0**으로 초기화된다.

만약 모든 요소를 10으로 초기화하고 싶다면, 반복문을 사용해야한다. 결론적으로 배열의 모든 요소를 동일한 값으로 초기화할 때는 "반복문을 사용해야 정확한 결과를 얻을 수 있다" (use a loop to initialize all elements with the same value correctly).


배열 초기화 #3 : 예제 (Array Initialization Example)

💡요약: 배열을 선언할 때 "초기값을 설정하면 코드가 간단해지고, 반복문을 사용하여 각 요소에 쉽게 접근" (initializing values makes the code simpler and allows easy access to each element with a loop)할 수 있다.

중요한 부분:

  • int scores[SIZE] = {31, 63, 62, 87, 14};과 같이 "배열 선언과 동시에 초기값을 설정" (initialize values at the time of array declaration)할 수 있다.

  • for 반복문을 사용하여 "배열의 각 요소를 출력" (print each element of the array)할 수 있다.

예제 코드 설명:

#include <stdio.h>
#define SIZE 5

int main(void)
{
    int i;
    int scores[SIZE] = {31, 63, 62, 87, 14}; // 배열을 초기화하여 각 요소에 값 설정

    for(i = 0; i < SIZE; i++)
        printf("scores[%d] = %d\n", i, scores[i]); // 각 요소 출력

    return 0;
}

이 코드에서는 scores 배열이 {31, 63, 62, 87, 14}로 초기화되어, 각 요소는 순서대로 값을 가진다.. for 반복문을 사용해 scores 배열의 모든 요소를 출력하며, scores[0]부터 scores[4]까지 각각의 값이 차례대로 표시되었다.


초기화 예제 #4: (Array Initialization Example)

#include <stdio.h>
#define SIZE 5

int main(void)
{
    int i;
    int scores[SIZE] = {31, 63}; // 배열을 초기화하여 각 요소에 값 설정

    for(i = 0; i < SIZE; i++)
        printf("scores[%d] = %d\n", i, scores[i]); // 각 요소 출력

    return 0;
}

배열을 선언할 때 모든 요소에 초기값을 지정하지 않으면, 지정된 값 외의 나머지 요소는 자동으로 0으로 초기화된다. 이 코드는 배열의 첫 두 요소는 3163으로 초기화되고, 나머지 요소는 0이 되는데 배열 크기를 초과하지만 않으면 “부분 초기화(partial initialization)” 가 가능하다.


초기화 예제 #5: (Array Initialization Example)

#include <stdio.h>
#define SIZE 5

int main(void)
{
    int i;
    int scores[SIZE] = {31, 63}; // 배열을 초기화하여 각 요소에 값 설정

    for(i = 0; i < SIZE; i++)
        printf("scores[%d] = %d\n", i, scores[i]); // 각 요소 출력

    return 0;
}

배열 scores를 선언했지만 초기값을 설정하지 않아서, 각 요소에는 "쓰레기 값" (garbage values)이 저장었다. 이 값들은 메모리에 남아 있던 이전 데이터로, 예측할 수 없는 값이다.이러한 값들은 프로그램의 예기치 않은 동작을 일으킬 수 있으므로 초기화가 중요하다.


3️⃣ 배열과 함수 (Array and Function)

💡요약: 배열은 함수에 전달될 때 사본이 아닌 원본이 전달된다.

✅배열의 전달 방식

  • 일반 변수와 달리, 배열을 함수에 넘길 때는 배열 전체가 복사되지 않는다. 대신 배열의 메모리 주소가 전달된다. 이를 통해 배열의 데이터를 그대로 사용하거나 수정할 수 있게된다.

✅예제 코드 설명

  • int main(void)에서 get_average라는 함수를 호출하고 있다. 여기서 get_average 함수로 배열과 배열의 크기를 인자로 넘겨준다.

  • get_average 함수에서는 배열의 각 원소를 사용하여 합계를 구하거나 평균을 계산할 수 있다. 이 때 배열은 원본이기 때문에, 함수 내에서 배열의 값을 수정하면 원본 배열에도 영향을 미친다.

배열의 원본 전달 장점과 주의점

  • 장점: 배열이 큰 경우, 사본을 만들지 않아 메모리와 시간을 절약할 수 있다.

    주의: 함수 내에서 배열을 수정하면 원래 배열 값이 변경될 수 있으므로, 의도하지 않은 변경에 주의해야 한다.


배열과 함수 #1 : 예제 (Example of Arrays and Functions)

💡요약: 배열을 함수에 전달할 때, 배열의 원본 주소가 전달되므로 함수 내에서 원본 값을 참조하거나 변경할 수 있다.

코드 설명

  1. #include <stdio.h>: 표준 입출력 라이브러리를 포함한다.

  2. #define STUDENTS 5: 상수 STUDENTS를 정의하고 그 값을 5로 설정하여, 학생 수를 나타낸다.

  3. int get_average(int scores[], int n);: get_average라는 함수의 프로토타입을 선언한다. 이 함수는 배열과 배열의 크기를 받아 평균을 계산하게 된다.

  4. int main(void): 메인 함수가 시작된다.

  5. int scores[STUDENTS] = {1, 2, 3, 4, 5};: 학생들의 점수를 저장하는 배열을 정의하고 초기화한다.

  6. int avg;: 평균을 저장할 변수를 선언한다.

  7. avg = get_average(scores, STUDENTS);: get_average 함수를 호출하면서 scores 배열과 학생 수를 전달하여 평균을 계산하고, 그 결과를 avg에 저장한다.

  8. printf("평균은 %d입니다.\n", avg);: 계산된 평균을 출력한다.

  9. return 0;: 프로그램을 종료한다.

함수 설명

  • int get_average(int scores[], int n): 배열 scores와 그 크기 n을 입력받아 평균을 반환하는 함수이다.

  • int i; int sum = 0;: 반복문과 합계를 저장할 변수를 선언하고 초기화한다.

  • for(i = 0; i < n; i++) sum += scores[i];: 반복문을 사용하여 배열의 모든 요소를 sum에 더한다.

  • return sum / n;: 총합을 학생 수로 나누어 평균을 반환한다


배열과 함수 #2 : 예제 (Example of Arrays and Functions)

💡요약: 배열을 함수의 인수로 전달할 때 배열의 주소(Address)가 전달된다. 이는 배열 전체를 복사하는 대신 원본 배열에 접근(Accessing the original array)하게 되는 방식이다. 이 예제에서는 modify_array 함수가 배열의 값을 변경하고, print_array 함수가 배열의 값을 출력하는 기능을 한다.

#include <stdio.h>
#define SIZE 7

void modify_array(int a[], int size);
void print_array(int a[], int size);

int main(void) 
{
  int list[SIZE] = {1, 2, 3, 4, 5, 6, 7};

  print_array(list, SIZE);
  modify_array(list, SIZE);
  print_array(list, SIZE);

  return 0;
}

void modify_array(int a[], int size)
{
  int i;

  for(i = 0; i < size; i++)
        ++a[i];
}

void print_array(int a[], int size)
{
  int i;

  for(i = 0; i < size; i++)
        printf("%3d", a[i]);
  printf("\n");
}

  1. void modify_array(int a[], int size);

    • modify_array 함수의 선언부로, 배열을 받아 값을 수정한다. (Declares the modify_array function which takes an array and modifies its values)
  2. void print_array(int a[], int size);

    • print_array 함수의 선언부로, 배열을 받아 출력을 담당한다. (Declares the print_array function which takes an array and prints its values)
  3. int main(void)

    • 메인 함수가 시작된다. (Begins the main function)
  4. int list[SIZE] = {1, 2, 3, 4, 5, 6, 7};

    • list라는 이름의 배열을 선언하고 초기값을 설정한다. (Declares an array called list with initial values)
  5. print_array(list, SIZE);

    • 배열의 초기 상태를 출력한다. (Prints the initial state of the array)
  6. modify_array(list, SIZE);

    • 배열의 각 요소를 변경하는 함수이다. (Calls the function to modify each element of the array)
  7. print_array(list, SIZE);

    • 변경된 배열을 다시 출력한다. (Prints the modified state of the array)
  8. return 0;

    • 프로그램 종료. (Ends the program)

modify_array 함수 설명

  • for(i = 0; i < size; i++) ++a[i];

    • 배열의 각 요소를 1씩 증가시킨다. (Increases each element of the array by 1)

print_array 함수 설명

  • for(i = 0; i < size; i++) printf("%3d ", a[i]); printf("\n");

    • 배열의 각 요소를 출력한다. (Prints each element of the array)

배열과 함수 #3: 원본 배열의 변경을 금지하는 방법 (How to Prevent Modifications to the Original Array)

💡요약: const를 사용하여 배열을 함수에 전달하면, 함수 내부에서 배열의 값을 수정하는 것이 금지된다. 이를 통해 원본 배열의 내용을 보호할 수 있게 된다.

void print_array(const int a[], int size)

  • const 키워드를 통해 배열 a가 함수 내에서 변경 불가능(non-modifiable)하도록 선언한다.

a[0] = 100;

  • const로 선언된 배열 a의 값을 수정하려고 시도한다. 컴파일 오류 발생(Compiler error)하게 된다. 이는 const로 선언된 배열의 값을 수정할 수 없기 때문이다.

중간 점검 (Midpoint Check)

  1. 배열을 함수로 전달하면 원본이 전달되는가? 아니면 복사본이 전달되는가?

    • C언어에서는 배열을 함수에 전달할 때 원본의 주소(address of the original array)가 전달된다. 따라서 함수 내에서 배열을 수정하면 원본 배열도 함께 수정된다.
  2. 함수가 전달받은 배열을 변경하지 못하게 하려면 어떻게 해야 하는가?

    • const 키워드를 사용하여 함수 인수를 선언하면 된다. const를 사용하면 함수 내에서 배열의 요소를 변경하려고 할 때 컴파일 오류가 발생하여 원본 배열을 보호할 수 있게된다.

4️⃣ 2차원 배열 (2D Array)

💡요약:

  • 2차원 배열은 행과 열로 구성된 데이터 구조이다.

  • 디지털 이미지, 성적표 등에서 데이터를 구조적으로 표현하는 데 유용하다.

  • 각 요소는 행(row)과 열(column) 위치로 접근할 수 있다.

  • 왼쪽 상단의 이미지는 디지털 이미지를 2차원 배열로 나타낸 예시로, 각 픽셀의 밝기 값이 배열로 표현된 것을 보여준다.

  • 오른쪽 상단의 표는 픽셀 값 배열을 숫자로 나타낸 것으로, 이미지의 각 칸에 숫자가 저장되어 있는 형태이다.

  • 아래쪽 표는 학생들의 점수를 행과 열로 구성한 성적표로, 각 학생의 과목별 점수가 2차원 배열로 저장된 예를 보여준다.


2차원 배열 #1: 예제 (Example of 2D Array)

💡요약:

  • 배열은 여러 차원으로 확장할 수 있으며, 차원이 늘어날수록 데이터 구조가 복잡해집니다.

  • 2차원 배열은 행과 열로 구성되어 데이터를 구조화하여 저장할 수 있습니다.

  • int s[3][5]; 배열의 경우, 3개의 행과 5개의 열을 가지고 각 요소에 행과 열의 인덱스를 통해 접근할 수 있습니다.

2차원 배열의 예로 int s[3][5];가 있다. 이 배열은 3행과 5열로 구성된다. 각 행과 열의 위치에 따라 요소를 접근할 수 있으며, 예를 들어 s[0][0]은 첫 번째 행의 첫 번째 요소를 가리킨다.

  • int s[10]; - 1차원 배열로, 단일 행 안에 10개의 요소가 있는 배열이다.

  • int s[3][10]; - 2차원 배열로, 3개의 행과 10개의 열로 이루어져 있다. 열은 10개의 개수를 가지고 있다.

  • int s[5][3][10]; - 3차원 배열로, 5개의 그룹이 있으며, 각 그룹에 3개의 행과 10개의 열이 있다.


2차원 배열 #2: 인덱스 (Index in 2D Array)

💡요약:

  • 2차원 배열에서는 행과 열을 사용하여 요소에 접근한다.

  • s[1][2] = 0;은 배열 s의 1행 2열 위치에 0을 저장하는 코드이다.

  • s[1][2]: 배열에서 첫 번째 괄호는 행(row)을, 두 번째 괄호는 열(column)을 나타낸다. 따라서 s[1][2]는 1행 2열에 위치한 요소이다.

  • s[1][2] = 0;: 이 코드는 배열 s의 1행 2열 위치에 있는 요소의 값을 0으로 설정한다는 뜻이다.


2차원 배열 #3: 활용 (Using 2D Arrays)

💡요약:

  • 아래 코드는 2차원 배열을 사용하여 난수로 채워진 행렬을 생성하고 출력하는 예제이다.

초기 설정:

  • #define ROWS 3#define COLS 5행과 열의 개수를 정의한다. 이 예제에서는 배열이 3행과 5열로 구성된다.

  • int s[ROWS][COLS];로 3x5 크기의 2차원 배열 s를 선언한다.

✅난수 초기화:

  • srand((unsigned)time(NULL));난수 생성기를 초기화한다. 이 부분은 매번 다른 난수를 생성하도록 설정한다.

  • 첫 번째 for 루프는 배열의 모든 요소를 난수로 초기화한다. rand() % 100을 사용하여 0에서 99 사이의 난수를 각 배열 요소에 할당한다.

출력:

  • 두 번째 for 루프는 2차원 배열의 모든 요소를 형식에 맞게 출력한다. printf(" %02d", s[i][j]);는 각 요소를 두 자리 수 형식으로 출력하며, "\n"은 각 행이 끝날 때 줄바꿈을 추가한다.

💡srand((unsigned)time(NULL));는 난수 생성기 초기화 코드이다.

이 코드의 역할은 프로그램을 실행할 때마다 다른 난수를 생성하기 위해 현재 시간을 기반으로 난수 생성기를 초기화하는 것이다.

  • time(NULL): 현재 시간을 초 단위로 반환한다.

  • (unsigned)time(NULL): 반환된 시간을 unsigned 형식으로 변환한다.

  • srand: 난수 생성기 시드를 설정한다. srand에 다른 값을 전달함으로써 프로그램이 항상 다른 난수 시퀀스를 생성하게 된다.

이 코드를 외워두면 C 언어에서 난수를 반복적으로 생성할 때 유용하게 사용할 수 있다.


2차원 배열 #4: 초기화 (2D Array Initialization)

💡요약: 2차원 배열을 초기화할 때, 각 행의 값을 중괄호 {}로 묶어서 행별로 나열한다. 배열의 각 요소는 [행][열] 형식으로 접근할 수 있다.

int s[3][5] = {
    { 0, 1, 2, 3, 4 },    // 첫 번째 행의 원소들
    { 10, 11, 12, 13, 14 }, // 두 번째 행의 원소들
    { 20, 21, 22, 23, 24 }  // 세 번째 행의 원소들
};

코드에서 int s[3][5]는 3행 5열 크기의 2차원 배열을 의미하며, 이 배열의 각 행을 초기화하고 있다.

위의 이미지는 배열의 구조를 시각적으로 나타내어, 각 행과 열의 위치에 초기화된 값들이 어떻게 저장되는지 보여주고 있다. 예를 들어, s[1][2]의 값은 12이며, 배열의 두 번째 행의 세 번째 열에 위치하게 된다.


2차원 배열 #5: 초기화 (2D Array Initialization)

💡요약: 2차원 배열의 행 크기는 생략 가능하며, 초기화된 값에 따라 자동으로 설정된다. 각 행을 중괄호 {}로 묶어 배열의 초기 값을 지정한다. 각 원소는 [행][열]의 형태로 접근한다.

int s[][5] = {
    0, 1, 2, 3, 4, 
    10, 11, 12, 13, 14, 
    20, 21, 22, 23, 24
};
  • int s[][5]은 5개의 열을 가진 2차원 배열을 선언한다.

  • 배열의 값을 중괄호 {} 안에 나열하여 각 열에 맞추어 초기화한다.

  • s[0][0]0, s[1][0]10, s[2][0]20과 같이, 첫 번째 인덱스는 행을 나타내고 두 번째 인덱스는 열을 나타낸다.


2차원 배열 #6: 예제 (Example of 2D array)

#include <stdio.h>
#define ROWS 3
#define COLS 5

int main(void)
{
  int a[ROWS][COLS] = {{87, 98, 80, 76, 3},
  {99, 89, 90, 90, 0},
  {65, 68, 50, 48, 0}
  };

  int i;

  for(i=0; i<ROWS; i++) {
      double final_scores = a[i][0] * 0.3 + a[i][1] * 0.4 + a[i][2] * 0.2 + a[i][3] * 0.1 - a[i][4];
      printf("학생 #%i의 최종성적 = %10.2f\n", i + 1, final_scores);
  }
  return 0;
}

✅ 배열 선언 및 초기화: a[ROWS][COLS]

2차원 배열을 선언하고 각 학생의 성적 데이터를 초기화한다. 각 행이 한 학생의 성적을 나타낸다.

성적 계산 루프: for 문을 사용하여 각 학생의 최종 성적을 계산한다. 성적 계산에는 각각의 성적이 가중치로 곱해져 더해지며, 결석 횟수에 따른 감점도 포함된다.

최종 성적 출력: 각 학생의 최종 성적은 printf 함수를 통해 화면에 출력된다.


5️⃣ 행렬(Matrix)

행렬은 수학에서 자연과학의 여러 문제를 해결하는 데 사용되는 중요한 개념이다. 행렬은 숫자를 행과 열로 구성된 2차원 배열 형태로 표현한 것이다. 이와 같은 행렬 표현을 통해 수학적 연산을 쉽게 처리할 수 있게 된다.

  • 행렬 A: 3x3 크기의 행렬로, 각 요소는 간단한 숫자로 구성되어 있다.

  • 행렬 B: 더 큰 크기의 행렬로, 대부분이 0으로 채워져 있으며, 특정 위치에만 숫자가 있는 형태이다.

이와 같은 행렬은 다양한 과학적 계산, 물리적 문제, 데이터 변환 등에서 사용되며, 특히 2차원 배열을 통해 컴퓨터에서 쉽게 표현되고 연산된다.


행렬 #1: 다차원 배열을 이용

(Matrix Representation Using Multi-dimensional Arrays)

💡요약: 이 코드는 3x3 크기의 두 행렬 A와 B를 더하여 결과를 행렬 C에 저장하고 출력하는 예제이다. 중첩 for 루프를 이용하여 각 요소를 더한 결과를 계산한다. 행렬 연산을 이해하는데 유용한 예제이다.

  • #include <stdio.h>: 표준 입출력 라이브러리를 포함한다.

  • #define ROWS 3#define COLS 3: 행렬의 행(Row)과 열(Col)의 크기를 정의한다. 이 코드에서는 3x3 크기의 행렬을 사용한다.

  • int main(void): 프로그램의 시작 지점이다.

  • 행렬 A와 B를 초기화:

      int A[ROWS][COLS] = { { 2,3,0 }, { 8,9,1 }, { 7,0,5 } };
      int B[ROWS][COLS] = { { 1,0,0 }, { 1,0,0 }, { 1,0,0 } };
    
    • A 행렬B 행렬을 2차원 배열로 정의하고 초기화한다.
  • int C[ROWS][COLS];: 두 행렬의 합을 저장할 C 행렬을 선언하였다.

중첩된 for 루프를 사용하여 행렬 A와 B의 같은 위치에 있는 요소를 더하여 행렬 C에 저장한다.

행렬 C를 출력하여 행렬 A와 B의 합을 확인한다.


행렬 #2: 2차원 배열을 함수로 전달하기 (Passing a 2D Array to a Function)

💡요약: 2차원 배열을 함수에 전달하려면 배열의 크기를 정의해야 한다. 총 매출 계산을 위해 2중 루프를 사용하여 배열의 모든 요소를 합산한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

#define YEARS 3
#define PRODUCTS 5

int sum(int scores[YEARS][PRODUCTS]);

int main(void) {
    int sales[YEARS][PRODUCTS] = { {1, 2, 3, 4, 5}, {4, 5, 6, 7, 8}, {7, 8, 9, 10, 11} };
    int total_sale;

    total_sale = sum(sales);
    printf("총 매출은 %d입니다.\n", total_sale);

    return 0;
}

int sum(int scores[YEARS][PRODUCTS]) {
    int y, p;
    int total = 0;

    for (y = 0; y < YEARS; y++) {
        for (p = 0; p < PRODUCTS; p++) {
            total += scores[y][p];
        }
    }

    return total;
}
  1. 매크로 정의 (#define)
    YEARSPRODUCTS 매크로를 정의하여 배열의 행과 열 크기를 지정한다.

  2. 함수 선언 (int sum(...))
    sum 함수는 2차원 배열을 인수로 받아 총합을 반환하는 역할을 한다.

  3. main 함수

    • sales 배열에 연도별 제품 매출 데이터를 초기화한다.

    • sum 함수를 호출하여 sales 배열의 모든 요소를 합산하고 total_sale에 저장한다.

    • printf 함수를 이용해 총 매출을 출력한다.

  4. sum 함수

    • for 루프를 사용해 2차원 배열의 모든 요소를 반복하며 total 변수에 더한다.

    • total의 최종 값을 반환한다.

이 코드는 3년 동안의 제품 매출을 합산하여 총 매출은 90입니다.라는 결과를 출력하게 된다.

—-