int scores = new int[5];
마지막 값에 접근을 할려면
scores[scores.Length - 1] = 34;
이런식으로 해주어야했는데
이런 귀찮은 작업을 이제는
System.Index 형식과 '^' 연산자가 생김.
'^' 연산자는 컬렉션의 마지막 부터 역순으로 인덱스를 지정하는 기능을 가지고있다.
^1 은 마지막 요소를 나타내는 인덱스,
^2 는 자지막에서 두번째.
이렇게 마지막 인덱스에 접근하여 값을 넣어 줄 수도있다.
또한
System.Index last = ^1;
scores[last] = 34; // 이런것도 가능.
배열또한 Sysyem.Array 의 클래스의 객체이다.
int[] scores = new int[5] { 22, 31, 55, 27, 18 };
scores[^1] = 30;
//foreach(int num in scores)
// Console.WriteLine(num);
//Array.Sort(scores);
Array.ForEach<int>(scores, (i) => Console.WriteLine(i) );
Console.WriteLine();
Console.WriteLine(scores.Rank);
Console.WriteLine($"{Array.TrueForAll<int>(scores, Check)}");
int index = Array.FindIndex<int>(scores, (scores) => scores > 25 && scores < 30 );
Console.WriteLine(index);
int[] slice = new int[3];
Array.Copy(scores, 0, slice, 0, 3);
Array.ForEach<int>(slice, (i) => Console.WriteLine(i));
Console.WriteLine();
이러한 System.Array에서 제공하는 함수들이 있으니까 요긴하게 사용하면된다.
System.Range 와 친해지자.
Sysyem.Range는 객체를 생성할 때 '..' 연산자를 사용한다.
int[] scores = new int[5] { 22, 31, 55, 27, 18 };
System.Range r1 = 0..3;
// 0이 시작인덱스, 3이 마지막 인덱스
int[] slice1 = scores[r1];
int[] slice2 = scores[0..3]; // scores [] 안에 Range객체가 들어간 것임.
Array.ForEach<int>(slice1, (num) => Console.WriteLine(num));
Array.Copy대신에 사용을 하면 좋다.
이거 System.Range 연산자 .. 사용하면 반환하는것이
System.Array를 반환하기 때문에
함수에 인자로 scores[..] 이런거 그냥 자체로 넣어줄 수 있다.
// 첫번재 부터 세번째 요소까지
int[] slice3 = scores[..3];
// 두번째부터마지막
int[] slice3 = scores[1..];
// 전체
int[] slice3 = scores[..];
또한 System.Index객체를 사용할 수도있다.
System.Index idx = ^1;
int slice3 = scores[idx];
int slice3 = scores[..^1];
ㅇㅋ?
(CPP과의 의미가 조금 다르다..)
(CPP에서는 가변배열은 길이가 늘어나는 vector를 말한다)
배열을 요소로 갖는 배열은 기변 배열.
선언방법
데이터 형식 [] [] 배열이름 = new 데이터 형식 [데이터 용량] [];
갸변벼열의 요소는 "배열"이다.
int[][] jag = new int[3][];
jag[0] = new int[5] {1, 2, 3, 4, 5};
jag[1] = new int[] {10, 20, 30};
jag[2] = new int[] {100, 200};
또는
int[][] jag2 = new int[2][]
{
new int[] {1000, 2000},
new int[4] {6, 7, 8, 9}
};
같은 성격을 띈 데이터의 모음을 담은 자료구조를 말한다.
배열도 .NET에서 제공하는 자료구조의 일부임.
그러니까 컬렉션이라는게 큰 개념이고
안에 배열이 들어가는 거임.
.NET은 배열말고도 다른 컬렉션들을 지원한다.
ArrayList
Queue
Stack
Hashtable
이게 CPP에서의 vector 와 상응하네 보니까
정의가 ' [ ] ' 연산자를 사용을 하고
배열과 달리 컬렉션을 생성할 때 용량을 미리 지정할 필요 없이 필요에 따라 자동으로 그 용량이 늘어난다는 점.
=> 이게 cpp에서의 vector 가변배열과 똑같은 점이다.
vector와 같이 Add, RemoveAt, Insert 가 가장 중요함.
Add, Insert함수의 선언부를 보면
인자로
Add (object value), Insert(int index, object value)
를 받는다.
모든 형식은 onject형식을 상속하므로 Add로 int형데이터를 넣으면
object형식으로 박싱 되어서 입력이 되는 것이다.
반대로 ArrayList에 접근을 할때에는 원래의 데이터 형식으로 "언박싱"을 이 이루어진다.
박싱과 언박싱은 많은 오버헤드요구 => 데이터 많으면 느려짐.
이런거 나중에 "일반화 컬렉션"으로 어느정도 해결 가능함.
"대기열" 이라는 "컬렉션"이다.
Queue q = new Queue();
q.Enqueue(1);
q.Enqueue(1);
q.Enqueue(1);
// [1] [2] [3]
int a = q.Dequeue(); // a = 1;
이런개념임. ㅇㅋ?
먼저 들어온 데이터가 나중에 나가고 First In - Last Out
나중에 들어온 데이터가 먼저 나가는 Last In - First Out 구조의 컬렉션이다.
데이터를 넣을 경우 Push,
꺼낼때는 Pop