int[] exp = {50, 100, 150, 200, 250};
int[] exp2;
이렇게 배열을 선언해 줄 수 있다. 배열은 비슷한 성격을 가진 변수들의 집합체이다.
배열의 값을 참조하고 싶을 때에는
print(exp[0]); //50 (0부터 카운팅하므로)
배열의 값을 참조하고 싶을 때에는 위와 같이 하면 된다. (파이썬 공부할 때 배웠던 내용과 동일함)
배열의 원소 개수를 알고 싶을 때 파이썬에서는 len함수를 이용했겠지만 C#에서는 exp.Length를 통해 알 수 있다.
int [] array = new int[10];
이렇게 하는 것은 배열의 크기(원소의 개수)만 지정해주는 것이다.
방금까지 한 것은 1차원 배열이다.
2차원 배열은 다음과 같이 나타낼 수 있다. (그 이상의 배열들의 형식은 2차원 배열이 생성되는 형식과 유사하다)
int[,] array2 = { {1, 2, 3, 4, 5} , {10, 20, 30, 40, 50} };
print(array2[1,3]);
코드를 실행해보면 print의 값이 40으로 나오는 것을 알 수 있다. array2[1,3]는 두 배열중 인덱스 1에 해당하는 배열에서의 인덱스 3의 값을 의미한다.
그런데 배열은 한번 생성되면 배열의 크기가 고정되어 원소를 늘리거나 줄일 수 없다.
이러한 단점을 극복하는 것이 컬렉션(리스트, 큐, 스텍, 해시테이블, 딕셔너리, 어레이리스트)이다.
//ArrayList
ArrayList arrayList = new ArrayList();
arrayList.Add(1); //arrayList에 1이라는 원소를 추가함
arrayList.Add("가나다라");
print(arrayList.Count); //arrayList에서는 length가 없고, Count가 그 기능을 해줌
arrayList[0] = 3; //배열과 사용법은 같음
arrayList.Remove("가나다라"); //직접 지움
arrayList.RemoveAt(0); //인덱스를 통해 지움
ArrayList는 누군가가 이미 만들어 놓은 class이다. 점(.)을 찍으면 Add나 Remove같은 메소드를 이용할 수 있다.
//List
List<int> list = new List<int>(); //ArrayList와 달리 특정한 자료형만을 원소로 가짐
ArrayList는 자료형 상관없이 원소를 가지지만 List는 특정한 자료형을 지정하고, 그 자료형만을 원소로 가진다. 단순히 생각하면 범위가 넓은 ArrayList를 항상 쓰면 더 편하고 좋겠다고 생각되겠지만 범위가 넓은만큼 값이 들어올 때 마다 넓은 Box를 만들고 들어올 때, 나갈 때마다 더 많은 연산이 필요해진다. 즉, 비효율 적인 것이다. 그래서 List보다 더 연산량이 많을 것이고 과부하에 걸리기 쉽다.
//HashTable
HashTable hashTable = new HashTable();
hashTable.Add("만", 10000); //(key, value) 입력
hashTable.Add("백만", 1000000);
print(hashTable["만"]); //인덱스 대신 key로 value를 호출한다
//Dictionary
Dictionary<string, int> dictionary = new Dictionary<string, int>(); //key(string), value(int)
HashTable과 Dictionary의 관계는 ArrayList와 List의 관계와 동일하다고 보면 된다.
//Queue
Queue<int> queue = new Queue<int>();
queue.Enqueue(5); //원소 5를 넣음
queue.Enqueue(6); //원소 6을 넣음
queue.Dequeue(); //가장 먼저 들어간 원소를 꺼냄
queue.Dequeue(); //두 번째로 들어간 원소를 꺼냄
이 상태에서 queue.Dequeue();를 한번 더 실행하게 된다면 오류가 뜰 것이다. 왜냐면 이미 들어간 총 두개의 원소가 이전에 다 꺼내졌기 때문에 더이상 꺼낼 원소가 없기 때문이다. 그렇기 때문에 queue.Dequeue는 queue.Count!=0일 때에만 실행될 수 있도록 if문과 함께 쓰이는 것이 좋다.
queue는 선입전출이라하고 반대로 후입전출이라고 불리는 stack도 있다.
stack은 queue와 반대로 가장 마지막에 넣었던 원소를 꺼낸다.
Stack<int> stack = new Stack<int>();
stack.Push(1); //stack에 1을 넣어줌
stack.Push(2);
stack.Push(3);
stack.pop(); //3을 꺼냄