1. 소개
배열로 보통 뭘 하고 싶어?
기본적인 연산들을 한번 쭉 적어보자:
- 인덱스로 배열 요소 읽기와 수정하기.
- 값으로 요소 찾기.
- 배열 복사, "슬라이스"(배열의 일부) 만들기.
- 배열 정렬하기.
- 배열 뒤집기(Reverse).
- 배열을 값으로 채우기.
- 요소가 있는지 확인(배열에 특정 값이 있는지).
- 길이 변경(resize).
실제 문제 풀 때 이런 거 자주 만나 — 예를 들어, “합계가 4000 이상인 게 있냐?”, “1000 이하인 첫 번째 가격 찾아줘”, “가격을 오름차순으로 정렬해줘” 이런 거 말이지.
이런 거 다 함수로 할 수 있어
| 연산 | 메서드 / 문법 | 특징 |
|---|---|---|
| 인덱스로 수정 | |
범위 벗어나면 에러 |
| 값 찾기 | |
못 찾으면 -1 |
| 존재 확인 | |
람다나 함수 써야 함 |
| 정렬 | |
배열이 바로 바뀜 |
| 뒤집기 | |
요소 순서 바뀜 |
| 복사 | |
얕은 복사 |
| 채우기 | |
한 값으로 다 채움 |
| 크기 변경 | |
새 요소는 default |
| 최대/최소 찾기 | |
Linq 필요함 |
2. 인덱스로 요소 읽기와 수정
이건 이미 해봤겠지만, 간단한 예제로 다시 한번 확인해보자(예를 들어, 점수 배열이 있다고 치자):
// 학생 점수 배열
int[] grades = { 4, 3, 5, 2, 5 };
// 첫 번째 점수 읽기
int firstGrade = grades[0];
Console.WriteLine($"첫 번째 점수: {firstGrade}");
// 마지막 점수를 "최고"(5)로 바꾸기
grades[^1] = 5;
Console.WriteLine("수정된 마지막 점수: " + grades[^1]);
여기서 중요한 건: 인덱스는 0부터 시작하고, 없는 인덱스에 접근하면 IndexOutOfRangeException 에러가 나 — 면접에서도 자주 물어보고, 실전에서도 자주 나오는 실수야.
3. 배열에서 요소 찾기
배열에서 요소를 찾아서 인덱스를 반환해주는 함수가 두 개 있어.
Array.IndexOf(value [, from]) 함수
Array.IndexOf 함수는 배열의 처음부터 원하는 요소를 찾아. 찾으면 그 인덱스를 반환하고, 못 찾으면 -1을 반환해.
근데 만약 배열에 같은 값이 여러 번 있으면, 다음 위치도 찾고 싶을 수 있잖아? 그럴 땐 Array.IndexOf 함수에 두 번째 파라미터로 시작 인덱스를 넘겨주면 돼. 이건 마지막으로 찾은 인덱스 + 1이야.
배열에서 2라는 숫자가 어디 있는지 전부 찾아보자:
int[] grades = { 4, 3, 5, 2, 5, 2 };
int x = 2; // 찾을 요소
int index = Array.IndexOf(grades, x);
while (index != -1)
{
Console.WriteLine($"요소 {x}는 위치: {index}에서 찾았어");
// 다음 인덱스는 index + 1부터 다시 찾기
index = Array.IndexOf(grades, x, index + 1);
}
Array.LastIndexOf(value [, from]) 함수
Array.LastIndexOf 함수는 배열의 끝에서부터 원하는 요소를 찾아. 찾으면 인덱스를 반환하고, 못 찾으면 -1을 반환해. 나머지는 Array.IndexOf랑 똑같아.
이번엔 2라는 숫자를 끝에서부터 전부 찾아보자:
int[] grades = { 4, 3, 5, 2, 5, 2 };
int x = 2; // 찾을 요소
int index = Array.LastIndexOf(grades, x);
while (index != -1)
{
Console.WriteLine($"요소 {x}는 위치: {index}에서 찾았어");
// 다음 인덱스는 이전 위치 - 1부터 다시 찾기
index = Array.LastIndexOf(grades, x, index - 1);
}
4. 배열에 요소가 있는지 확인
배열에 특정 값이 있는지 확인하려면 Contains 함수를 써. 이 메서드는 배열에 그 값이 있으면 true를 반환해. 이걸 쓰려면 System.Linq 모듈을 꼭 추가해야 해. 예시:
using System.Linq; // using System.Linq; 꼭 추가해
bool hasExcellent = grades.Contains(5);
Console.WriteLine($"5점이 있냐? {hasExcellent}");
진짜 간단하고 깔끔하지.
5. 배열 뒤집기: Array.Reverse
배열을 “거꾸로” 뒤집고 싶을 때가 있지. 이럴 땐 이렇게 써:
int[] grades = { 2, 3, 4, 5 };
// 배열 뒤집기
Array.Reverse(grades);
Console.WriteLine("뒤집은 점수: " + string.Join(", ", grades));
최신 데이터부터 보고 싶을 때나, 그냥 세상을 거꾸로 보고 싶을 때(?) 유용해.
6. 배열 정렬: Array.Sort
언젠가 배열을 정렬하고 싶을 때가 올 거야. 제일 쉽고 안전한 방법은 표준 정렬 함수 쓰는 거야:
int[] grades = { 4, 3, 5, 2, 5 };
// 오름차순 정렬
Array.Sort(grades);
Console.WriteLine("정렬된 점수: " + string.Join(", ", grades));
이 함수는 문자열도 정렬하는데, 그땐 알파벳 순서야.
내림차순 정렬
기본 Array.Sort는 오름차순만 돼. 내림차순으로 하려면 정렬하고 뒤집으면 돼:
Array.Sort(grades); // 먼저 오름차순
Array.Reverse(grades); // 그다음 뒤집기
Console.WriteLine("내림차순: " + string.Join(", ", grades));
참고: 정렬하면 배열이 “바로” 바뀌는 거라 원본이 없어져. 원래 순서가 필요하면 먼저 복사해둬.
7. 배열 복제: Clone과 Array.Copy
원본 배열을 건드리지 않고 복사본을 만들고 싶으면 Clone()이나 Array.Copy()를 써.
Clone()은 배열에서 바로 호출하면 전체 복사본을 반환해.
Array.Copy()는 파라미터가 필요해:
- 원본 배열;
- 복사할 배열;
- 몇 개 복사할지.
int[] original = { 1, 2, 3, 4, 5 };
// 방법 1: Clone()
// 1차원, 다차원 배열 모두 되고, 반환 타입이 object라서 형변환 필요:
int[] copy1 = (int[]) original.Clone();
// 방법 2: Array.Copy
int[] copy2 = new int[original.Length];
Array.Copy(original, copy2, original.Length);
중요한 점: 배열이 int, double 같은 기본 타입이면 값이 복사돼. 근데 객체 배열이면 참조만 복사돼! (이걸 “얕은 복사”라고 해)
8. 배열을 값으로 채우기: Array.Fill
배열을 “0”으로 초기화하거나 전부 5로 채우고 싶을 때 Array.Fill이 딱이야:
int[] grades = new int[5];
Array.Fill(grades, 5); // 이제 모든 요소가 5야
Console.WriteLine("가상의 완벽한 학생: " + string.Join(", ", grades));
특정 값으로 배열을 빠르게 초기화할 때 유용해.
9. 최대값과 최소값 찾기
System.Linq 모듈 덕분에 배열에 쓸 수 있는 좋은 메서드가 많아졌는데, 그중 Max()랑 Min()은 배열에서 최대/최소값을 바로 찾아줘.
배열에서 최고점, 최저점 찾아보자:
int maxGrade = grades.Max();
int minGrade = grades.Min();
Console.WriteLine($"최고 점수: {maxGrade}, 최저 점수: {minGrade}");
이 메서드 쓰려면 using System.Linq; 꼭 추가해.
GO TO FULL VERSION