본문 바로가기

C# 코딩 기초

C# 기초 03 - 컬렉션(Collection)

안녕하세요 "투명 나비" 입니다.

 

저번 시간에는 다수의 정보를 하나의 변수에 저장하는 배열(Array)를 배웠습니다.

 

배열(Array)은 처음 값을 줄때 그 크기가 정해져 있고, 추가 또는 삭제를 할려면 새로운 배열을 생성하여, 복사를 하는 코드가 따로 필요합니다.

 

이러한 작업을 편리하게 구현한것이 이번에 배울 컬렉션(Collection) 입니다.

 

오늘은 C# 기초 : 세번째!! 컬렉션(Collection)에 대해서 알아보겠습니다.


먼저 c#에서 제공하는 컬렉션을 사용하기 위해서는 "System.Collections" 네임스페이스(추후설명)을 선언해야합니다.

 

Collections 네임스페이스에서는 ArrayList, Hashtable, Queue, Stack 등의 컬렉션을 제공합니다.

 

클레스 설명
ArrayList 필요에 따라 크기가 동적으로 증가하는 개체 배열을 나타냅니다
Hashtable 키의 해시 코드에 따라 구성된 키/값 쌍의 컬렉션을 나타냅니다
Queue FIFO(선입선출) 방식의 개체 컬렉션을 나타냅니다
Stack LIFO(후입선출) 방식의 개체 컬렉션을 나타냅니다

 


1. ArrayList(배열 리스트)

ArrayList는 배열(Array)과 매우 흡사한 컬렉션 입니다. 

 

배열(Array) 처럼 저장위치(index)로 값에 접근이 가능하고, 바로 읽거나 쓸수 있습니다. 

 

다른점은, 위에 설명했듯이 배열(Array)는 생성시 크기를 지정해주는,

반면 ArrayList는 생성 후 추가 또는 삭제하는 값에 따라 크기가 자동으로 변화 합니다.

(추가 / 삭제/ 변경 / 조회 가능)

 

 

또한 모든 타입의 변수를 담을 수 있는 장점이 있습니다. 

(Object 타입 및 그와 형변환 할수 있는 모든 타입을 넣을수 있다)

 

사용코드

//컬렉션 네임스페이스 선언
using System.Collections; 
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour{

    void Start(){

        //생성
        ArrayList _ArrayList = new ArrayList();

        //저장01
        _ArrayList.Add(33);
        _ArrayList.Add("String");
        _ArrayList.Add(3.14);
        _ArrayList.Add(true);
        
        //저장02
        _ArrayList.Insert(0, 33);

        //삭제 01
        _ArrayList.Remove(33);

        //삭제 02
        _ArrayList.RemoveAt(2);

        //삭제 03
        _ArrayList.Clear();

        //정보01
        _ArrayList.Contains(5);

        //정보02
        int size = _ArrayList.Count;
        
        //접근
        int value = _ArrayList[0];

    }

}

 

 

  속성 설명
Add(값) 저장
(추가)
ArrayList의 저장된 정보들 끝에 데이터(값)를 추가한다
Insert(위치, 값) 원하는 위치(index)에 데이터(값)을 추가한다
(해당 위치에 있는 값 부터 뒤에 있는 값들은 전부 1칸식 뒤로 자동 이동한다. )
Remove(값) 삭제 ArrayList에 해당 데이터(값)을 삭제한다.
RemoveAt(위치) 원하는 위치(index)의 데이터(값)을 삭제한다.
(삭제된 값 뒤에 있는 값들의 위치는 전부 1칸식 앞으로 자동 이동한다. )
Clear() ArrayList의 저장된 모든 정보들을 삭제 한다.
Contains(값) 조회

ArrayList안에 데이터(값)이 있는지 조회한다.
Count 현재 저장된 데이터(값)의 총 갯수를 조회한다.
_ArrayList[위치] 접근 해당 ArrayList의 "위치"에 있는 값에 접근한다.


추가 코드 설명

- Insert(0,33)의 경우 0번 위치에 값(33)을 넣고.

  원래 0번에 있었던 데이터는 자동으로 1번 위치로 옮겨집니다.

 

- RemoveAt(2)의 경우 2번 위치의 값을 삭제하고,

  3번에 있었던 데이터는 자동으로 2번 위치로 옮겨집니다.

 

 

부연설명

ArrayList은 컴퓨터가 어떤 데이터를 저장할지 모르기때문에 모든 데이터 타입을 담을수있는 공간을 확보합니다. 

따라서, int를 저장 하더라도 4 byte(32 bit)의 공간을 확보하는것이 아닌 더 큰 공간을 확보하기 때문에 저장공간(메모리) 손실이 생깁니다. 또한 값을 불러올 때 박싱(boxing : 추후설명)문제가 생겨 속도면에서도 떨어집니다.

 

요약 

장점 : 모든 타입을 담을 수 있다

