본문 바로가기

C# 코딩 기초

C# 기초 04 - 일반화 컬렉션(Generalization Collection)

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

 

저번 시간에는 배열(Array)의 단점을 보완한 컬렉션(Collection)을 배웠습니다.

 

컬렉션(Collection)은 한개의 컬랙션에 어떠한 데이터 타입이라도 상관 없이 저장할 수 있으며 추가, 삭제, 찾기 등이 용이했습니다. 다만, 그때문에 어떠한 데이터라도 저장할 수 있는 큰 크기의 저장공간을 확보해야 했으며, 데이터에 접근 할 때마다 "박싱문제"(추후 설명)가 생기고, 안에 들어 있는 데이터의 타입을 알지 못한다는 단점이 있었습니다.

 

이러한 단점을 어떤 타입의 데이터가 들어갈지 미리 정하는 방법으로 보완한 것이, 이번에 배울 일반화 컬렉션(Generalization Collection) 입니다.

 

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


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

 

Collections.Generic 네임스페이스에서는 List<T>, Dictionary<TKey, TValue>, Queue<T>, Stack<T> 등의 컬렉션을 제공합니다.

 

여기서 "<T>"란 일반화 컬렉션에 값으로 들어갈 데이터 타입 입니다.  

 

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

 


1. List<T>(리스트)

List<T>는 ArrayList 매우 흡사한 컬렉션 입니다. 

 

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

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

 

다른점은 사용할 데이터 타입(자료형)을 미리 지정해주어야 합니다

 

사용코드

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

public class Test : MonoBehaviour{

    void Start(){

        //생성
        List<int> _list = new List<int>();
        List<int> _list1 = new List<int>(new int[] {5, 10, 15});

	//저장01
        _list.Add(0);
        _list.Add(5);
        _list.Add(10);
        _list.Add(13);
        
        //저장02
        _list.Insert(2, 30);

        //삭제 01
        _list.Remove(5);

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

        //삭제 03
        _list.Clear();

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

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

    }

}

 

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

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


추가 코드 설명

- List<int> _list1 = new List<int>(new int[] {5, 10, 15});

  List<int> 생성시 "()"안에 new Array를 넣어서 생성과 값을 동시에 만들 수 있습니다.

 

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

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

 

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

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

 

 

부연설명

List<T>는 어떠한 데이터가 들어갈지 미리 정해두기 때문에 ArrayList와 달리 정해진 공간만 확보하기 때문에, 저장공간(메모리) 효율이 좋고, 박싱(boxing : 추후설명)문제가 없습니다. 

다만, ArrayList와는 달리 다른 데이터 타입(자료형)을 넣을 수 없습니다

어떻게 보면 ArrayList의 기능을 제한하여, 제한적인 부분에서 더욱 효율적이게 작동하게 만든 것으로 볼 수도 있습니다

 

요약 

장점 : 저장공간이 효율적이다. 

        박싱 문제가 없다.

단점 : 모든 타입을 담을 수 없다

 


2. Dictionary<TKey, TValue>(딕셔너리)

Dictonary<TKey, TValue>는 HashTable과 매우 흡사한 컬렉션 입니다.

 

HashTable(해시테이블) 처럼 한 쌍(pair)의 키(Key) 와 값(Value)로 구성되어 있습니다.

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

 

다른점 List<t>(리스트) 처럼 사용할 데이터 타입(자료형)을 미리 지정해주어야 합니다

 

사용코드

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

public class Test : MonoBehaviour{

    void Start(){
    
    	//생성
        Dictionary<int, string> _dic = new Dictionary<int, string>();
        Dictionary<int, string> _dic1 = 
        	new Dictionary<int, string>() { {0,"Apple"}, {1,"Banana"} };
            
        //저장
    	_dic.Add(0, "Apple");
    	_dic.Add(1, "Banana");
        
    	//접근
    	string value01 = _dic[0];
    	string value02 = _dic[1];

    	//삭제01
    	_dic.Remove(0);
    	
    	//삭제02
    	_dic.Clear();

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

    	//정보02
    	bool findKey = _dic.ContainsKey(1);

    	//정보03
    	bool findValue = _dic.ContainsValue("Apple");

    }

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

 

추가 코드 설명

- Dictionary<int, string> _dic1 =  new Dictionary<int, string>() { {0,"Apple"}, {1,"Banana"} };

