[로봇활용_9주차] C# 배열(Array)

최윤호·2025년 9월 30일
post-thumbnail

배열(Array)

배열은 한마디로 '여러 개의 같은 자료형 값을 모아놓은 상자'라고 할 수 있어요.
예를 들어 50명의 시험 점수를 관리한다고 할 때,
50개의 변수를 만들어서 관리 한다면 너무 비효율적이겠죠?
이럴 때 배열을 사용하면 코드가 훨씬 간결하고 깔끔해집니다.

1)배열의 특징

배열은 책장이 여러 칸으로 나눠져 있고, 각 칸에 같은 종류의
책만 꽂을 수 있는 구조라고 생각하면 이해하기 쉬워요.

1. 동일한 데이터 타입

하나의 배열에는 정수면 정수, 문자열이면 문자열만 담을 수 있어요.
배열은 같은 자료형의 데이터를 순서대로 저장하는 구조입니다.

2. 고정된 크기

한 번 만들 때 크기를 정하면, 나중에 늘리거나 줄일 수 없어요.
마치 정해진 책장 크기를 늘리거나 줄일 수 없는 것과 같습니다.

3. 순서가 있는 데이터(인덱스)

배열의 각 데이터는 0부터 시작하는 인덱스(Index)를 가지고 있어서,
원하는 데이터를 번호로 바로 접근할 수 있습니다.
여기서 인덱스는 0부터 시작한다는 점이 중요합니다!
만약 10개의 요소가 담긴 배열이라면 마지막 인덱스는 9입니다.

2)배열을 만드는 방법

1. 선언은 먼저, 값은 나중에

배열을 선언하고 크기를 정한 뒤, 값은 나중에 넣는 방법입니다.

// 1. int형 데이터를 담을 수 있는 scores 배열을 선언
int[] scores;

// 2. new 키워드를 사용해 실제로 5칸짜리 공간을 만들어 할당
scores = new int[5]; // 배열의 모든 요소가 0으로 초기화

// 3. 각 칸(인덱스)에 값을 할당 (인덱스는 0부터 시작합니다.)
scores[0] = 90;
scores[1] = 85;
scores[2] = 100;
scores[3] = 70;
scores[4] = 88;

// 선언과 초기화를 한 줄에 할 수도 있어요.
// string[] days = new string[7]; // 배열의 모든 요소가 null로 초기화

2. 선언과 동시에 초기화

이 방법이 훨씬 간결해서 자주 사용됩니다.
괄호{ }안에 값을 넣어주면 C#이 알아서 크기를 계산합니다.

// 만들면서 바로 값 목록을 전달
int[] scores = { 90, 85, 100, 70, 88 };

// new 키워드를 함께 사용하는 것도 가능합니다.
string[] days = new string[] { "월", "화", "수", "목", "금", "토", "일" };

3)배열의 요소 접근

배열의 특정 위치에 있는 값을 사용하고 싶을 때는,
배열이름[인덱스]형식으로 접근하면 됩니다.

[코드]

int[] scores = { 90, 85, 100, 70, 88 };

// 3번째 학생의 점수(인덱스: 2)를 출력
Console.WriteLine(scores[2]);

// 1번째 학생의 점수(인덱스: 0)를 95점으로 변경
scores[0] = 95;
Console.WriteLine(scores[0]);

[실행 결과]

100
95

4)배열과 반복문의 조합

배열의 진정한 힘은 반복문과 만났을 때 진가를 발휘합니다.
배열에 있는 모든 데이터를 하나씩 꺼내서 처리하고 싶을 때 정말 편리하죠.
배열이름.Length속성을 사용하면 배열의 전체 길이를 쉽게 알 수 있어요.

1. for 문 사용

배열을 다루는 전통적인 방법입니다.
인덱스를 직접 제어할 수 있다는 장점이 있어요.

[코드]

int[] scores = { 90, 85, 100, 70, 88 };
int sum = 0;

for (int i = 0; i < scores.Length; i++)
{
    Console.WriteLine($"{i + 1}번째 학생의 점수: {scores[i]}");
    sum += scores[i];
}

double average = (double)sum / scores.Length;
Console.WriteLine($"총점: {sum}");
Console.WriteLine($"평균: {average}");

[실행 결과]

1번째 학생의 점수: 90
2번째 학생의 점수: 85
3번째 학생의 점수: 100
4번째 학생의 점수: 70
5번째 학생의 점수: 88
총점: 433
평균: 86.6

2. foreach 문 사용

