|
컬렉션 |
작성자 : 김종현 |
|
작성일 : 2011-05-19 | |
|
주 제 : C# 컬렉션 Study | |
◎ 컬렉션 클래스
- 데이터의 저장과 검색을 위해 특화된 클래스를 의미한다.
- 해쉬 테이블, 스택, 사전, List 등이 있다.
- 대부분 공통적인 인터페이스를 구현함으로써 일관적인 방법으로 사용할 수 있다.
- 상속을 통해 특수화된 컬렉션 클래스를 구현하는 것이 가능하다.
- 제네릭 컬렉션 클래스도 제공함으로써, 값 형식 보관 시에 발생하는 오버헤드를 줄여서 성능 개선을 할 수 있다.
◎ 컬렉션 클래스의 종류
|
이 름 |
기 능 |
|
Array |
배열의 기본 클래스. 시스템과 컴파일러만 명시적으로 파생할 수 있다. 배열을 관리함에 있어서 강력한 기능들을 제공하고 있다. |
|
ArrayList List |
컨테이너 용량을 필요에 따라 자동으로 확장을 하는 클래스로 확장된 배열이라 할 수 있다. |
|
Hashtable Dictionary |
컬렉션의 요소로 키와 값을 쌍으로 받아 빠른 검색을 보장해준다. |
|
SortedList SortedDictionary |
콜렉션 내의 요소들을 키 순으로 정렬된 상태를 유지한다. |
|
Queue |
선입선출 방식으로 요소를 보관한다. |
|
Stack |
후입선출 방식으로 요소를 보관한다. |
|
HashSet |
합집합, 교집합, 차집합 등의 작업을 할 수 있다. |
◎ 컬렉션 사용 예제
- Sort의 사용 예제.
|
class Program { static void Main(string[] args) { int[] arr = new int[10]; Random rand = new Random(); for (int i = 0; i < arr.Length; i++) { arr[i] = rand.Next(100); } Console.WriteLine("정렬 전"); foreach (int i in arr) { Console.WriteLine(i.ToString()); } Console.WriteLine("총 : {0} 개", arr.Length); Array.Sort(arr); Console.WriteLine("\n\n정렬 후"); foreach (int i in arr) { Console.WriteLine(i.ToString()); } Console.WriteLine("총 : {0} 개", arr.Length); } } |
|
|
|
Array 클래스의 정적 메서드인 sort의 사용 방법과 sort를 이용해서 정렬하기 전과 정렬 이후의 차이를 나타낸 결과이다. 주의해야 할 점은 모든 배열이 sort로 정렬이 가능한 것은 아니다. 배열의 요소가 IComparable한 인터페이스에 대한 구현이 이루어진 경우에 한에서만 sort 메서드가 사용가능하다. 기본형식의 경우는 IComparable로 구현이 되어 있다. |
- 제공하는 인터페이스들의 구현약속.
|
class Stu : IComparable { int num; string name; public string Name { get { return name; } } public Stu(int _num, string _name) { num = _num; name = _name; } public override string ToString() { return string.Format("번호 : {0} 이름 : {1}", num, name); } } |
|
IComparable을 상속 받는 클래스 Stu를 만들어준다. 이름과 번호 필드를 만들어 주고 이름을 받을 수 있게 속성을 하나 만들어 준다. 생성자로 초기화하는 것을 잊지 않도록 한다. ToString을 재정의해서 화면에 어떻게 출력되게 할지 정한다. IComparable을 상속 받지 않으면 예외가 발생하기 때문에 상속을 받도록 한다. |
|
int IComparable.CompareTo(object obj) { Stu s = obj as Stu; if (s == null) { throw new Exception("입력 인자로 Stu 형식의 개체 인스턴스가 오지 않았습니다."); |
|
} return num - s.num; }
|
|
Stu 클래스에 IComparable 인터페이스를 명시적으로 구현한다. 이렇게 하면 번호순으로 정렬이 된다. 이름 순으로 정렬하고 싶다면 Helper Class를 만들어서 구현한다. |
|
class Helper : IComparer { int IComparer.Compare(object x, object y) { Stu s1 = x as Stu; Stu s2 = y as Stu; if ((s1 == null) || (s2 == null)) { throw new Exception("입력 인자로 Stu 형식의 개체 인스턴스가 오지 않았습니다."); } return s1.Name.CompareTo(s2.Name); } } |
|
IComparer를 구현약속 하고, 명시적으로 구현을 해준다. 2개의 인자가 전부 Stu 형식이 맞는지 as 연산자를 이용해서 확인한다. 2개의 인자가 전부 null이 아닐 경우에만 비교를 하도록 만들어 준다. |
|
|
|
Sort를 이용해서 번호순과 이름순으로 정렬한 결과의 모습이다. |
- ArrayList의 사용 예제.
|
class Program { static void Main(string[] args) { ArrayList arr = new ArrayList(); arr.Add(1); arr.Add(9); arr.Add(3); arr.Add(5); arr.Add(7); Console.WriteLine("입력순서대로 정렬"); foreach (int i in arr) { Console.WriteLine(i.ToString()); } arr.Sort(); Console.WriteLine("순차적으로 정렬"); foreach (int i in arr) { Console.WriteLine(i.ToString()); } Console.WriteLine("특정 숫자를 제거"); arr.Remove(7); foreach (int i in arr) { Console.WriteLine(i.ToString()); } Console.WriteLine("역방향으로 정렬"); arr.Reverse(); foreach (int i in arr) { Console.WriteLine(i.ToString()); } int j; Console.WriteLine("숫자를 입력하세요"); Console.WriteLine("숫자검색하기"); j = int.Parse(Console.ReadLine()); if (arr.Contains(j) == true) { Console.WriteLine("있어"); } else { Console.WriteLine("없어"); } } } |
|
ArrayList에는 다양한 멤버들을 제공하고 있다. 다양하게 활용해 보도록 하자. ArrayList는 기본적으로 입력된 순서대로 정렬되게 된다. Sort(), Reverse(), Remove(), Contain() 등을 이용해서 정렬을 다양하게 활용하고, 삭제, 검색 등을 할 수 있다. |
|
|
|
다양한 정렬의 활용, 제거, 검색의 ArrayList의 멤버를 활용한 결과다. |
- Boxing, Unboxing으로 생기는 오버헤드를 줄이기 위한 제네릭 컬레션 사용 예제
|
ArrayList arr = new ArrayList(); → List<int> arr = new List<int>(); |
|
ArrayList를 List<int>와 같은 형식으로 바꿔주면 된다.사용 방법은 모두 동일하다. 성능이 요구되는 프로그램 제작 시에는 Generic Collection을 사용하는 것이 좋다. |