
배열은 한마디로 '여러 개의 같은 자료형 값을 모아놓은 상자'라고 할 수 있어요.
예를 들어 50명의 시험 점수를 관리한다고 할 때,
50개의 변수를 만들어서 관리 한다면 너무 비효율적이겠죠?
이럴 때 배열을 사용하면 코드가 훨씬 간결하고 깔끔해집니다.
배열은 책장이 여러 칸으로 나눠져 있고, 각 칸에 같은 종류의
책만 꽂을 수 있는 구조라고 생각하면 이해하기 쉬워요.
하나의 배열에는 정수면 정수, 문자열이면 문자열만 담을 수 있어요.
배열은 같은 자료형의 데이터를 순서대로 저장하는 구조입니다.
한 번 만들 때 크기를 정하면, 나중에 늘리거나 줄일 수 없어요.
마치 정해진 책장 크기를 늘리거나 줄일 수 없는 것과 같습니다.
배열의 각 데이터는 0부터 시작하는 인덱스(Index)를 가지고 있어서,
원하는 데이터를 번호로 바로 접근할 수 있습니다.
여기서 인덱스는 0부터 시작한다는 점이 중요합니다!
만약 10개의 요소가 담긴 배열이라면 마지막 인덱스는 9입니다.
배열을 선언하고 크기를 정한 뒤, 값은 나중에 넣는 방법입니다.
// 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로 초기화
이 방법이 훨씬 간결해서 자주 사용됩니다.
괄호{ }안에 값을 넣어주면 C#이 알아서 크기를 계산합니다.
// 만들면서 바로 값 목록을 전달
int[] scores = { 90, 85, 100, 70, 88 };
// new 키워드를 함께 사용하는 것도 가능합니다.
string[] days = new string[] { "월", "화", "수", "목", "금", "토", "일" };
배열의 특정 위치에 있는 값을 사용하고 싶을 때는,
배열이름[인덱스]형식으로 접근하면 됩니다.
[코드]
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
배열의 진정한 힘은 반복문과 만났을 때 진가를 발휘합니다.
배열에 있는 모든 데이터를 하나씩 꺼내서 처리하고 싶을 때 정말 편리하죠.
배열이름.Length속성을 사용하면 배열의 전체 길이를 쉽게 알 수 있어요.
배열을 다루는 전통적인 방법입니다.
인덱스를 직접 제어할 수 있다는 장점이 있어요.
[코드]
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
인덱스가 필요 없고, 배열 안의 요소를 하나씩 순회할 때 유용합니다.
[코드]
string[] languages = { "C#", "Java", "Python", "C++" };
Console.WriteLine("제가 배우고 싶은 프로그래밍 언어는...");
foreach (string lang in languages)
{
Console.WriteLine(lang);
}
[실행 결과]
제가 배우고 싶은 프로그래밍 언어는...
C#
Java
Python
C++
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
가변 배열은 '여러 배열을 담고 있는 배열'입니다.
배열의 길이가 일정하지 않지만, 메모리를 절약해야 할 때 유용합니다.
[코드]
// 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
배열에 담긴 숫자들을 오름차순으로 정렬하거나,
특정 데이터가 몇 번째 위치에 있는지 찾아야 하는 경우를 생각해봅시다.
물론 for문을 열심히 돌려 직접 로직을 만들 수도 있겠죠.
하지만 배열의 크기가 커질수록 코드는 복잡해지고 실수할 가능성도 높아집니다.
우리에겐 더 스마트하고 안정적인 방법이 필요합니다!
C#은 모든 것을 객체로 다루는 강력한 객체 지향 프로그래밍 언어입니다.
이런 특징 덕분에 우리가 사용하는 int[], string[] 같은 모든 배열은
System.Array클래스로부터 상속받은 객체입니다.
우리는 Array클래스의 핵심 메서드를 함께 알아보겠습니다.
이름 그대로 배열 안의 요소들을 순서대로 예쁘게 정렬해 줘요.
마치 책꽂이의 책들을 가나다순으로 정리하는 것과 같죠.
[코드]
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
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
배열의 내용을 지우고 싶을 때가 있습니다. 그럴 때 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
"배열은 한 번 만들면 크기를 바꿀 수 없다면서요?"
사실 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
강아지 고양이
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