인덱스가 필요 없고, 배열 안의 요소를 하나씩 순회할 때 유용합니다.

[코드]

string[] languages = { "C#", "Java", "Python", "C++" };

Console.WriteLine("제가 배우고 싶은 프로그래밍 언어는...");
foreach (string lang in languages)
{
    Console.WriteLine(lang);
}

[실행 결과]

제가 배우고 싶은 프로그래밍 언어는...
C#
Java
Python
C++

5)다차원 배열 사용

C#에서는 2차원 이상의 배열도 만들 수 있어요.
좌표나 표(행렬) 데이터를 다룰 때 유용합니다.

[코드]

// 2차원 배열 선언과 초기화
int[,] matrix = new int[2, 3]
{
    { 1, 2, 3 }, // 0번 행
    { 4, 5, 6 }  // 1번 행
};

// 다차원 배열은 [행, 열] 번호로 접근합니다.
Console.WriteLine($"matrix[0, 1] = {matrix[0, 1]}");
Console.WriteLine($"matrix[1, 2] = {matrix[1, 2]}");

// 반복문으로 모든 값 출력
for (int i = 0; i < 2; i++) // 행을 순회 (0, 1)
{
    for (int j = 0; j < 3; j++) // 열을 순회 (0, 1, 2)
    {
        Console.Write(matrix[i, j] + " ");
    }
    Console.WriteLine(); // 한 행이 끝나면 줄바꿈
}

[실행 결과]

matrix[0, 1] = 2
matrix[1, 2] = 6
1 2 3
4 5 6

6)가변 배열 사용

가변 배열은 '여러 배열을 담고 있는 배열'입니다.
배열의 길이가 일정하지 않지만, 메모리를 절약해야 할 때 유용합니다.

[코드]

// 3개의 배열을 담을 수 있는 '바깥쪽 배열'을 먼저 선언합니다.
int[][] jaggedArray = new int[3][];

// 이제 각 줄에 해당하는 '안쪽 배열'들을 각각 다른 크기로 만들어 넣어줘요.
jaggedArray[0] = new int[] { 10, 20 };       // 0번 행은 길이가 2
jaggedArray[1] = new int[] { 30, 40, 50 };   // 1번 행은 길이가 3
jaggedArray[2] = new int[] { 60 };           // 2번 행은 길이가 1

// 대괄호를 두 번 써서 '몇 번째 배열의 몇 번째 값'인지 알려줘야 합니다.
int number = jaggedArray[1][2];
Console.WriteLine("가변 배열[1][2]의 값은? " + number);

// 반복문으로 모든 값 출력
for (int i = 0; i < jaggedArray.Length; i++) // 바깥쪽 배열을 순회
{
    for (int j = 0; j < jaggedArray[i].Length; j++) // 안쪽 배열을 순회
    {
        Console.Write(jaggedArray[i][j] + " ");
    }
    Console.WriteLine(); // 한 행이 끝나면 줄바꿈
}

[실행 결과]

가변 배열[1][2]의 값은? 50
10 20
30 40 50
60

7)Array: 배열을 다루는 도구

배열에 담긴 숫자들을 오름차순으로 정렬하거나,
특정 데이터가 몇 번째 위치에 있는지 찾아야 하는 경우를 생각해봅시다.
물론 for문을 열심히 돌려 직접 로직을 만들 수도 있겠죠.
하지만 배열의 크기가 커질수록 코드는 복잡해지고 실수할 가능성도 높아집니다.
우리에겐 더 스마트하고 안정적인 방법이 필요합니다!
C#은 모든 것을 객체로 다루는 강력한 객체 지향 프로그래밍 언어입니다.
이런 특징 덕분에 우리가 사용하는 int[], string[] 같은 모든 배열은
System.Array클래스로부터 상속받은 객체입니다.
우리는 Array클래스의 핵심 메서드를 함께 알아보겠습니다.

1. Array.Sort() - 정렬

이름 그대로 배열 안의 요소들을 순서대로 예쁘게 정렬해 줘요.
마치 책꽂이의 책들을 가나다순으로 정리하는 것과 같죠.

[코드]

int[] scores = { 90, 75, 100, 80, 95 };

Console.WriteLine("--- 정렬 전 ---");
foreach (int score in scores)
{
    Console.Write($"{score} ");
}
Console.WriteLine();

// Array.Sort() 메서드 호출!
Array.Sort(scores);

Console.WriteLine("--- 정렬 후 ---");
foreach (int score in scores)
{
    Console.Write($"{score} ");
}
Console.WriteLine();

[실행 결과]

