컬렉션
- 데이터 집합
- 배열 (단일 데이터형 집합),
컬렉션(단일, 다중 데이터형 집합)
- ArrayList
- HashTable
- Queue
- Stack
- 동적으로 메모리 확장
- 내부 수정, 삭제, 검색
등 기능 제공
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
namespace Test
{
class ArrayList01
{
static void Main(string[]
args)
{
//배열 -> 크기가 불변(고정)
//컬렉션 -> 크기가 가변 배열
int[] ns = new int[3];
ns[0] = 34;
ns[1] = 34;
ArrayList list
= new ArrayList();
//list[0] = 3434; Add()
: 무조건 맨 마지막에 방을 추가하고
데이터 추가
//Append();
list.Add(10);
list.Add(20);
list.Add(30);
//현재까지 넣은 요소의 갯수? list = 인스턴스 .Count = 프로퍼티
Console.WriteLine(list.Count);
list[0] = 100;
Console.WriteLine(list[0]);
//원하는 위치에 추가
list.Insert(2, 1000);
foreach (int n in list)
{
Console.WriteLine(n);
}
//섞어서 넣는건 좋지않다 이유 : 일괄 처리가
불가능 list2[i].Length 집합을 쓰는 이유가 없다.
//컬렉션의 위험성 : 배열의 인덱스 번호가
삭제 나 추가를 하게되면 인덱스 번호가 바뀌기 때문에 굉장히 위험하다.
ArrayList
list2 = new ArrayList();
list2.Add("하나");
list2.Add("둘");
list2.Add("셋");
foreach (string i in list2)
{
Console.WriteLine(i);
}
//첫번째 발견되는방만 삭제 한다.
//RemoveAt 은 인덱스 방번호를 찾아 삭제한다.
list2.Remove("하나");
list2.RemoveAt(2);
foreach (string count in
list2)
{
Console.WriteLine(count);
}
}
}
}
ArrayList
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
namespace Test
{
class ArrayList02
{
static void Main(string[]
args)
{
//M1();
//M2();
M3();
}
private static void M3()
{
//추가기능
ArrayList list
= new ArrayList();
//list.Clone(); - 깊은복사
//list.Contains(); - 존재 유무(검색)
//list.IndexOf();
//list.LastIndexOf();
//list.Sort();
//list.Reverse();
list.Add(100);
list.Add(200);
list.Add(300);
Console.WriteLine(list.Count);
//데이터 3개 초기화 길이가 가변이기 때매
가능 한것
list.Clear();
Console.WriteLine(list.Count);
}
private static void M2()
{
//ArrayList - 배열과 유사한데 길이가 가변이고 자료형이 ->
Object(방의자료형)
//ArrayList는 각방의 타입이 Object형이라 어떤
자료형이든 다 넣을수 있지만
//반대로 가져올 때는 Object형으로 반환이
되기 때문에 원래 데이타의 자료형으로 형변환을 해야한다.
ArrayList
list1 = new ArrayList();
list1.Add(100);
Object[] list2
= new Object[5];
list2[0] = 100;
Console.WriteLine(list1[0].ToString());
Console.WriteLine(list1[0]);
}
private static void M1()
{
//Baxing(박싱) : 모든 밸류타입을 object 형으로 넣을때 발생한다.
object o = 10;
//참조형+값형=연산X / (o + 10) 모든 오브젝트는 산술 연산이 불가능 하다.
//(int)o : UnBoxing(언박싱)
Console.WriteLine((int)o + 10);
object o2 = true;
if ((bool)o2)
{
Console.WriteLine("hi");
}
}
}
}
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
namespace Test
{
class ArrayList02
{
static void Main(string[]
args)
{
M1();
M2();
M3();
}
private static void M3()
{
//추가기능
ArrayList list
= new ArrayList();
//list.Clone(); - 깊은복사
//list.Contains(); - 존재 유무(검색)
//list.IndexOf();
//list.LastIndexOf();
//list.Sort();
//list.Reverse();
list.Add(100);
list.Add(200);
list.Add(300);
Console.WriteLine(list.Count);
//데이터 3개 초기화 길이가 가변이기 때매
가능 한것
list.Clear();
Console.WriteLine(list.Count);
}
private static void M2()
{
//ArrayList - 배열과 유사한데 길이가 가변이고 자료형이 ->
Object(방의자료형)
//ArrayList는 각방의 타입이 Object형이라 어떤
자료형이든 다 넣을수 있지만
//반대로 가져올 때는 Object형으로 반환이
되기 때문에 원래 데이타의 자료형으로 형변환을 해야한다.
ArrayList
list1 = new ArrayList();
list1.Add(100);
Object[] list2
= new Object[5];
list2[0] = 100;
Console.WriteLine(list1[0].ToString());
Console.WriteLine(list1[0]);
}
private static void M1()
{
//Baxing(박싱) : 모든 밸류타입을 object 형으로 넣을때 발생한다.
object o = 10;
//참조형+값형=연산X / (o + 10) 모든 오브젝트는 산술 연산이 불가능 하다.
//(int)o : UnBoxing(언박싱)
Console.WriteLine((int)o + 10);
object o2 = true;
if ((bool)o2)
{
Console.WriteLine("hi");
}
}
}
}
HashTable
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
namespace Test
{
class HashTable01
{
static void Main(string[]
args)
{
//HashTable ->
Dictionary : 연관배열 : 일괄 처리 용도로 적합하지 않다.
//모든 컬렉션의 거의 동일한 인터페이스를 구현했음
Hashtable hash = new
Hashtable();
hash.Add("one",
"하나");
hash.Add("two",
"둘");
hash.Add("three",
"셋");
Console.WriteLine(hash.Count);
Console.WriteLine(hash["two"].ToString());
Console.WriteLine(hash["three"].ToString());
//ArrayList vs
HashTable
//1. ArrayList : 스칼라 배열(index 사용)
// HashTable : 연관배열(key, value)
//2. ArrayList : 반복 제어(for, foreach)
// HashTable : 반복 제어X
//3. ArrayList : 가독성 떨어짐
// HashTable : 가독성 높음
// HashTable : 위치 개념이 없기 때문에 삽입 이라는 행동이 불가능
//이용도로 사용할순 있으나 용도 자체가
ArrayList가 하는 행동으로 하는것이 더편하다.
//이렇게도 사용할수 있다는 것을 생각하도록 하자.
Hashtable hash2 = new
Hashtable();
hash2.Add(0, "하하");
hash2.Add(1, "호호");
}
}
}
Queue, Stack
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
namespace Test
{
class Collection01
{
static void Main(string[]
args)
{
M1();
//M2();
}
private static void M2()
{
//Stack(스택)
// - 후입선출(LIFD, Last Input First
Output) push(넣다) pop(빼다)
Stack stack = new
Stack();
stack.Push(100);
stack.Push(200);
stack.Push(300);
Console.WriteLine(stack.Count);
Console.WriteLine(stack.Pop());
Console.WriteLine(stack.Pop());
Console.WriteLine(stack.Pop());
}
{
//Queue(큐) 확인된 데이터는 버려진다. : 마우스, 키보드는 큐 구조다.
// - 선입선출(FIFO, First Input First
Out)
Queue queue = new
Queue();
queue.Enqueue(100);
queue.Enqueue(200);
queue.Enqueue(300);
Console.WriteLine(queue.Count);
Console.WriteLine(queue.Dequeue());
Console.WriteLine(queue.Dequeue());
Console.WriteLine(queue.Dequeue());
Console.WriteLine(queue.Count);
if (queue.Count
> 0)
{
Console.WriteLine(queue.Dequeue());
}
while (true)
{
if
(queue.Count > 0)
Console.WriteLine(queue.Dequeue());
else
break;
}
queue.Enqueue(100);
queue.Enqueue(200);
queue.Enqueue(300);
//하나만 확인할수 있다 인풋하고 뺀것이 아니라 들어있는값을 보고만 있다.
Console.WriteLine(queue.Peek());
Console.WriteLine(queue.Count);
}
}
}
ArrayList 개념 및 문제점 해결
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace ConsoleEx
{
//Ex110_ArrayList.cs
class Ex110_ArrayList
{
static void Main(string[]
args)
{
//M1();
//M2();
M3();
}
private static void M3()
{
ArrayList list = new
ArrayList(129);
Console.WriteLine(list.Capacity);
for (int i = 0; i < 129; i++)
{
list.Add(i);
}
Console.WriteLine(list.Capacity);
//data : 129개
//공간 : 256개
Console.WriteLine(list.Capacity);
list.TrimToSize();
Console.WriteLine(list.Capacity);
list.Add(10);
Console.WriteLine(list.Capacity);
}
private static void M2()
{
Test t1 = new
Test();
//t1[0] = 10;
//t1[1] = 20;
//t1[2] = 30;
//t1[3] = 40;
t1.Add(10);
t1.Add(20);
t1.Add(30);
t1.Add(40);
t1.Add(50);
for (int i = 0; i < 5; i++)
Console.WriteLine(t1[i]);
}
private static void M1()
{
ArrayList list = new
ArrayList();
Console.WriteLine(list.Count);//0
Console.WriteLine(list.Capacity);//진짜 배열의 길이
list.Add(100);
Console.WriteLine(list.Count);
Console.WriteLine(list.Capacity);
list.Add(200);
Console.WriteLine(list.Count);
Console.WriteLine(list.Capacity);
list.Add(300);
Console.WriteLine(list.Count);
Console.WriteLine(list.Capacity);
list.Add(400);
Console.WriteLine(list.Count);
Console.WriteLine(list.Capacity);
list.Add(500);
Console.WriteLine(list.Count);
Console.WriteLine(list.Capacity);
}
}
class Test
{
private int[] nums;
private int index;//현재 Add가 데이터를 몇번째 방까지?
public Test()
{
this.nums = new int[4];
this.index = 0;
}
//인덱서
public int this[int index]
{
get { return this.nums[index];
}
//set {
this.nums[index] = value; }
}
public void Add(int n)
{
//최대치가 넘어가는 순간 배열의 길이 x 2
if (this.index == this.nums.Length)
{
//현재 배열의 길이보다 2배 긴 배열 생성
int[] temp
= new int[nums.Length
* 2];
//각방의 데이터를 복사 -> 깊은 복사
for (int i = 0; i < this.nums.Length;
i++)
{
temp[i] = nums[i];//0~3번
}
//
this.nums
= temp;
}
this.nums[this.index] = n;
this.index++;
}
}
}