  Dictionary<int, string> 생성시 "()"안에 new Array를 넣어서 생성과, 값을 동시에 만들 수 있습니다.

 

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

 

 

부연설명

Dictionary<Tkey, Tvalue>는 "키"와 "값"에 어떠한 데이터가 들어갈지 미리 정해두기 때문에 Hashtable와 달리 정해진 공간만 확보하기 때문에, 저장공간(메모리)  효율이 좋고, 박싱(boxing : 추후설명)문제가 없습니다 

다만, Hashtable와는 달리 다른 데이터 타입(자료형)의 "키"와 "값"을 사용 할수 없습니다

어떻게 보면 Hashtable의 기능을 제한하여, 제한적인 부분에서 더욱 효율적이게 작동하게 만든 것으로 볼 수도 있습니다

또한, 많은 데이터를 저장할 경우 List<T>보다 빠른 속도로 "저장된 값"에 접근이 가능합니다.

 

 

요약 

장점 : 저장공간이 효율적이다. 

        박싱 문제가 없다.

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

단점 : 모든 타입을 담을 수 없다

 

 

용도

- 전자사전

 


3. Queue<T>(큐)

Queue<T>(큐)의 경우 Queue와 매우 흡사한 컬렉션입니다

 

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

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

 

다른 점은 미리 데이터 타입(자료형)을 지정해주어야 합니다

 

사용코드

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

public class Test : MonoBehaviour{

    void Start(){

    	//생성
        Queue<int> _Queue = new Queue<int>();

        //저장
        _Queue.Enqueue(5);
        _Queue.Enqueue(8);

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

        //삭제
        _Queue.Clear();

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

    }

}

 

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

 

부연설명
Queue<T>(큐) 또한 다른 일반화 컬랙션들과 똑같이 미리 사용할 데이터 타입(자료형)을 지정 해주어야 합니다.

또한, 컬랙션 Queue와 달리 저장공간 손실 및 박싱(boxing : 추후설명)문제가 없습니다.

 

요약 

장점 : 저장공간이 효율적이다. 

        박싱 문제가 없다.

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

 

용도

- 은행 대기자 순번

- 롤의 매칭 시스템

 


4. Stack<T>(스택)

Stack<T>(큐)의 경우 Stack 매우 흡사한 컬렉션입니다

 

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

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

 

다른 점은 미리 데이터 타입(자료형)을 지정해주어야 합니다

 

 

사용코드

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

public class Test : MonoBehaviour{

    void Start(){

    	//생성
        Stack<int> _Stack = new Stack<int>();

        //저장
        _Stack.Push(5);
        _Stack.Push(7);

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

        //삭제
        _Stack.Clear();

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

    }

}

 

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

 

부연설명 

Stack<T>(큐) 또한 다른 일반화 컬랙션들과 똑같이 미리 사용할 데이터 타입(자료형)을 지정 해주어야 합니다.

또한, 컬랙션 Stack와 달리 저장공간 손실 및 박싱(boxing : 추후설명)문제가 없습니다.

 

요약 

장점 : 저장공간이 효율적이다. 

        박싱 문제가 없다.

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

 

용도

 - 돼지 저금통

 - 권총에 탄창

 


투명나비의 후기

 

이번 "일반화 컬랙션"은 "기본 컬랙션"과 다른 게 <T> 데이터 타입(자료형)을 지정 해주는 거 밖에 없어서,

 

생각보다 빨리 끝냈습니다.

 

이렇게 또 하나 끝냈습니다.ㅎㅎ

 

제가 궁극 적으로 생각하는 목표에 한발자국 다가갈 수 있어서 매우 기분이 좋네요ㅎㅎ

 

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

 

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


참고 

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

 

컬렉션(C#)

컬렉션(C#)Collections (C#) 이 문서의 내용 --> 대부분의 애플리케이션의 경우 관련 개체의 그룹을 만들고 관리하려고 합니다.For many applications, you want to create and manage groups of related objects. 개체를 그룹화하는 방법에는 개체 배열을 만들거나 개체 컬렉션을 만드는 두 가지가 있습니다.There are two ways to group objects: by creating

docs.microsoft.com