본문 바로가기

   
Programming/C#

컬렉션(Collection)

반응형

컬렉션

 - 데이터 집합

 - 배열 (단일 데이터형 집합), 컬렉션(단일, 다중 데이터형 집합)

 - 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());

 

             }

 

 


private static void M1()

             {

                    //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++;

             }

       }

}

 

 

반응형