배열과 컬렉션 && 인덱서

CJB_ny·2022년 7월 28일
0

C#

목록 보기
19/24
post-thumbnail

배열 System.Array

int scores = new int[5];

마지막 값에 접근을 할려면

scores[scores.Length - 1] = 34;

이런식으로 해주어야했는데

이런 귀찮은 작업을 이제는

System.Index 형식과 '^' 연산자가 생김.

'^' 연산자는 컬렉션의 마지막 부터 역순으로 인덱스를 지정하는 기능을 가지고있다.

^1 은 마지막 요소를 나타내는 인덱스,

^2 는 자지막에서 두번째.

이렇게 마지막 인덱스에 접근하여 값을 넣어 줄 수도있다.

또한

System.Index last = ^1;
scores[last] = 34; // 이런것도 가능.

C#은 모든 것이 객체 👍

배열또한 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

ArrayList ❗❗

이게 CPP에서의 vector 와 상응하네 보니까

정의가 ' [ ] ' 연산자를 사용을 하고

배열과 달리 컬렉션을 생성할 때 용량을 미리 지정할 필요 없이 필요에 따라 자동으로 그 용량이 늘어난다는 점.

=> 이게 cpp에서의 vector 가변배열과 똑같은 점이다.

vector와 같이 Add, RemoveAt, Insert 가 가장 중요함.

ArrayList가 다양한 형식의 객체를 담을 수 있는 이유 👍👍👍

Add, Insert함수의 선언부를 보면

인자로

Add (object value), Insert(int index, object value)

를 받는다.

모든 형식은 onject형식을 상속하므로 Add로 int형데이터를 넣으면

object형식으로 박싱 되어서 입력이 되는 것이다.

반대로 ArrayList에 접근을 할때에는 원래의 데이터 형식으로 "언박싱"을 이 이루어진다.

박싱과 언박싱은 많은 오버헤드요구 => 데이터 많으면 느려짐.

이런거 나중에 "일반화 컬렉션"으로 어느정도 해결 가능함.

Queue

"대기열" 이라는 "컬렉션"이다.

Queue q = new Queue();

q.Enqueue(1);
q.Enqueue(1);
q.Enqueue(1);

// [1] [2] [3] 

int a = q.Dequeue(); // a = 1;

이런개념임. ㅇㅋ?

Stack

먼저 들어온 데이터가 나중에 나가고 First In - Last Out

나중에 들어온 데이터가 먼저 나가는 Last In - First Out 구조의 컬렉션이다.

데이터를 넣을 경우 Push,

꺼낼때는 Pop

Hashtable

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글