--- 정렬 전 ---
90 75 100 80 95
--- 정렬 후 ---
75 80 90 95 100

2. Array.IndexOf() - 탐색

IndexOf()는 지정된 값이 처음으로 나타나는 위치의 인덱스를 알려줘요.
만약 값이 배열에 없다면, -1을 돌려줘서 값이 없다는 사실을 알려줍니다.

[코드]

string[] fruits = { "사과", "바나나", "딸기", "포도", "바나나" };

// "딸기"의 위치를 찾습니다.
int index1 = Array.IndexOf(fruits, "딸기");
Console.WriteLine($"딸기의 위치: {index1}");

// "바나나"의 위치를 찾습니다.
int index2 = Array.IndexOf(fruits, "바나나");
Console.WriteLine($"바나나의 위치: {index2}");

// "망고"는 배열에 없으므로 -1을 반환합니다.
int index3 = Array.IndexOf(fruits, "망고");
Console.WriteLine($"망고의 위치: {index3}");

[실행 결과]

딸기의 위치: 2
바나나의 위치: 1
망고의 위치: -1

3. Array.Clear() - 초기화

배열의 내용을 지우고 싶을 때가 있습니다. 그럴 때 Clear()메서드를
호출하면 배열의 특정 구간을 해당 자료형의 기본값으로 초기화합니다.

[코드]

int[] numbers = { 10, 20, 30, 40, 50 };

// 1번 인덱스부터 3개의 요소를 기본값(0)으로 초기화
Array.Clear(numbers, 1, 3);

foreach (int num in numbers)
{
    Console.Write($"{num} ");
}

[실행 결과]

10 0 0 0 50

4. Array.Resize() - 크기 조절

"배열은 한 번 만들면 크기를 바꿀 수 없다면서요?"

사실 Resize()는 기존 배열의 크기를 마법처럼 바꾸는 게 아니에요.
내부적으로는 새로운 크기의 배열을 만들고, 기존 배열의 데이터를
복사해 넣는 방식으로 동작합니다. 우리에게는 크기가 조절되는 것처럼 느껴지죠.
Array.Resize(ref 배열이름, 새로운크기);형태로 사용하며,
ref키워드가 꼭 필요하다는 점을 기억해 주세요!

[코드]

string[] pets = { "강아지", "고양이", "햄스터" };

// 1. 배열 크기를 5로 늘리기
Array.Resize(ref pets, 5);
pets[3] = "고슴도치";
pets[4] = "앵무새";

Console.WriteLine($"늘어난 배열의 길이: {pets.Length}"); // 출력: 5
foreach (string pet in pets)
{
    Console.Write($"{pet} ");
}
Console.WriteLine();

// 2. 배열 크기를 2로 줄이기
// 배열의 크기를 줄이면 잘려 나간 뒤쪽 요소는 더 이상 접근할 수 없습니다.
Array.Resize(ref pets, 2);
Console.WriteLine($"줄어든 배열의 길이: {pets.Length}"); // 출력: 2
foreach (string pet in pets)
{
    Console.Write($"{pet} ");
}

[실행 결과]

늘어난 배열의 길이: 5
강아지 고양이 햄스터 고슴도치 앵무새
줄어든 배열의 길이: 2
강아지 고양이

5. Array.Copy() - 복사

Array.Copy()는 이름 그대로 한 배열의 특정 부분(연속된 요소들)을
다른 배열의 특정 위치로 복사해주는 정적(static) 메서드입니다.

[코드]

// 배열이 저장된 주소만 복사
int[] originalArray = { 1, 2, 3 };
int[] copyArray = originalArray;

Console.Write($"원본 배열: ");
foreach (int array in originalArray)
{
    Console.Write($"{array} ");
}

copyArray[0] = 99;
Console.Write($"\n주소만 복사: ");
foreach (int array in copyArray)
{
    Console.Write($"{array} ");
}

// Array.Copy() 메서드 사용 시 배열의 값을 직접 복사합니다.
int[] sourceArray = { 10, 20, 30 };
int[] destinationArray = new int[3];
// sourceArray의 0번 인덱스부터 destinationArray의 0번 인덱스까지 3개 요소를 복사
Array.Copy(sourceArray, destinationArray, 3);
Console.WriteLine($"\n복사된 배열: {string.Join(" ", destinationArray)}");

[실행 결과]

원본 배열: 1 2 3
주소만 복사: 99 2 3
복사된 배열: 10 20 30
profile
🚀 미래의 엔지니어를 꿈꾸는 훈련생의 기록 📝

0개의 댓글