아시다시피 배열은 동일한 형식의 여러 데이터를 하나의 변수명에 저장하여 인덱스로 접근할 수 있게 하는 방법입니다.
먼저 일차원 배열 형식은
type[] 배열이름;
으로 선언 가능하며 초기화하는 방법은 세가지가 있습니다.
정수형 배열을 예로 들어 설명하겠습니다.
int[] array1 = new int[5] { 1, 3, 5, 7, 9 }; //배열개수 명시
int[] array2 = new int[] { 1, 3, 5, 7, 9 }; //배열 개수 생략
int[] array3 = { 1, 2, 3, 4, 5, 6 }; // new 생략
배열 원소의 개수를 명시할수도, 안 할 수도 있고, 아예 "new"를 생략해도 모두 같은 결과를 보여줍니다. 가독성과 스타일에 따라 어느쪽을 사용해도 좋습니다.
지금은 1차원 배열의 예를 들었지만 배열은 1차원, 다차원 또는 가변 배열일 수 있습니다.
그리고, 차원 수와 각 차원의 길이는 배열 인스턴스가 생성될 때 만들어집니다. 또한 이러한 값은 인스턴스의 수명 동안 변경할 수 없습니다.
숫자 배열 요소에는 0이, 참조 요소에는 null이 기본값으로 설정되며, 가변 배열은 배열의 배열이므로, 각 요소는 참조 형식이고 null로 초기화됩니다.
대부분의 언어와 마찬가지로, 배열의 인덱스는 0부터 시작합니다(n개의 요소가 있는 배열의 인덱스는 0부터 n-1까지입니다). 그리고, 배열 요소는 배열 형식을 포함하여 모든 형식이 될 수 있습니다.
배열 형식은 Array 추상 기본 형식에서 파생된 참조 형식입니다. 따라서 이 형식은 IEnumerable 및 IEnumerable<T>을 구현하므로 C#의 모든 배열에 foreach 반복을 사용할 수 있습니다. 이러한 형식은 .Net 프레임워크 CTS(Common Type System)에서 System.Array에 정의되어 있는데, 이 쯤에서 System.Array의 메소드와 프로퍼티 중 몇몇을 살펴봅시다. 참고
속성
Length | 모든 차원의 요소의 총 수 |
Rank | 배열의 차원 수(1차원은 1, 2차원은 2) |
정적메소드
BinarySearch<T>() | 이진 탐색을 수행 |
Clear() | 배열의 모든 요소 초기화.(array, int, int) 인자로 초기화할 범위 지정 가능. |
FindIndex<T>() | 조건에 부합하는 첫 요소의 인덱스 반환 |
FindLastIndex<T>() | 조건에 일치하는 마지막 요소의 인덱스 반환 |
ForEach<T>() | 지정한 모든 요소에 대해 동일 작업 수행 |
IndexOf() | 지정한 개체를 검색하여 1차원 배열에서 처음 검색된 인덱스 |
LastIndexOf() | 1차원 배열에서 마지막 겸색된 인덱스 |
Resize<T>() | 배열 요소 수를 지정된 크기로 변환 |
Reverse() | 순서를 역순으로 |
Sort() | 배열 정렬 |
TrueForAll<T>() | 모든 요소가 지정한 조건에 부합하는지 여부 반환 |
인스턴스 메소드
GetLength() | 지정한 차원의 길이 반환 |
GetType() | 현재 인스턴스의 타입 반환 |
using System;
namespace ArrayExample
{
class MainApp
{
private static bool CheckHeight(int score)
{
if (score >= 165)
return true;
else
return false;
}
private static void Print(int value)
{
Console.Write("{0} ", value);
}
static void Main(string[] args)
{
//일차원 배열 선언 및 초기화
int[] heights = new int[] { 180, 174, 165, 158, 194 };
// foreach로 일차원 배열 순회 출력
foreach (int height in heights)
Console.Write("{0} ", height);
Console.WriteLine();
//정렬
Array.Sort(heights);
Array.ForEach<int>(heights, new Action<int>(Print));
Console.WriteLine();
// 차원 수
Console.WriteLine("배열의 차원 수: {0}", heights.Rank);
// BinarySearch와 IndexOf
Console.WriteLine("Binary Search : 165의 인덱스 {0}", Array.BinarySearch<int>(heights, 165));
Console.WriteLine("Linear Search : 194의 인덱스 {0}", Array.IndexOf(heights, 194));
// TrueForAll
Console.WriteLine("모두 165cm이상입니까? : {0}", Array.TrueForAll<int>(heights, CheckHeight));
// Findindex
int index = Array.FindIndex<int>(heights,
delegate (int height)
{
if (height < 165)
return true;
else
return false;
});
heights[index] = 166;
Console.WriteLine("이젠 모두 165 이상입니까? : {0}", Array.TrueForAll<int>(heights, CheckHeight));
// GetLength
Console.WriteLine("원래 배열 길이 : {0}", heights.GetLength(0));
// resize
Array.Resize<int>(ref heights, 10);
Console.WriteLine("바뀐 배열 길리 : {0}", heights.Length);
// ForEach
Array.ForEach<int>(heights, new Action<int>(Print));
Console.WriteLine();
// Clear
Array.Clear(heights, 3, 7);
Array.ForEach<int>(heights, new Action<int>(Print));
Console.WriteLine();
}
}
}
| cs |
2차원 배열
C언어에서와 마찬가지로 [2,3]의 배열이라 하는 것은
[0,0]
|
[0,1]
|
[0,2]
|
[1,0]
|
[1,1]
|
[1,2]
|
2차원 배열의 선언 및 초기화도 1차원의 경우와 같습니다.
int[,] arr1 = new int[2, 3] {{ 1, 2, 3 }, { 4, 5, 6 }};//배열 길이 명시
int[,] arr2 = new int[, ]{{ 1, 2, 3 }, { 4, 5, 6 }}; // 배열 길이 생략
int[,] arr3 = { { 1, 2, 3 }, { 4, 5, 6 } }; //길이와 new 모두 생략
3차원, 4차원 배열도 가능하나 그다지 쓸모가 없으니 넘어가겠습니다.
가변 배열(Jagged Array)
가변 배열이란 배열의 요소로 배열을 갖는 배열입니다. 배열의 요소가 되는 배열의 길이가 다를 수 있다보니 '울퉁불퉁' 하다고 하여 jagged란 이름이 붙었습니다.
type[ ][ ] 배열명 = new type[가변배열 용량][ ];
의 형식으로 선언합니다.
int[][] jaggedArray = new int[3][];
jaggedArray[0] = new int[] { 1, 3, 5, 7, 9 };
jaggedArray[1] = new int[] { 0, 2, 4, 6 };
jaggedArray[2] = new int[] { 11, 22 };
| cs |
와 같이 따로따로 배열을 할당해 주거나,
int[][] jaggedArray2 = new int[][]
{
new int[] {1,3,5,7,9},
new int[] {0,2,4,6},
new int[] {11,22}
};
| cs |
와 같이 선언과 동시에 초기화 가능합니다.
사용 예를 보겠습니다.
using System;
namespace JaggedArray
{
class MainApp
{
static void Main(string[] args)
{
int[][] jaggedArray = new int[3][];
jaggedArray[0] = new int[] { 1, 3, 5, 7, 9 };
jaggedArray[1] = new int[] { 0, 2, 4, 6 };
jaggedArray[2] = new int[] { 11, 22 };
foreach(int [] arr in jaggedArray)
{
foreach (int e in arr)
{
Console.Write("{0} ", e);
}
Console.WriteLine(0);
}
}
}
}
| cs |
댓글 없음:
댓글 쓰기