보통은 컬렉션을 배열로 구현을 하는게 맞다.
사용하는 입장이라면 기존의 있는 자료형을 그대로 쓰는게 좋겠지.
우리는 컬렉션을 다루기가 쉽거든.
배열과 컬렉션의 선택기준
단일타입의 집합은 배열을 쓰자.
배열은 막무가내로 짜지 않는다. 중학교 관리프로그램이라고 치면 어느정도 예상치를 알기에
적정하게 잡고 만들지.
다중타입의 집합은 컬렉션을 쓰자. 가변적인 방의 갯수.. 배열과 달리 줄이거나 늘리는데 유동적.
배열이나 컬렉션을 만들고 탐색을 많이 하지.
아이템에 대한 접근을 하는데 배열은 for문을 쓰고 컬렉션은 foreach문 쓰자. 실제 컬렉션은 for문
보다 foreach문이 월등히 빠르다.
배열과 컬렉션의 차이점.
[배열]
: 데이터의 집합, 배열도 오브젝트형을 만들 수 있다. 배열은 고정된 크기만 갖는다.
첨에 방이 10개면 계속 10만 가능하다.
[컬렉션]
: 다중 데이터형 집합, 오브젝트형의 집합
동적으로 메모리 확장가능(크기가 가변적이다, 가장 많이 쓰는 이유)
확실하지 않은 데이터의 크기는 컬렉션을 많이 쓰지.
방을 늘리거나 줄이거나 가능하기 때문이야
ArrayList
- 크기가 필요에 따라 동적으로 증가되는 배열
- 데이터를 넣을때
list.Add();
Ilist : 아이리스트를 부모로 갖는(상속) 놈들은 인덱서를 쓰도록 하자
Array list = new Array(); -> list[0]
이런 방법으로 입/출력할 수 있는 것.
ICollection : 얘를 상속받은 모든 클래스는 자기가 가지고 있는 구성요소를 count
라는 이름으로 반환하게 되어 있어.
쩜.count 이런 식으로 쓰인다.
IEnumerable : 도움말 참조~
ICloneable : clone 이라는 메소드를 구현해야 한다. 왜 배열을 clone으로 카피하는 이유
list.clone(); 복사할 때 이런 문법을 쓰는데 이 인터페이스를 상속받았기
때문이야.
개념을 알고 가자
Add : 추가의 개념, 다른 메소드에서는 Append 라고도 한다. 내용이 있으면 밑에다 계속 추가.
Insert : 삽입의 개념. 자료가 있으면 사이에 비짚고 넣겠다는 거야.
가변적인 ArrayList 왜???
배열은 방을 만들면 끝이다. int[] num = new int[5];
그러나 이놈은 신기하게 방갯수 변경이 가능하다. 하지만 이놈도 원래 방의 크기가 있다.
ArrayList mm = new ArrayList();
list.Add(10);
list.Add(20);
list.Add(30);
원래 기본적으로 3개의 방이 생성이 되는데 4번째 방을 만들고자 Add로 넣으면
기본크기의 2배가 되는 방을 만들고 원래있던 값들을 복사한다.
list.Add(40);
내부적으로는 객체가 2번 생성이 된것이지.. 그리고 방의 크기는 6개가 되는거야.
보통 기본크기도 잡을 수 있다.
근데 항상 요소의 갯수가 100개와 101개를 넘나들면 빈방이 많아지겠지.
이까지는 좋아. 4번째방에 40을 넣으면 2개의 남는 방이 있잖아.
이 때, 죽어도 4개이상의 방을 넘어갈 일이 없다... 즉 남는방을 없앨 때
우리는 list.TrimToSize(); 를 써서 공간낭비를 줄일 수 있다.
========================================================================================
using System;
using System.Collections; // 컬렉션을 구동하기 위해 추가하는 using문
namespace ConsoleApplication1
{
public class Class6
{
public static void Main(string[] args)
{
// 배열같은 놈을 하나 만들자
// #### ArrayList #########
// 배열과 달리 길이가 가변적이라 방의 갯수를 지정할 필요 없다.
// foreach문을 지원한다.
ArrayList list = new ArrayList();
list.Add(100);
list.Add(200);
list.Add(300);
Console.WriteLine("list의 크기 : {0}", list.Count); // 3 을 반환
Console.WriteLine(list[1]); // 200 을 반환
foreach(int n in list)
{
Console.WriteLine(n); // 100 200 300 을 반환
}
// 요소를 모두 제거하는 clear
list.Clear();
Console.WriteLine(list.Count); // 0 을 반환
// 지운 값을 다시 넣고...
list.Add(100);
list.Add(200);
list.Add(300);
// 유/무를 반환, 검색용 메소드
Console.WriteLine(list.Contains(200)); // true를 반환
// Insert....
list.Insert(1,400); // 1번째 위치에 400을 넣겠다는 의미다.
foreach(int n in list)
{
Console.WriteLine(n);
}
// Insert를 ADD랑 같게 만들고 싶다면
list.Insert(list.Count, 777);
foreach(int n in list)
{
Console.WriteLine(n);
}
// Remove는 찾아서 지우는 놈.... 200을 넣으면 200이란 값을 찾아서 지운다.
// 만약 200이 두개 있으면 첫번째 놈만 지운다.
list.Remove(200);
// 찍어서 지운다.
list.RemoveAt(1);
// sort는 배열의 sort와 같다.
list.Sort();
// 이놈은 쓰는게 좋다.
// 왜 이 ArrayList란 놈은 가변적일까???
// 그 질문과 연장선상에 있다. 이놈은 남는 방을 잘러버리거든
list.TrimToSize()
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
HashTable
IDictionary 기능을 가지고 있다. 방이름(키값)을 지정해주는것
이 놈은 hash[0] 이라고 하면 0번째 방이 아닌 0의 키값을 가지는지 보는거야..
패턴이 없기 때문에 반복시키기가 좀 애매해.. 못하는건 아닌데 많이 까다로워
직관적인 대신에 이런 약점을 가지지...
list[0] - "스칼라배열", 인덱스로 구분
list["id"] - "연관배열", HashTable
// 사용자의 입장에서 주소값만 보고는 사실 머가 들어있는지 잘 모르잖아
// 근데 방이름만 잘 정해주면 방속에 있는 데이터가 먼지를 어느정도 알수있잖아~
Hashtable hash = new Hashtable();
hash.Add("one", "하나");
hash.Add("two","둘");
hash.Add("three","셋");
hash.Add("402","닷넷전문가");
hash.Add("301","DB전문가");
// Hashtable을 불러내기 위해서는 방의 이름표(키값)를 요구한다.
// ADD 할때 키와 값의 쌍으로 이루어지게 된다.
Console.WriteLine(hash["one"]);
Console.WriteLine(hash["402"]);
Console.WriteLine(hash[0]); // 0번째 방이 아닌 0의 키값을 찾아보는거다.
// Queue, 입/출력 데이터는 역시 오브젝트이다.
// 선입선출(FIFO : first in first out) : 파이프에 공을 넣고 끝에서 하나씩 받는다고 생각해.
// 우리가 쓰는 원도우에 딜레이가 있어도 먼저 클릭한 것부터 진행하잖아~
// 이는 메시지를 담아놓는 Queue가 존재해서 그래.
Queue queue = new Queue();
queue.Enqueue(10);
queue.Enqueue(20);
queue.Enqueue(30); // 차곡차곡 순서대로 데이터를 넣었다.
// 데이터를 끄집에 낼때는 단순한 메소드 호출 10->20->30의 순서로 호출된다.
Console.WriteLine(queue.Count); // 3 이 호출
Console.WriteLine(queue.Dequeue());
Console.WriteLine(queue.Dequeue());
Console.WriteLine(queue.Dequeue());
Console.WriteLine(queue.Count); // 0 이 호출 : Dequeue()라는 놈은 가져온 만큼 데이터 소멸
queue.Enqueue(500);
Console.WriteLine(queue.Peek()); // 요소를 제거하지 않고 그냥 반환.. 데이터 소멸 X
Console.WriteLine(queue.Count); // 1 이 호출
// Stack =========================================================
// 후입후출(LIFO : last in first out) 맨 마지막에 들어간 놈이 맨 첨에 나온다.
// 바닥이 막힌 세로로 생긴 통이라고 생각해라.
Stack stack = new Stack();
stack.Push("일");
stack.Push("이");
stack.Push("삼");
Console.WriteLine(stack.Count); // 3 이 호출
Console.WriteLine(stack.Pop()); // "삼" 이 호출
Console.WriteLine(stack.Pop()); // "이" 가 호출
Console.WriteLine(stack.Pop()); // "일" 이 호출
Console.WriteLine(stack.Count); // 0 이 호출
stack.Push("십");
Console.WriteLine(stack.Peek()); // "십" 이 호출
Console.WriteLine(stack.Count); // 1 이 호출
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
}
}
}
[출처] [컬렉션] Collection / HashTable|작성자 지니진