상세 컨텐츠

본문 제목

[C#] 컬렉션 Collection

C#

by 메타샤워 2023. 7. 25. 12:58

본문

1. 컬렉션(Collection)?

 

 

컬렉션(Collection)은 간단히 말해 데이터 모음(자료구조) 이다.

즉, 우리가 잘 아는 배열이나 스택, 큐 등을 C#에서 컬렉션이라는 이름으로 제공하는 것이다.

 

C#의 컬렉션을 사용하기 위해서는 우선 컬렉션 네임스페이스 사용을 선언해야 한다.

Ex)    using System.Collections;

이렇게 컬렉션 네임스페이스 사용을 선언한 후에는 원하는 컬렉션을 생성하여 사용할 수 있다.

C#에서 제공하는 대표적인 컬렉션은 ArrayList, Queue, Stack, Hashtable 등이 있으며,

간단히 살펴보면 다음과 같다.

 

 

2. ArrayList

 

ArrayList는 배열과 비슷한 컬렉션이다.

배열처럼 [] 인덱스로 컬렉션 요소에 접근이 가능하고, 특정 요소를 바로 읽고 쓸수 있다.

하지만 배열이 배열을 선언할때 배열 크기를 지정해야 하는 것과 달리 

ArrayList는 크기 지정없이 요소의 추가,삭제에 따라 자동으로 크기를 늘였다 줄였다 한다.

또한 ArrayList 컬렉션 하나로 모든 타입의 변수를 담을 수 있다는 장점이 있다.

( ArrayList뿐만 아니라 C#에서 제공하는 모든 컬렉션은 모든 타입의 변수를 담을 수 있다.

컬렉션 요소는 어떤 타입이든지 object 타입으로 저장되기 때문이다.)

 

ArrayList에서 주로 사용하는 함수들은 Add(), Insert(), Remove(), RemoveAt() 등이다.

Add()와 Insert()는 데이터를 추가해주는 함수인데,

Add()는 리스트의 마지막 요소 다음으로 데이터를 추가하는 것이고,

Insert( index, data )는 원하는 index 위치에 data를 삽입하는 것이다.

Remove와 RemoveAt은 데이터를 제거하는 함수로,

Remove( data )는 매개변수로 전달된 data를 찾아서 제거하고,

RemoveAt( index )는 리스트의 해당 인덱스를 찾아 제거한다.

 

 

3. Queue

 

큐는 선입선출(FIFO)의 자료구조다. 선입선출이란 데이터들이 입력되어 차례차례 줄을 서면 

먼저 들어온 데이터(선입)가 먼저 출력되는 방식(선출)을 말한다.

(큐에서의 데이터 입력을 Enqueue라고 하며 데이터 출력을 Dequeue라고 한다.)

큐는 ArrayList처럼 원하는 위치에 데이터를 입,출력하는 것이 불가능하고,

오직 출력은 큐의 앞에서, 입력은 큐의 뒤에서만 가능하다.

 

 

 

 

 

4. Stack

 

스택은 큐와 반대로 후입선출(LIFO)의 자료구조이다.

후입선출은 나중에 들어온 데이터가 먼저 출력되는 구조로 

뒤로 입력되고 앞으로 출력되는 큐와 달리, 스택은 뒤로 입력되고 뒤로 출력된다.

( Stack은 데이터 입력을 Push라고 하고, 데이터 출력을 Pop이라 한다. )

 

 

 

 

 

5. Hashtable

 

 

해쉬테이블은 키(Key)와 값(Value)을 가진 데이터를 저장하는 자료구조이다.

 

해쉬테이블은 마치 영한사전 프로그램에서 

'Apple'이라는 단어를 치면 '사과'라는 뜻이 출력되는 것과 같다.

Ex) Apple -> 사과,    Banana -> 바나나,    Orange -> 오렌지

여기서 'Apple'이 키가 되고 '사과'가 값이 되는 것이다.

 

어떻게 보면 배열과 접근방식이 유사하다.

배열에서는 인덱스를 가지고 데이터에 접근하는데, 

Ex)  Arr[0] = 1; Arr[1] = 2;

해쉬테이블에서는 키를 가지고 값에 접근한다.    

Ex) Ht["Apple"] = 사과;  Ht["Orange"] = 오렌지

그리고 해싱(Hashing: 키값으로 주소를 산출하는 알고리즘)으로 데이터에 접근하기 때문에

탐색 속도가 거의 소요되지 않는 장점을 가진다. (배열에 준하는 탐색 속도)

 

이에 더해서 배열은 인덱스로 숫자만을 사용하지만, 해쉬테이블은 키값으로 

어떤 타입(int, float, string, class)이든 사용할 수 있기 때문에 상당히 활용도가 높다.

 

 

 

 

6. 컬렉션의 성능 문제

 

 

C# 컬렉션의 장점은 어떤 타입의 데이터든지 전부 담을 수 있다는 것이다.

하지만 이러한 장점에는 역시 한계가 있다. 

컬렉션은 데이터를 받으면 어떤 형식이든지 object 형식으로 박싱(Boxing)되어 저장된다.

그리고 데이터에 접근하여 사용할 때에는 원래의 데이터 형식으로 언박싱(Unboxing)이 된다.

 

※ 박싱(Boxing)과 언박싱(Unboxing)

 

박싱이란 간단히 말해 값형식을 참조형식으로 바꾸는 것을 말한다.

박싱은 내부적으로 보면 메모리의 스택영역에서 힙영역으로 데이터가 복사되고,

 

그 복사된 데이터를 object 가 참조하게 한다. ( 값형식 -> 참조형식 )

 

그리고 언박싱이 되면 반대로 데이터를 힙영역에서 스택영역으로 복사한다.

 

( 참조형식 -> 값형식 )

 

 

결국 컬렉션에 데이터의 입, 출력이 있으면, 그때마다 박싱과 언박싱이 계속해서 발생하게되고,

데이터가 많아질수록 컴퓨터 성능에 상당한 저하가 생기게 된다.

이러한 문제때문에 컬렉션보다는 다음에 배울 일반화 컬렉션을 사용한다.

 

 

 

관련글 더보기