단점 : 모든 타입을 담을 수 있기 때문에 실제로 저장할 때 메모리를 많이 차지한다.

        저장된 양이 많을 수록 값을 찾을 때 느리다.


2. Hashtable(해시 테이블)

HashTable은 다른 컬렉션들과 다르게 한 쌍(pair)의 키(Key) 와 값(Value)로 구성되어 있습니다

(사전으로 생각하면 이해하기 쉽습니다. 예) 키(key) : apple, 값(value) : 사과)

 

ArrayList(배열 리스트)와는 다르게 저장위치(index)로 값을 찾는 것이 아닌 키(key)로 값(value)를 찾습니다.

 

키(key)는 어떤 타입(int, float, string, bool 등)이든 사용이 가능합니다.

다만, 같은 키(key)가 이미 있으면 "Argument Exception 에러"가 나타나고, 사용이 불가능 합니다

 

값(value)도 ArrayList(배열 리스트)와 같이 모든 타입의 변수를 담을 수 있는 장점이 있습니다

(Object 타입 및 그와 형변환 할수 있는 모든 타입을 넣을수 있다)

 

사용코드

using System.Collections; //컬렉션 네임스페이스 선언
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour{

    void Start(){

        //생성
        Hashtable ht = new Hashtable();

        //저장
        ht.Add(6, 6);
        ht.Add(3.14f, 3.14f);
        ht.Add("string", "string");
        ht.Add(true, true);

        //접근 : ("()"괄호는 추후 설명)
        int value01 = (int)ht[6];
        float value02 = (float)ht[3.14f];
        string value03 = (string)ht["string"];
        bool value04 = (bool)ht[true];

        //삭제01
        ht.Remove(6);
        ht.Remove(3.14f);
        ht.Remove("String");
        ht.Remove(true);

        //삭제02
        ht.Clear();

        //정보01
        int size = ht.Count;

        //정보02
        bool findKey = ht.ContainsKey(6);

        //정보03
        bool findValue = ht.ContainsValue("String");

    }

}
  속성 정보
Add(키, 값) 저장
(추가)
Hashtable에 "키"와 "값"을 추가한다
Remove(키) 삭제 Hashtable에 해당 데이터("키" 와 "값")을 삭제한다.
Clear() Hashtable의 저장된 모든 정보들을 삭제 한다.
Count 정보 현재 저장된 데이터("키"와 "값")의 총 pair(쌍) 갯수를 조회한다.
CointainsKey(키) Hashtable안에 해당 "키(key)"가 있는지 조회한다.
(있으면 "true", 없으면 "false"를 반환한다)
CointainsValue(값) Hashtable안에 해당 "값(value)"가 있는지 조회한다.
(있으면 "true", 없으면 "false"를 반환한다)
ht[키] 접근 해당 Hashtable의 "키"로 저장되어 있는 "값"에 접근한다.

 

추가 코드 설명

- Count의 경우 키가 5개, 값이 5개일때 키와 값이 한쌍이기 때문에 총 크기는 5개 입니다

 

 

부연설명

Hashtable은 ArrayList와 똑같이 모든 데이터 타입을 담을 수있는 공간을 확보합니다.

또한 "키" 까지 저장해야 하기 때문에 저장공간(메모리)에 두배의 손실이 일어납니다.

그리고 박싱(boxing : 추후설명)문제가 생겨서 속도가 떨어집니다

다만, 많은 데이터를 저장할 경우 ArrayList보다 빠른 속도로 "저장된 값"에 접근이 가능합니다.

 

 

요약 

장점 : 모든 타입을 담을 수 있다[키(key)와 값(value) 모두].

        많은 데이터를 저장할경우 속도가 Arraylist보다 빠르다

단점 : 키(key)와 값(value) 모두 저장 해야하기 때문에 많은 저장공간을 사용한다.

 

 

용도

- 전자사전

 


3. Queue(큐)

Queue(큐)의 경우 FIFO(First-In First-Out : 선입선출)의 방식으로 작동 됩니다.

이 말은 가장 먼저 저장된 값을 가장 먼저 반환한다는 뜻입니다.

(은행 대기자 순번으로 이해하시면 쉽습니다)

 

Queue(큐) 또한 모든 타입의 변수를 담을 수 있는 장점이 있습니다

 

사용코드

using System.Collections; //컬렉션 네임스페이스 선언
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour{

    void Start(){

    	//생성
        Queue _Queue = new Queue();

        //저장
        _Queue.Enqueue(5);
        _Queue.Enqueue("string");

        //꺼내오기
        _Queue.Dequeue();

        //삭제
        _Queue.Clear();

        //정보01
        int size = _Queue.Count;
        
        //정보02
        bool isContain = _Queue.Contains(5);
		
        //접근
        _Queue.Peek();

    }

}

 

  속성 정보
