배열 초기화 방법
- C#에서는 3가지 방법으로 배열을 초기화할 수 있다.
- {} 블록은 컬렉션 초기자(Collection Initializer)라고 부른다.
string[] array1 = new string[3]{ "A", "B", "C" };
string[] array2 = new string[]{ "A", "B", "C" }; // 크기 생략가능
string[] array3 = { "A", "B", "C" }; // 형식도 생략가능
System.Array 클래스
분류 | 이름 | 설명 |
정적 메소드 | Sort() | 배열을 정렬 |
BinarySearch<T>() | 이진탐색 | |
IndexOf() | 특정 데이터의 인덱스 반환 | |
TrueForAll<T>() | 모든 요소가 조건에 부합하는지 여부 반환 | |
FindIndex<T>() | 조건에 일치하는 첫 번째 요소의 인덱스 반환 | |
Resize<T>() | 배열의 크기를 조정 | |
Clear() | 모든 요소를 초기화. 숫자면 0으로, 논리면 false로. | |
ForEach<T>() | 모든 요소에 대해 동일한 작업을 수행 | |
인스턴스 메소드 | GetLength() | 지정한 차원의 길이를 반환 |
프로퍼티 | Length | 배열의 길이를 반환 |
Rank | 배열의 차원을 반환 |
2차원 배열
- 축을 헷갈리기 쉬우니 주의
데이터형식[,] 변수명 = new 데이터형식[2차원길이, 1차원길이];
- 2 x 3 크기의 int형식 2차원 배열은 다음과 같다.
(길이가 3인 1차원 배열을 원소로 2개 갖고 있는 2차원 배열)
int[,] array = new int[2,3];
[0 , 0] | [0 , 1] | [0 , 2] |
[1 , 0] | [1 , 1] | [1 , 2] |
다차원 배열
- 차원이 둘 이상인 배열.
int[,,] array = new int[4, 3, 2]
{
{ {1, 2}, {3, 4}, {5, 6} },
{ {1, 4}, {2, 5}, {3, 6} },
{ {6, 5}, {4, 3}, {2, 1} },
{ {6, 3}, {5, 2}, {4, 1} },
};
가변 배열(Jagged Array)
- 배열을 요소로 가지는 배열.
데이터형식[][] 변수명 = new 데이터형식[가변 배열의 용량][ ];
int[][] jagged = new int[2][];
jagged[0] = new int[5] { 1, 2, 3, 4, 5 };
jagged[1] = new int[] { 15, 35 };
int[][] jagged = new int[2][]
{
new int[5] { 1, 2, 3, 4, 5 },
new int[] { 15, 35 }
};
다차원 배열(Rectangular Array) vs 가변 배열(Jagged Array)
- 다차원 배열은 각 차원이 같은 길이를 가진다.
- 가변 배열은 각 차원의 길이가 다를 수 있다.
컬렉션 (Collection)
- 같은 성격을 띄는 데이터의 모음을 담는 자료구조
- Array / ArrayList / List / SortedList / Queue / Stack / Hashtable
ArrayList
- [] 연산자를 이용하여 컬렉션의 요소에 접근
- 컬렉션 생성 시 용량을 미리 지정할 필요 없음.
- Add(), RemoveAt(), Insert()
ArrayList list = new ArrayList();
list.Add(1);
list.Add("A"); // Add(object) 형식이라 박싱을 통해 다양한 객체를 담는다.
- 초기화 시 직접 컬렉션 초기자를 이용하여 초기화 가능
ArrayList list = new ArrayList(){ 1, 2, 3 };
Queue
- 먼저 들어온 것이 먼저 나감. FIFO
- EnqQueue(), Dequeue()
Stack
- 먼저 들어온 것이 나중에 나감. FILO
- Push(), Pop()
Hashtable
- 키(key)와 값(value)이 쌍으로 이루어진 데이터의 집합.
- 탐색 속도가 빠른 편.
Hashtable ht = new Hashtable();
ht["book"] = "책";
ht["cook"] = "요리";
Console.WriteLine( ht["book"] );
Hashtable ht = new Hashtable()
{
["book"] = "책",
["cook"] = "요리"
};
Hashtable ht2 = new Hashtable()
{
{"book", "책"},
{"cook", "요리"}
};
컬렉션의 초기화
- ArrayList, Queue, Stack 등의 컬렉션은 생성자를 호출할 때 매개변수로 배열을 넘기면 해당 배열을 사용하여 초기화된다.
- ArrayList는 컬렉션 초기자로 바로 초기화할 수 있지만, Stack과 Queue는 Add를 구현하고 있지 않기 때문에 컬렉션 초기자로 초기화할 수 없다.
int[] arr = { 1, 2, 3 }
ArrayList list = new ArrayList(arr); // 1, 2, 3
Stack stack = new Stack(arr); // 3, 2, 1
Queue queue = new Queue(arr); // 1, 2, 3
인덱서
- 클래스나 구조체의 인스턴스를 배열처럼 인덱싱할 수 있게 해 준다.
- 인덱서는 해당 접근자가 매개 변수를 사용한다는 점을 제외하면 프로퍼티와 유사하다.
- 매개변수 형식은 숫자가 아니어도 된다.
class MyClass
{
한정자 인덱서형식 this[형식 index]
{
get
{
}
set
{
}
}
}
class MyClass
{
private int[] array;
public MyClass()
{
array = new int[3];
}
public int this[int index]
{
get
{
return array[index];
}
set
{
if(index >= array.Length)
{
Array.Resize<int>(ref array, index + 1);
}
array[index] = value;
}
}
}
Foreach가 가능한 객체 만들기
- foreach는 배열, 리스트와 같은 컬렉션에서만 사용 가능하다.
- IEnumerable과 IEnumerator를 상속하면 된다.
IEnumerable 인터페이스
메소드 | 설명 |
IEnumerator GetEnumerator() | IEnumerator 형식의 객체를 반환. |
class MyEnumerator
{
int[] numbers = {1, 2, 3 };
public IEnumerator GetEnumerator()
{
yield return numbers[0];
yield return numbers[1];
yield return numbers[2];
yield break; // 메소드를 종료시킴
}
}
class Main
{
static void Main(string[] args)
{
var obj = new MyEnumerator();
foreach(int i in obj)
Console.WriteLine(i);
}
}
IEnumerator 인터페이스
메소드 또는 프로퍼티 | 설명 |
bool MoveNext() | 다음 요소로 이동. 컬렉션의 끝을 지난 경우 false를 반환 |
void Reset() | 컬렉션의 첫번째 위치의 1개 전으로 이동. 첫 번째가 0이면 -1로 이동함. 따라서 MoveNext()를 호출해야 첫 번째가 됨. |
Object Current{ get; } | 컬렉션의 현재 요소를 반환 |
'🌍 C# Study > C# 기초' 카테고리의 다른 글
C# 복습하기 11) 예외 처리 (0) | 2021.04.12 |
---|---|
C# 복습하기 10) 일반화 프로그래밍 (0) | 2021.04.11 |
C# 복습하기 8) 프로퍼티 (0) | 2021.04.10 |
C# 복습하기 7) 인터페이스와 추상 클래스 (0) | 2021.04.10 |
C# 복습하기 6) 클래스 (0) | 2021.04.09 |