Enqueue(값) 저장
(추가)
Queue의 저장된 정보들 끝에 데이터(값)를 추가한다
Dequeue() 꺼내오기
(불러오기, 삭제)
맨 앞에 있는 데이터(값)을 꺼내오고,
Queue에서 삭제된다.
Clear() 삭제 Queue의 저장된 모든 정보들을 삭제 한다.
Count 정보 현재 저장된 데이터(값)의 총 갯수를 조회한다
Contains(값) Queue안에 해당 "값(value)"가 있는지 조회한다.
(있으면 "true", 없으면 "false"를 반환한다)
Peek() 접근 맨 앞에 있는 데이터(값)을 확인한다.

 

부연설명
Queue(큐) 또한 다른 컬랙션들과 똑같이 모든 데이터 타입을 가질 수 있기 때문에, 

저장공간 손실 및  박싱(boxing : 추후설명)문제가 있습니다. 

 

요약 

장점 : 모든 타입을 담을 수 있다. 

단점 : 맨 앞 저장된 값 말고는 다른 정보(값)들에 접근이 불가능 하다.

 

용도

- 은행 대기자 순번

- 롤의 매칭 시스템

 


4. Stack(스택)

Stack(스택)의 경우 LIFO(Last-In First-Out : 후입선출)의 방식으로 작동 됩니다.

이 말은 가장 나중에 저장된 값을 가장 먼저 반환한다는 뜻입니다.

(권총 탄창 장전하는 것 으로 이해하시면 쉽습니다)

 

Stack(스택) 또한 모든 타입의 변수를 담을 수 있는 장점이 있습니다

 

사용코드

using System.Collections; //컬렉션 네임스페이스 선언
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour{

    void Start(){

    	//생성
        Stack _Stack = new Stack();

        //저장
        _Stack.Push(5);
        _Stack.Push("string");

        //꺼내오기
        _Stack.Pop();

        //삭제
        _Stack.Clear();

        //정보01
        int size = _Stack.Count;
        
        //정보02
        bool isContain = _Stack.Contains(5);
		
        //접근
        _Queue.Peek();

    }

}

 

  속성 정보
Push(값) 저장
(추가)
Stack의 저장된 정보들 끝에 데이터(값)를 추가한다
Pop() 꺼내오기
(불러오기, 삭제)
맨 뒤에 있는 데이터(값)을 꺼내오고,
Stack에서 삭제된다.
Clear() 삭제 Stack의 저장된 모든 정보들을 삭제 한다.
Count 정보 현재 저장된 데이터(값)의 총 갯수를 조회한다
Contains(값) Stack안에 해당 "값(value)"가 있는지 조회한다.
(있으면 "true", 없으면 "false"를 반환한다)
Peek() 접근 맨 앞에 있는 데이터(값)을 확인한다.

 

부연설명 
Stack(스택) 또한 다른 컬랙션들과 똑같이 모든 데이터 타입을 가질 수 있기 때문에, 

저장공간 손실 및  박싱(boxing : 추후설명)문제가 있습니다. 

 

요약 

장점 : 모든 타입을 담을 수 있다. 

단점 : 맨 뒤에 저장된 값 말고는 다른 정보(값)들에 접근이 불가능 하다.

 

용도

 - 돼지 저금통

 - 권총에 탄창

 


투명나비의 후기

 

몇일 동안 미루다가 드디어 끝을 봤습니다. 

 

코딩을 공부한지는 오래 되었는데, 그냥 이런게 있구나로 넘어간 내용들을 설명 할려니

 

더욱 자세히 공부하고, 생활에서 볼 수 있는 예제들을 떠올릴려고 하다가 시간이 너무 걸린 것 같네요.

 

그래도 좋은 예제들과(제 머릿속에 잘들어오는) 조금 더 깊이 공부한 생각이 들어 나름 유익했네요

 

인터넷에서 여러 자료를 참고해서 제 입맛 데로 만들었기 때문에, 누락된 부분이나, 간략하게 설명한 부분도 있습니다.

 

만약 틀린 부분이나 추가해야 하는 부분이 있으면 알려주셨으면 좋겠습니다.

 


참고

https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/concepts/collections#BKMK_Collections

https://m.blog.naver.com/PostView.nhn?blogId=justkukaro&logNo=220510730704&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

05-자료구조: 큐(Queue)

[[목차]]1.큐 란? What is Queue?2.큐의 용도3.큐의 시간 복잡도4.큐의 구현 in C5.큐의 구현 in C++6....

blog.naver.com

https://mrw0119.tistory.com/16

 

<c# 강의=""> 2장. 컬렉션 (Collection) - ArrayList, Queue, Stack, Hashtable</c#>

1. 컬렉션(Collection)? 컬렉션(Collection)은 간단히 말해 데이터 모음(자료구조) 이다. 즉, 우리가 잘 아는 배열이나 스택, 큐 등을 C#에서 컬렉션이라는 이름으로 제공하는 것이다. C#의 컬렉션을 사용하기 위..

mrw0119.tistory.com